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

NetLogo: Using global variables with breeds and links

我有一个程序可以设置许多不同品种的海龟。每个品种都需要有一只领头龟和一只随从龟。我将它们分配为全局变量,因为它们在后面的代码中经常出现。

我需要将这些变量分配给品种中的海龟,然后创建一个从领导者到追随者的 link。界面中有很多条件决定创建了多少品种和哪些品种,所以我不能按海龟编号分配。

我收到一个错误(并非所有时间)'turtle cannot link with itself',我认为这是在他们覆盖第一个 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 

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

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 来确保追随者 is/are 不同于领导者的直觉是正确的。

要了解发生了什么,您需要掌握 NetLogo 中 "context" 的概念。一些原语,如 askofcreate-turtles,是 "context switching":它们的参数之一是代码块([ 和 [=16 之间的部分=]) 运行s 在特定海龟的上下文中。其他原语取决于代码所在的上下文 运行ning:例如,名为 other 的原语将报告给定代理集中的所有代理,但块所在上下文中的代理除外是运行宁.

在您的版本中,您将大部分代码包装在为 create-flinks 提供的代码块中。这意味着代码块是 运行 一次 对于每个创建的海龟 。因此,您对 set flink-leaderset flink-followers 等的调用都是 运行 两次,每次都在不同的 turtle 上下文中。你能看出这是怎么回事吗?

一开始在 NetLogo 中跟踪不同的上下文可能具有挑战性(self/myself 之间的频繁混淆就是一个很好的例子),但是一旦你掌握了它,它应该成为轻松自然。


最后一点作为补充。你说:

i cannot assign by turtle number

好!永远不要通过海龟编号分配任何东西!它会导致脆弱的、容易出错的、更复杂的、不太通用的、unnetlogoish 代码。如果您认为您需要在代码中的任何地方使用海龟编号,请在这里提出另一个问题。有人很可能会建议更好的方法。

¹ 好吧,几乎从来没有。