netlogo で「反発」モーションをコーディングする方法を考えて、燃料が不足しています。ここにあります: 私たちは牧羊犬が羊の群れを群れにするモデルを設定しようとしています. 犬が羊の近くにいるとき(つまり、羊の「反応距離」よりも距離が短いとき)、羊は犬から逃げます。「犬との距離が応答距離よりも小さい場合、羊は犬から逃げる」この方法がわかりません。誰かがそれを手伝ってくれますか?どうもありがとう!!
2 に答える
これが完全な解決策です。説明が続きます。
breed [sheep a-sheep]
breed [dogs dog]
globals [
panic-distance
the-dog
]
to setup
clear-all
set panic-distance 10
set-default-shape sheep "sheep"
create-sheep 50 [
setxy random-xcor random-ycor
]
create-dogs 1 [
set the-dog self
]
reset-ticks
end
to go
ask the-dog [
rt random 30
lt random 30
fd 1
]
ask sheep [
if distance the-dog < panic-distance [
face the-dog
right 180
fd 1
]
]
tick
end
コメントには 2 つの重要なステートメントがあり、NetLogo コードに非常に簡単に変換できます。
犬が最も近い羊に近づき、距離がパニック距離を下回ったとき
「最も近い羊」は、アプローチ方法に関しては、おそらく少し赤いニシンです。おそらくやりたいことは、犬までの現在の距離がパニック距離よりも小さいかどうかを各羊に尋ねることです. NetLogo には、そのdistance
ためのプリミティブがあります! コードでは、次のようになります。
ask sheep [if distance the-dog < panic-distance [...]]
...
その場合に羊にしたいことでを置き換える必要があるだけです。これは、次のステートメントで説明されています。
羊は犬とは逆に行く
「犬がするのとは反対の方法」は実際には犬に向かっている可能性があるため、おそらく犬から離れるという意味だったと思います。
NetLogoにはプリミティブはありませんが、羊が犬の方を向くプリミティブがあります。あなたはそれを使用することができ、それから完全に元に戻して逃げることができます:face-away-from
face
face the-dog
right 180
そして、そこに行きます。それが核心です。残りは好きなだけ遊べます。
NetLogo を開き、 Model LibraryのShepherdsデモを見てみましょう ( [ファイル] メニューにあります)。
また、こちらからオンラインで見つけることもできます。