問題は、NetLogo 5.x で再帰的な手順を扱う単純な演習から発生するようです。このモデルは、カメが一度に 1 つのパッチを歩き回り、パッチから M&M を収集することをシミュレートします。目標は、再帰的なプロシージャ コールを使用して、M&M を見つけたタートルがさらに 2 ターン取得できるようにすることです。これは、変数を使用してターン数を追跡する非再帰的アプローチで簡単に実行できます。ただし、この場合は再帰を使用する必要があり、再帰は不可解な問題を引き起こすようです。
patches-own [MM]
turtles-own [collection]
to setup ;; observer
ca
random-seed 1234
ask patches [ set MM random 6 ]
ask patches [ set plabel-color grey - 3
set plabel MM ]
crt 10 [ set color grey
set heading (random 4 * 90)
set collection 0
set label-color yellow ]
end
to go ;; observer
ask turtles [ collect ]
if max [ MM ] of patches = 0 [ stop ]
end
to collect ;; turtles
rt (90 * random 4)
fd 1
if [ MM ] of patch-here > 0
[ set collection collection + 1
set MM MM - 1
set label collection
set plabel MM
collect
collect
]
end
このコードが正しく機能するには、タートルが M&M に遭遇するたびに、collect の 2 つのサブインスタンスを生成して実行する必要があります。これは起こっているかもしれませんが、M&M がゼロのパッチに到達するとすぐに、カメは収集を停止します。結果として、このコードは、collect が自分自身を 1 回だけ呼び出した場合と、collect が自分自身を 3 回以上呼び出した場合と同じ結果を生成します。
if
これにより、再帰呼び出しを条件の外に置くと機能するため、再帰が実行されている条件が問題を引き起こしている可能性があると私は信じています。NetLogo は何らかの形で再帰を尊重していないようです。たとえばcollect collect
、プロシージャの最後の行にデバッグ コードを挿入すると、次のようになります。
show "!"
collect
show "two"
collect
show "three"
]
show "four"
end
次にのみ!
、four
コマンドセンターに出力しますが、他のものは決して実行されません。これがこのように機能する理由についてのヘルプは役に立ちます。機能というよりはバグのようです。