2017-09-18 1 views
1

現在、特定の道を歩いている人々のためのモデルを構築しています(道路パッチ、色=白)。エージェントの動きは白いパッチでのみ制限され、黒いパッチに遭遇すると180度回転します。Netlogo:見出しを丸める方法180 180 270 360のみ

私が見つけた問題は、エージェントの見出しを設定しようとしたときでした。私は見出しが最寄の赤いパッチ(目的地)まで歩いしたいが、私は使用している場合:MIN-1-の[pcolorの=赤]とパッチに向かって

セット[自分を遠ざけます] <

エージェントはパッチから移動しません。上記のコードで生成された "見出し"は-360〜360の小数点以下の値を持つことが判明しました。私が作成した歩行手順では、90(-360、-180 ... 90,180,270,360)の倍数の見出ししか使用できません。これは私のウォーキング法の完全なコードです:

globals [ flagl flagr ] 

ask agents [ 

;reset flag 
    set flagr 0 
    set flagl 0 

; check and note if there is a path on the left or the right 
     ask patch-left-and-ahead 90 1 [if (pcolor = white) [set flagl 1]] 
     ask patch-right-and-ahead 90 1 [if (pcolor = white) [set flagr 1] 
     ] 

;in T-junction, decide to turn left or right (random) 
     if((flagl = 1) and (flagr = 1)) 
     [ 
     ifelse random 100 > 50 
     [set heading heading - 90] 
     [set heading heading + 90] 
     ] 

;if it's only applicable to turn right, then turn right 
     if((flagl = 0) and (flagr = 1)) [set heading heading + 90] 

;if it's only applicable to turn left, then turn right 
     if((flagl = 1) and (flagr = 0)) [set heading heading - 90] 

;return if there's no mor path 
     if [pcolor] of patch-at-heading-and-distance heading 1 = black [rt 180] 

;agent movement 
     **;face min-one-of patches with [pcolor = red ] [ distance myself ]** 
     fd 1 

;stopping procedure 
if [pcolor] of patch-here = red [fd 0] 
]] 

私はこのような#1によって生成された見出しを丸めることを試みた:

let direction heading towards min-one-of patches with [pcolor = red ] [ distance myself ] 
if direction != mod 90 
set direction 90 * round(arah/ 90) 

ましょう「以来、それはエラー通知を与えるしかし、 "コマンドは、そのような入力を取ることはできません。

これは私が構築されているマップのスクリーンショットです: Map

をこの問題を解決するためのすべてのヘルプは非常歓迎です。ありがとうございました!

答えて

2

これは、トリックを行うように見える最小限の確認で始めるかもしれませんが、おそらく例外をチェックしたいと思うでしょう。

cardinal-4レポーターはない場合、剰余が0に等しい場合モジュロもしそうであれば45〜に等しい/未満である場合、それがチェックされます与えられ、チェックされ、方向(dir)からその値を減算どんな入力取り。モジュロが45より大きい場合は、モジュロを方向から減算して90を加算します。

check手順は、記載された値のレポータ出力を表示するだけです。

to setup 
    ca 
    reset-ticks 
end 

to-report cardinal-4 [ heading-input ] 
    let dir heading-input 
    let remain dir mod 90 
    if remain != 0 [ 
    ifelse remain <= 45 [ 
     set dir dir - remain 
    ] 
    [ 
     set dir dir - remain + 90 
    ] 
    ] 
    report dir 
end 

編集

to check 
    let testVals [ -361 -359 -271 -269 -181 -179 -91 -89 -1 0 1 89 91 179 181 269 271 359 360 361 ] 
    print map [ i -> (word i " becomes " cardinal-4 i "\n") ] testVals 
end 
check手順を改善
関連する問題