1

私は NetLogo でのプログラミングがまったく初めてで、助けが必要です。これは私の 2 番目の割り当てであり、ほとんどの作業を行いました。ロボットが迷宮を歩かなければなりませんでした。ロボットは、黒いパッチ (紫のパッチは障害物を表します) の上のみを歩くことができます。ロボットは前後左右に移動し、目標に向かって進まなければなりません。ターゲットになると、停止する必要があります。割り当ての最初の部分で、15 個のランダムなパッチを選択し、ターゲットを表す 1 つの緑色のパッチを含む紫 (紫は障害物を表す) でペイントする手順「迷路」を作成する必要がありました。その手順を呼び出すたびに、別の迷路が表示されます。次の 2 点についてサポートが必要です。

  • 常に同じ迷路を与える新しい手順を作成する必要があります (常に同じ 15 個のランダムなパッチが紫で塗られます)

  • その手順を1回だけ呼び出すと、ロボットがターゲットまで歩くようにする新しい手順「検索」を作成する必要があります。ロボットは周囲を見回し、常により広いスペースのある方向に向かわなければなりません。彼の周りのすべての方向に同じ数の空きパッチがある場合、ロボットはターゲットに向かう方向をランダムに選択する必要があります。ターゲットに来たら、停止する必要があります。

これが私のコードです:

breed [robots robot]
robots-own [
target
zforward
zright
zleft]

to paint-walls  
ask patches with
[(pxcor = max-pxcor) or (pxcor = min-pxcor) or (pycor = max-pycor) or (pycor =  
min-pycor)]
[ set pcolor violet]
end

to labyrinth
ask n-of 15 patches with[ pcolor != violet ] [set pcolor violet]
ask n-of 1 patches with [pcolor != violet ] [ set pcolor green]
end

to create-agent 
set-default-shape robots "robot" 
ask patch 5 5 [ sprout-robots 1 ] 
ask robots [          
set heading 0
set color grey
set target false] 
ask robots [ask patch-here [set pcolor black ] ]        
end

to setup
clear-all
paint-walls
labyrinth
create-agent
end

to forward
ask robot 0 [if [pcolor] of patch-ahead 1 = black or [pcolor] of patch-ahead 1 = green 
[fd 1]]
check
end

to backward
ask robot 0 [if [pcolor] of patch-ahead -1 = black or [pcolor] of patch-ahead 1 = 
green[back 1 ]]
check
end

to rot-right
ask robot 0 [right 90 ]
end

to rot-left
ask robot 0 [left 90 ]
end

to right
ask robot 0[rot-right
if [pcolor] of patch-ahead 1 = black  or [pcolor] of patch-ahead 1 = green[
forward]] 
check
end

to left
ask robot 0 [rot-left
if [pcolor] of patch-ahead 1 = black or [pcolor] of patch-ahead 1 = green[
forward]]
check
end

to check-target
ask robot 0[ifelse [pcolor = green ] of patch-here
[set target true]
[set target false]]
end

to check-forward
ask robot 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 zforward 2]
[set zforward 1]]
[set zforward 0]]
end

to check-right
ask robot 0[ifelse [pcolor = black] of patch-right-and-ahead 90 1[
ifelse [pcolor = black] of patch-right-and-ahead 90 2 
[set zright 2]
[set  zright 1]]
[set  zright 0]]
end

to check-left
ask robot 0[ifelse [pcolor = black] of patch-left-and-ahead 90 1[
ifelse [pcolor = black] of patch-left-and-ahead 90 2 
[set zleft 2]
[set  zleft 1]]
[set  zleft 0]]
end

to check
check-forward
check-right
check-left
check-target
end
4

1 に答える 1

1

常に同じランダムな迷路を取得することについての部分に答えることができます。random-seedプリミティブhttp://ccl.northwestern.edu/netlogo/5.0/docs/dictionary.html#random-seedが必要です。モデル ライブラリのコード例セクションにあるランダム シードの例も参照してください。

残りについては、それを突き刺したり、非常に単純化したバージョンを試してみませんか。特定の何かに行き詰まった場合は、別の質問を投稿してください。

「非常に単純化されたバージョン」と言うのは、大きな問題全体を一度に解決しようとするのは、通常、プログラマーが物事をプログラムする方法ではないからです。代わりに、解決できる問題のより小さなバージョンを作成し、解決策を機能させるのが最善です。次に、それを少し改善して、より大きな問題のようにし、再び機能するようにします。などなど、全体の解決策にどんどん近づいています。

たとえば、「ロボットは周りを見回し、常により広いスペースのある方向に向かわなければならない」という部分から始めることができます。そのためのコード、つまりcheckプロシージャがすでにあるようです。テストしましたか?正しく動作しますか?どうして知っていますか?他の部分に進む前に、十分に理解できたと確信する必要があります。

于 2013-11-03T14:02:09.690 に答える