2014-10-09 80 views
2

我想生成一個NetLogo模型來模擬木質燃料的競爭。該模型由兩種烏龜品種組成:在世界上隨機分佈的「家庭」和「樹木」。家庭擁有[燃料儲存目標半徑]。當燃料店= 0,戶「發現」最小半徑1中的新樹,1半徑的增加,如果沒有樹,直至達到最大半徑,使用以下步驟:共享海龜自己的變量的NetLogo測試

to FindFuelGo 
    ask households [ 
    if fuel-store = 0 [ 
     set target min-one-of trees in-radius radius [ distance myself ] 
     if not any? trees in-radius radius [ 
     if radius != max-radius [ 
      set radius radius + 1 
     ] 
    ] 

然而,由於這個模型是模擬競爭,我如何測試一個家庭是否與另一個家庭共享相同的目標(這將不可避免地會像模型運行一樣),並且如果它確實將目標分配給哪個家庭與目標距離最短的家庭?我曾嘗試過:

ask households [ 
let me self 
let others other households 
if target != nobody [ 
    if [ target ] of me = [ target ] of others [ 

首先至少識別具有相同變量的任何家庭,但這是行不通的。任何想法將不勝感激。

回答

1

[target] of me正在返回一個值(您可以在此僅使用target),而[target] of others正在返回值列表。這裏有一些方法,我認爲會的工作:

ask households [ 
    let target1 target 
    ask other households [ 
    if target = target1 [ 
     ... 
    ] 
    ] 
] 

if比較比較其他家庭與target1,可呈現的是,在做了詢問家庭的目標target。你也可以這樣來做:

ask households [ 
    ask other households [ 
    if target = [target] of myself [ 
     ... 
    ] 
    ] 
] 

同樣,if後的第一target指問家庭的targetmyself指的是要求的家庭,所以[target] of myself指的是前一個例子中提到的target1。 (如果你用self代替myself,它會提及被問及的家庭。)

另一種方法是讓樹存儲任何目標家庭的標識。例如,如果樹有一個targetted變量,總是提到一個家庭多數民衆贊成靶向樹,你可以做這樣的事情:

ask households [ 
    if target != nobody [ 
    if ([targetted] of target != self) [ 
     ... 
    ] 
    ] 
] 

self也可以通過me被取代,如果您添加let me self如在原始例如)。我不確定這是否符合你的要求,但如果不符合,你將能夠弄清楚如何修改它。

與問題中的原始公式相關的另一個提示。

if target != nobody and [targetted] of target != self [ 
    ... 
] 

and後,測試將無法進行評估,除非and前一句是:你也可以將其替換在我的最後一個例子中的兩個if秒。

+0

很好的答案謝謝!我用你的第二個建議來創建一個目標變量,它應該允許我比較家庭和目標之間的距離,樹和目標的距離。 – 2014-10-10 09:35:01