2014-09-10 30 views
0

我是Netlogo環境的新手,我正在嘗試開發無線通信模型。我遇到了一個問題,我必須阻止兩個節點(海龜)之間的通信,以這種方式,如果我在兩個節點之間保持障礙(作爲具有某種顏色或類似的顏色的補丁),則發送節點應該掃描障礙並報告結束程序。我經歷了Netlogo社區中的視線模型和障礙避免模型,但它們對我幾乎沒有幫助。該節點應該掃描障礙物,而不是僅在前一個補丁的範圍內,而是在其自身和另一個節點之間的整個距離上進行掃描。任何適合這個問題的想法或原語對我都有很大的幫助。我希望我已經說得很清楚,並抱歉我的英語:)在海龜之間添加障礙

問候

回答

0

這可能不是最有效的解決方案,但假設您有以下品種:

breed [ obstacles obstacle ] 
breed [ nodes node ] 

您可以使用下面記者:

to-report can-see? [ target ] 
    let result false 
    hatch 1 [ 
    face target 
    fd 0.1 
    set result ifelse-value (any? turtles-here with [ self = target ]) 
     [ true ] 
     [ ifelse-value (any? obstacles-here) 
     [ false ] 
     [ can-see? target ] 
     ] 
    die 
    ] 
    report result 
end 

它通過hatch目標的方向荷蘭國際集團整個系列的臨時節點。如果沿途任何節點遇到障礙,則返回false。如果達到目標,則返回true。這些臨時節點是遞歸創建的,直到獲得結果。

您可能需要調整「步長」(本例中爲fd 0.1):更大的步長將更有可能錯過障礙物的角落,但速度稍快。

您還需要確保您使用的是tick based updates instead of continuous updates,否則它會很慢。

下面是創建節點之間的鏈接,可以看到對方的例子:

to setup 
    ca 
    ask n-of 100 patches [ 
    sprout-obstacles 1 [ 
     set color red 
     set shape "square" 
    ] 
    ] 
    ask n-of 50 patches with [ not any? obstacles-here ] [ 
    sprout-nodes 1 [ 
     set color yellow 
     set shape "circle" 
     let targets other nodes 
     create-links-with targets with [ can-see? myself ] 
    ] 
    ] 
end 

如果你想使用補丁,而不是龜的障礙,你可能很容易修改。

0

我在NetLogo用戶列表上發佈了這個問題的答案。轉發此處以獲得完整性:

有許多方法可能有效。

我首先想到的是模型庫中的「相交線」示例。人們可以將障礙物視爲補丁上的X行。既然如此,似乎有可能使用相同的技術來查找節點之間的線是否與障礙物上的任何線相交。

這似乎是一種很好的方法來查找所有被障礙物阻擋的網絡視線。該方法非常快速,可以通過首先找到由源節點和目標節點定義的半徑內的障礙來改進(測試!)。

以下是其他的想法。

另一種方法是派出一隻烏龜向另一個節點「走」直線路徑,發現任何障礙物。這必須小心翼翼地完成,以避免跳過與線相交的小塊角落。

另一種是使用相同的方法,但沒有烏龜,只是用數學來找到「下一個」補丁,然後沿着這條線移動。

另一種方法是使用IN-CONE以非常小的角度在節點之間獲取一組窄的補丁。可以找到從A到B的IN-CONE和從B到A的IN-CONE的交集,以縮小該集合。然後在集合上搜索障礙物或在集合上使用MIN-ONE OF和DISTANCE查找「最近」的障礙物。

另一種方法是使用幾何/數學來查找位於兩個節點之間的線上的一組修補程序,然後查找障礙物。