0

下のように配置され、空のパッチで区切られている同じ種類のカメがいると想像してください。

1234 56 78 9 <br/>
AAAA AA AA A  

ランダムな位置が生成されたとき。位置2がターゲットであるとすると、1 2 3 4に配置されているすべてのエージェントは、すべて一緒にリンクされているはずなので、死ぬようにします。同様に、位置5または6が選択されている場合、5と6は死にます。

リンクとネイバーを使用してみましたが、機能しないようです。私が試してみたところ、4位と3位のカメだけが死にたいと思っています。

以下は、カメをリンクするために使用したコードです。

if (any? virus-on neighbors)
[set create-links-with virus-on neighbors [tie]] 

以下は、タールを殺すために使用したコードです。

ask virus-on patch in_xcor in_ycor [
    ask link-neighbors [die]
    die
 ]
4

1 に答える 1

2

確かなことの1つは、殺そうとしているカメの間にリンクを作成する手間をかける必要がないということです。あなたの主な問題は、どのカメが死ぬ必要があるかを特定することです。これは再帰的な手順で達成できます。死ぬ必要のあるターゲットのカメがいますが、隣人に同じことをするように頼む必要があります(そして、彼らは順番に、彼らに尋ねるなど)

再帰の途中でカメを殺すと混乱するため、プロセスは少し複雑になりますが、殺す必要のあるカメをマークするためのフラグとして機能するカメ変数を使用することで、これを回避できます。そして最後にそれらすべてを殺します。

次のコードは、完全に機能する例を提供するはずです。

turtles-own [ marked-for-death ]

to setup
  clear-all
  ask patch 1 0 [ sprout 1 ]
  ask patch 2 0 [ sprout 1 ]
  ask patch 3 0 [ sprout 1 ]
  ask patch 4 0 [ sprout 1 ]
  ask patch 6 0 [ sprout 1 ]
  ask patch 7 0 [ sprout 1 ]
  ask patch 9 0 [ sprout 1 ]
end

to go
  ask turtles [ set marked-for-death false ]
  ask turtles-on patch 2 0 [ mark-for-death ]
  ask turtles with [ marked-for-death = true ] [ die ]
end

to mark-for-death
  set marked-for-death true
  ask (turtles-on neighbors) with [ marked-for-death = false ] [ mark-for-death ]
end

この例では、パッチ2 0でカメと、それにリンクされているすべてのカメを殺します。あなたはそれをあなた自身の目的のために調整する必要があるでしょう、しかしそれはあなたを動かすのに十分であるはずです...

編集:

タートル変数を必要としないため、もう少しエレガントなバージョン(同じsetup手順を想定):

to go
  let marked [ marked-for-death [] ] of turtles-on patch 2 0
  ask turtle-set marked [ die ]
end

to-report marked-for-death [ marked ]
  set marked fput self marked 
  ask (turtles-on neighbors) 
    with [ not (member? self marked) ] 
    [ set marked marked-for-death marked ]
  report marked
end
于 2012-02-26T09:30:59.260 に答える