【问题标题】:how to create a link only if a link doesn't already exist in netlogo仅当 netlogo 中不存在链接时如何创建链接
【发布时间】:2021-09-09 15:55:13
【问题描述】:

我是 Netlogo 新手,边做边学,希望有人能帮我解决看似简单的操作:

在每个滴答声中,对于每个海龟 X,我想以一定的概率创建或加强到半径 radius 内的其他海龟 Y 的无向链接 createlinkprob。如果 X 和 Y 之间存在链接已经,我想增加该链接的多重性。 (由于 Netlogo 只允许存在一个链接,因此我需要将多重性存储在链接变量中,以指示更强的链接。)我似乎无法弄清楚如何做到这一点。

以下代码大致说明了我想要的,但不起作用。 (在 to generate-event 的内部“询问”中 对于半径内的所有海龟,我的理解是“我自己”是指调用海龟 X,而“自我”是指 Y。这部分似乎有效。我正在尝试使用 who 数字来识别链接,但那部分没有。)

感谢您提供的任何帮助!



links-own
[
  multiplicity
]


to setup
  clear-all
  make-turtles
  reset-ticks
end

to make-turtles
  create-turtles num-nodes [ set size 3 ]
  ;; layout-circle turtles max-pxcor - 1
  ask turtles [
  ;; move each turtle to a random point
  setxy random-xcor random-ycor
]
end


to go
  generate-event
  ask turtles
  [
   fd random 2
   rt -5 + random 10
  ]
  ask links
  [
    if random 100 < removelinkprob 
    [ifelse multiplicity = 1 [die] [set multiplicity multiplicity - 1]]
  ]
  tick
end


to generate-event 
  ;; at every event - one per tick - each turtle may connect to others in radius R with probability createlinkprob/100. 
  ;; If already connected, the multiplicity value is incremented.
  ;; Otherwise, the multiplicity value is set to 1 and a link is created.
  ask turtles
  [
  ask other turtles in-radius radius
    [if random 100 < createlinkprob [
      ifelse in-link-neighbor? myself 
      [
        ask link who (show [who] of myself) set multiplicity (multiplicity + 1)
      ]
      [create-link-with myself [set multiplicity 1]]]
    ]
  ]
end


; based on  http://ccl.northwestern.edu/netlogo/models/GiantComponent
; Copyright 2005 Uri Wilensky.
; Modified by Michael Frishkopf
; under Creative Commons license: https://creativecommons.org/licenses/by-nc-sa/3.0/

【问题讨论】:

  • 您应该提供minimal reproducible example。那些想要帮助您的人需要能够将您提供的代码复制并粘贴到 NetLogo 中,并有一个可以使用的功能示例;而不必围绕您提供的示例自己创建代码,而不是回答问题,而只是开始研究它。
  • 谢谢;我提供了一个我认为是最小的示例,尽管由于引用的原因它不会运行。

标签: simulation netlogo agent-based-modeling


【解决方案1】:

在您提供工作示例的编辑之后...

您的代码结构已经适合做您想做的事情。 它不起作用的唯一原因是因为两个语法问题。

  1. link 需要两个记者,即链接末端的两只海龟 (see here)。你写了link who (show [who] of myself)who 是报告乌龟的报告者,show [who] of myself 不是报告者:show 打印一个值,因此您必须删除 show 并只写 link (who) ([who] of myself)(注意这里的圆括号是可选的,并且他们的设置只是出于可读性的风格选择)。
  2. ask 需要用方括号括住命令 (see here),因此您必须在 set multiplicity (multiplicity + 1) 周围加上方括号。

这会引发对问题本身的反思。 当您在 NetLogo 中编写您提供的代码时,NetLogo 会非常准确地将您带到问题所在:它突出显示世界 show 并为您提供以下错误消息

预期的记者

您应该已经意识到这一点,并且应该定制您的问题以解决您遇到的这个问题;或者,考虑到问题的基本性质,也许更好的是,查看 NetLogo 中的记者是什么 - see here 编程指南。 ask 也是如此:在你解决了第一个语法问题后,NetLogo 会非常直接地将你带到第二个问题所在的位置,它会突出显示ask,并为你提供以下错误消息

ASK 预期 2 个输入,一个代理或代理集和一个命令块

因此检查ask 的工作原理并查看它要求命令块放在方括号中会特别容易。

请注意,这正是您应该对 Create a Minimal, Reproducible Example 执行的操作(尤其请参阅 最小可重现的部分 - 消除与问题无关的任何问题);额外的好处是,通过遵循本指南,您几乎可以肯定自己解决了这两个语法问题。

因此,请确保您在以后检查收到的错误消息,并提出与这些错误相关的问题并遵循网站的指导。

【讨论】:

  • 非常感谢您的清晰解释,并对问题的幼稚表示歉意......我试图遵循“预期的报告者”的领导,但对报告者、语法和范围感到困惑。在下次问之前,我肯定会做更多的功课。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多