连续排列并由空补丁分隔的Net徽标代理必须死亡

时间:2012-02-25 16:38:06

标签: netlogo

想象一下,我有同样品种的乌龟,它的位置如下,并被一个空的补丁分开。

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
 ]

1 个答案:

答案 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