1

問題は、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コマンドセンターに出力しますが、他のものは決して実行されません。これがこのように機能する理由についてのヘルプは役に立ちます。機能というよりはバグのようです。

4

1 に答える 1

0

MM のないパッチをヒットした場合、再帰呼び出しはなく、収集手順はタートルを移動して終了します。再帰呼び出しは if 句の本体内にあります。条件が false の場合、それらをスキップします。

于 2016-02-05T13:34:23.030 に答える