想象一下,我有同样品种的乌龟,它的位置如下,并被一个空的补丁分开。
1234 56 78 9 <br/>
AAAA AA AA A
生成随机位置时。假设位置2是目标,我希望位于1 2 3 4的所有代理都死亡,因为它们都应该被链接在一起。同样,如果选择位置5或6,则5和6将会死亡。
我尝试使用链接和邻居,但它们似乎不起作用。当我尝试它时,位置4和4的乌龟3是唯一想死的。
以下是我用来链接海龟的代码:
if (any? virus-on neighbors)
[set create-links-with virus-on neighbors [tie]]
下面是我用来杀死turle的代码:
ask virus-on patch in_xcor in_ycor [
ask link-neighbors [die]
die
]
答案 0 :(得分:2)
有一点可以肯定的是,你不需要在你将要杀死的海龟之间创造链接的麻烦。你的主要问题是确定哪些海龟需要死亡,这可以通过递归程序完成:你有一只需要死亡的目标海龟,但是你想让它的邻居做同样的事情(反过来,它们也是如此)问他们等等。)
由于在递归过程中杀死一只乌龟会使事情变得混乱,这个过程会变得稍微复杂一些,但是你可以通过使用一个乌龟变量来解决这个问题,该变量用作标记需要的海龟的标记。被杀,然后在最后杀死所有这些人。
以下代码应提供一个完整的示例:
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上的乌龟以及链接到它的所有乌龟。你需要根据自己的目的进行调整,但它应该足以让你去...
修改强>
稍微优雅的版本,因为它不需要turtle变量(假设相同的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