【问题标题】:NetLogo: Using global variables with breeds and linksNetLogo:使用带有品种和链接的全局变量
【发布时间】:2018-03-12 13:16:05
【问题描述】:

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

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

我收到一个错误(并非所有时间)“乌龟无法与自身链接”,我认为当他们覆盖第一个 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 

【问题讨论】:

    标签: netlogo


    【解决方案1】:

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

    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,是“上下文切换”:它们的一个参数是在上下文中运行的代码块([] 之间的部分)一个特定的乌龟。其他原语取决于代码运行的上下文:例如,名为 other 的原语将报告给定代理集中的所有代理,但块正在运行的上下文中的代理除外。

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

    在 NetLogo 中跟踪不同的上下文起初可能具有挑战性(self/myself 之间经常混淆就是一个例子),但一旦你掌握了它,它就会变得容易和自然。


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

    我不能按海龟编号分配

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

    ¹好吧,几乎从来没有。

    【讨论】:

    • 完美!! @nicolaspayette 完成了这项工作并将我的代码整理得非常好。感谢您提供有关上下文的提示,我确实因此而陷入简单的语法错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多