NetLogo でのプログラミングについて少し助けが必要です。ロボットが迷宮を歩かなければなりませんでした。ロボットは、黒いパッチ (紫のパッチは障害物を表します) の上のみを歩くことができます。目標またはゴールラインを表す緑色のパッチが 1 つあります。ロボットは前後左右に移動し、目標に向かって進まなければなりません。
その手順を1回だけ呼び出すと、ロボットがターゲットまで歩くようにする手順「検索」を作成する必要がありました。ロボットは周りを見回して、常により広いスペースのある方向に移動する必要があります。彼の周りのすべての方向に同じ数の空きパッチがある場合、ロボットはターゲットに向かう方向をランダムに選択する必要があります。ターゲットに来たら、停止する必要があります。
3 つの手順 (check-forward、check-left、check-right) を作成して、無料のパッチの数に関する情報と、エージェントがいつターゲットに到達したかを確認する手順 check-target を取得しました。手順「検索」を作成しましたが、機能する場合と機能しない場合があります..どこに問題があるのか わかりません。私が間違っていることを教えてください!
これは写真です: http://i.imgur.com/LPU2dmN.jpg
これが私のコードです:
breed [agents agent]
agents-own[
target // finish
num_forward //number of free patches forward
num_right //number of free patches right
num_left //number of free patches left
chance] //number of directions where there is the same number of free patches
(pick one of them randomly)
to check-target
ask agent 0[ifelse [pcolor = green] of patch-here
[set target true]
[set target false]]
end
to check-forward
ask agent 0 [ifelse [pcolor] of patch-ahead 1 = black or [pcolor] of patch-ahead 1 =
green
[ifelse [pcolor] of patch-ahead 2 = black or [pcolor] of patch-ahead 2 = green
[set num_forward 2]
[set num_forward 1]]
[set num_forward 0]]
end
to check-left
ask agent 0 [ifelse [pcolor] of patch-left-and-ahead 90 1 = black or [pcolor] of patch
left-and-ahead 90 1 = green
[ifelse [pcolor] of patch-left-and-ahead 90 2 = black or [pcolor] of patch-
left-and-ahead 90 2 = green
[set num_left 2]
[set num_left 1]]
[set num_left 0] ]
end
to check-right
ask agent 0 [ifelse [pcolor] of patch-right-and-ahead 90 1 = black or [pcolor] of
patch-right-and-ahead 90 1 = green
[ifelse [pcolor] of patch-right-and-ahead 90 2 = black or [pcolor] of patch-right-
and-ahead 90 2 = green
[set num_right 2]
[set num_right 1]]
[set num_right 0]]
end
to search
ask agent 0[
while [target = false][
if((num_forward = 2 and num_right = 2 and num_left = 2) or (num_forward = 1 and
num_right = 1 and num_left = 1))
[set chance random 3
if chance = 0 [forward] //procedure 'forward' moves by one patch forward
if chance = 1 [right] //procedure 'right' rotates 90° right and moves forward
if chance = 2 [left]] //procedure 'left' rotates 90° left and moves forward
if(num_forward > num_left and num_right > num_left and num_forward = 2 and num_right =
2) or (num_forward > num_left and num_right > num_left and num_forward = 1 and
num_right = 1)
[set chance random 2
ifelse chance = 0 [forward][right]]
if(num_forward > num_right and num_left > num_right and num_forward = 2 and num_left =
2) or (num_forward > num_right and num_left > num_right and num_forward = 1 and
num_left = 1)
[set chance random 2
ifelse chance = 0 [forward][left]]
if(num_right > num_forward and num_left > num_forward and num_right = 2 and num_left =
2) or (num_right > num_forward and num_left > num_forward and num_right = 1 and
num_left = 1)
[set chance random 2
ifelse chance = 0 [right][left]]
if(num_forward > num_right and num_forward > num_left)[forward]
if(num_right > num_left and num_right > num_forward)[right]
if(num_left > num_forward and num_left > num_right)[left]
if(num_forward = 0 and num_right = 0 and num_left = 0)[backward] //procedure
'backward' moves by
one patch back
check-target]]
end