NetLogo:使用带有品种和链接的全局变量

时间:2018-03-12 13:16:05

标签: hyperlink netlogo

我有一个程序可以设置许多不同品种的海龟。每个品种都需要有一只头龟和一只跟随龟。我已将这些作为全局变量分配,因为它们在代码中进一步下降了很多。

我需要将这些变量分配给品种中的海龟,然后创建从领导者到追随者的链接。界面中有很多条件决定了创建了多少和哪些品种,因此我无法通过龟号进行分配。

我收到错误(并非所有时间)&#t; turtle无法与自己联系'我认为当他们覆盖第一个set命令并将相同的乌龟分配给两个变量时,就会发生这种情况。有没有人知道我可以放入的条件允许它每次都设置而没有错误。 (我试过if语句,is-turtle?,one-of other,other)

breed [flinks flink] ;; linked turtles that will turn away from sources

globals [ 
flink-leader
flink-followers]

to set-up
  clear-all
  setup-turtles
  reset-ticks
end

to setup-turtles
  create-flinks 2 [
  set flink-leader one-of flinks
  set flink-followers one-of other flinks
  ask flink-followers [create-link-with flink-leader]
  ask flink-followers [set color pink]
  ask flink-leader [
      setxy 10 4]
   ask flink-followers [
      setxy 19.5 4]
 ]
end

to go 
  fd 1
end 

1 个答案:

答案 0 :(得分:2)

有很多不同的方法可以解决这个问题。这是一个不会远离你提供的代码 的那个:

to setup-turtles
  create-flinks 2
  set flink-leader one-of flinks
  ask flink-leader [
    set flink-followers one-of other flinks
    setxy 10 4
  ]  
  ask flink-followers [
    create-link-with flink-leader
    setxy 19.5 4
    set color pink
  ]
end

请注意,您对使用other确保关注者与领导者不同的直觉是正确的。

要了解发生了什么,您需要掌握NetLogo中“上下文”的概念。一些原语(如askofcreate-turtles)是“上下文切换”:其中一个参数是代码块([和{{1}之间的部分}}在特定乌龟的上下文中运行 。其他原语取决于运行代码的上下文:例如,名为]的原语将报告给定代理程序集中的所有代理程序,除了正在运行该程序段的上下文中的代理程序。

在您的版本中,您将大部分代码包含在为other提供的代码块中。这意味着代码块对于创建的每个乌龟运行一次。因此,您对create-flinksset flink-leader等的调用都会运行两次,每次都在不同的乌龟环境中运行。你能看出那是怎么弄乱的吗?

在NetLogo中跟踪不同的上下文一开始可能很有挑战性(set flink-followers / self之间的频繁混淆),但是一旦你得到它,它应该变得容易,自然。

最后一点作为附录。你说:

  

我无法通过乌龟编号分配

好!永远不要用龟号分配任何东西!它导致脆弱,容易出错,更复杂,不太通用,非网络代码。如果您认为需要在代码中的任何位置使用龟号,请在此处提出另一个问题。有人最有可能建议采用更好的方法。

¹好吧,几乎永远不会。