2

NetLogo で水槽スタイルのシミュレーションを作成しています。「獲物」、「捕食者」、「隠れ場所」があります。

捕食者がマップ上に現れると、獲物は個別に「隠れる」動作を実行し、最も近い「隠れ場所」に向かいます - 捕食者と「隠れ場所」の間に捕食者がいない場合。

to move-turtles
  ask prey  [
    if (any? predators)
    [
      hide
      stop
    ]

hide コマンドを実行するための関連コード。

to hide
  face min-one-of hidingspot [distance myself]  
  set d distance min-one-of hidingspot [distance myself]
  ask patches in-cone d 80
  [ set pcolor yellow
    if (any? predators-here)
    [ ask prey
      [ forward 1
        set color red 
        output-print "DANGER"]]]
    forward 1
end

問題は、「パッチを尋ねる」で if ステートメントを正しく使用する方法がわからないことです。したがって、1 つの獲物が脅威を発見すると、すべての獲物はステートメントを個別に評価するのではなく、ステートメントの else 部分を実行します。

どうすればこれを修正できますか?

どんな助けでも大歓迎です。

4

2 に答える 2

2

獲物に要求していることと、パッチに要求していることを分離する必要があります。King-Ink が言ったように、あなたはパッチにすべての獲物に何かをするように頼むように頼んでいます。

最も簡単な方法は、'danger' パッチのパッチセットを作成し、それらのパッチに捕食者がいるかどうかを確認することです。これを行うには、次のようなものが必要です (これは完全なモデルであるため、このコード全体を新しいモデルにコピーして実行できることに注意してください)。

私がクリーンアップしたあなたのコードの他のいくつかのもの。letグローバルに表示する必要がないように、ローカル変数 dに使用しました。min-one-ofそうしないと、毎回異なる隠れ場所が選択される可能性があるため(同じ距離に複数の場合)、一度だけ要求して再利用しました。今回はこれでエラーが発生することはありませんでしたが (2 番目の選択は、定義上、同じ距離を検出するためのものであるため)、良い方法です。

breed [prey a-prey]
breed [predators predator]
breed [hidingspots hidingspot]

to setup
  clear-all
  create-predators 1 [setxy random-xcor random-ycor set color red]
  create-prey 5 [setxy random-xcor random-ycor set color brown]
  create-hidingspots 20
  [ setxy random-xcor random-ycor
    hide-turtle
    ask patch-here [set pcolor green]
  ]
  reset-ticks
end

to go
  ifelse any? predators
    [ ask prey [hide] ]
    [ ask prey [swim] ]
end

to hide                                      ; turtle procedure
  let target min-one-of hidingspots [distance self]
  let path patches in-cone distance target 80
  ask path [ set pcolor yellow ]
  if any? predators-on path
  [ set color red 
    output-print "DANGER"
    face target 
  ]
  forward 1
end

to swim
end
于 2015-11-12T15:58:21.053 に答える
1

あなたはすべての獲物に隠れるように頼むように、それぞれの獲物に頼んでいます。コマンド all prey are running から ask prey を削除すると、正常に動作し、少し速くなるはずです。

to hide
   face min-one-of hidingspot [distance myself]  
   set d distance min-one-of hidingspot [distance myself]
   ask patches in-cone d 80
     [set pcolor yellow]
   if (any? predators-here)
    [ 
      forward 1
      set color red 
      output-print "DANGER"
    ] 
end
于 2015-11-12T14:44:54.633 に答える