想象一下,我有一只同品种的乌龟,它的位置像下面一样,被一块空地隔开。
1234 56 78 9 <br/>
AAAA AA AA A
当生成随机位置时。假设位置2是目标,我希望所有位于1 2 3 4的特工都死,因为他们都应该联系在一起。类似地,如果选择位置5或6,则5和6将死亡。
我尝试使用链接和邻居,但它们似乎不起作用。当我尝试的时候,4号位的乌龟;只有三个愿望会死去。
下面是我用来链接海龟的代码:
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
]
有一点是可以肯定的,那就是你不需要在即将杀死的海龟之间创建链接。你的主要问题是确定哪些海龟需要死亡,这可以通过递归程序来完成:你有一只需要死亡的目标海龟,但你希望它要求它的邻居也这样做(反过来,他们也要求他们这样做,等等)
在递归过程中杀死一只乌龟会把事情搞得一团糟,这使得这个过程稍微复杂一些,但你可以通过使用一个乌龟变量来绕过这一点,该变量作为标记需要杀死的乌龟的标志,然后在最后杀死所有这些乌龟。
以下代码应提供一个完整的工作示例:
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