排成一排并用一个空补丁隔开的网络标志代理必须死亡



想象一下,我有一只同品种的乌龟,它的位置像下面一样,被一块空地隔开。

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

最新更新