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

可以肯定的一件事是,您无需费心在要杀死的海龟之间建立联系。您的主要问题是确定哪些海龟需要死亡,这可以通过递归过程来完成:您有一个需要死亡的目标海龟,但您希望它要求它的邻居做同样的事情(而他们反过来,问他们的,等等)

这个过程稍微复杂一点,因为在递归中间杀死一只乌龟会搞砸,但你可以通过使用一个乌龟变量来解决这个问题,该变量用作标记需要被杀死的乌龟的标志,然后在最后杀死所有这些。

以下代码应提供一个完整的工作示例:

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