这是对NetLogo Efficient way to create fixed number of links的跟进问题。专注于避免嵌套的“询问”之后,我现在有了这段代码。它效率更高,但是创建了太多链接。显然是逻辑错误,但我看不到。

globals
[ candidates
  friends
]

to setup
  clear-all
  set friends 2
  create-turtles 5000
  set candidates turtles
  make-network
end

to make-network
  ask turtles
  [ let new-links friends - count my-links
    if new-links > 0
    [ let chosen n-of min (list new-links count other candidates) other candidates
      create-links-with chosen [ hide-link ]
      set candidates other candidates
      ask chosen [ if my-links = friends [ set candidates other candidates ] ]
    ]
  ]
end

最佳答案

不错的解决方案!请注意,other candidates实际上是iterates through every agent in the agentset,因此它在许多代理程序下仍然会变慢,但比在your other question中要慢,因为它没有那些代理程序来运行代码。它的运行速度给我留下了深刻的印象!

到了错误。在这一部分:
if my-links = friends [ set candidates other candidates ]
我认为您忘记了count前面的my-links

该代码最终仍可以由某些代理使用,但它们的数量少于friends,因为世界可能在到达候选者之前就已不在候选者之列。不知道您对此有多关心。您只需清除链接,然后重试,直到获得正确的号码为止。只要friends很小,那应该没关系。

请注意,您可以通过将set candidates other candidates放在开头来加快代码的速度,如下所示:

set candidates other candidates
if new-links > 0
[ let chosen n-of min (list new-links count candidates) candidates
  create-links-with chosen [ hide-link ]
  ask chosen [ if my-links = friends [ set candidates other candidates ] ]
]

这样,您就不必多次计算other candidates

关于NetLogo高效地创建具有任意程度分布的网络,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33000956/

10-12 21:00