2017-02-15 57 views
0

在我的模型中,我將海龜從地圖的右側移動到左側。當他們旅行時,他們正在尋找綠色的補丁。當他們發現一個並且處於他們的視野中時,他們轉過頭來朝向它。如果有多個等距離的補丁,他們隨機選擇哪一個去。然而,當他們移動時,他們的移動似乎有很多不必要的抖動。任何人都可以說出原因?看這張圖片http://imgur.com/qOftVPJ。他們應該直行直到看到綠色。如何在Netlogo中進行每次移動後更改海龜標題?

to move-bug 

    ask bugs [ 
    count-steps 
    if pxcor = min-pxcor [ 
    file-open data-filename 
    file-type data-filename 
    file-type " " 
    file-type data-header 
    file-write vision-width 
    file-write vision-distance 
    file-write greenroof-percent 
    file-write gray-steps 
    file-write green-steps 
    file-write steps 
    file-type "\n" 
    file-close 
     ] 

    if pxcor = min-pxcor [die] 

    set heading 270 
    pen-down 
    let green_target nobody 
    let perceived_patches patches in-cone vision-distance vision-width 
    set green_target perceived_patches with [ pcolor = green ] 
    ifelse count green_target > 0 [face min-one-of green_target [vision-     distance]][face min-one-of perceived_patches [vision-distance]] ;; added equivalent jitter to non-green squares 

前進1 ]

end 

回答

1

每當一個錯誤舉動,它會運行ifelse count green_target塊。 Ifelse將運行您給出的兩個命令塊中的一個,因此每次運行此過程時,該bug都會面臨綠色目標修補程序(如果綠色修補程序位於其視錐內)或感知的修補程序(如果綠色修補程序不存在,則爲綠色修補程序對錯誤可見)。因此,如果在move-bug之後調用了用於移動該錯誤的過程,則該錯誤將因爲其實際移動之前運行的行的更改而改變,因此該錯誤會抖動。你真正想要的只是如果有一個綠色的問題,bug只能面對一個補丁,因此只需使用if語句而不是ifelse。此外,您使用的

min-one-of green_target [vision-distance]

但你可能要

min-one-of green_target [distance myself]

選擇最接近的綠色補丁。我得到了下面的代碼爲我工作,警告我隨機將綠色圓圈放在我的領域(see image- bugs here move right to left)。

set heading 270 
    pd  ;; shorthand for pen-down 
    let green_target nobody 
    let perceived_patches patches in-cone vision-distance vision-width 
    set green_target perceived_patches with [ pcolor = green ] 
    print green_target 
    if count green_target > 0 [ 
    face min-one-of green_target [ distance myself ] 
    ] 

    fd 1 
+0

非常感謝! – Shane

+0

不客氣! –