以对称方式为邻居分配邻居

时间:2014-08-15 18:59:08

标签: netlogo

我的海龟拥有一个名为朋友的列表作为变量之一。现在对于每只乌龟,我想随机分配$ x $朋友。但我面临的问题如下

如果$ a $是$ b $的朋友,则自动$ b $将成为$ a $的朋友。但我无法做到。 有人可以帮我创建一个列表朋友。

以下是我尝试的方式。

to setup-agent-friends
 ask turtles [
 set friends []
 repeat x [
  set temp random q  ; q is total number of agents 
  set friends lput [who] of turtle q  
           ]
  end

如何消除列表中重复的朋友? 如何保持朋友的对称性,即如果x是y的朋友,则y是x的朋友。

注意:每个代理商都有正好$ x $的邻居。

谢谢

1 个答案:

答案 0 :(得分:2)

在这种情况下,链接似乎比列表更好。如果你这样做

to setup-agent-friends
  ask turtles [
    let friends-needed x - count my-links
    let turtles-needing-friends other turtles with [ count my-links < x ]
    let available-turtles turtles-needing-friends with [ not member? self [ link-neighbors ] of myself ]
    create-links-with n-of friends-needed available-turtles
  ]
end

每只乌龟将与其他海龟完全相连x。由于链接的对称性,让它成为x朋友是有点棘手的:当乌龟试图交朋友时,他们可能已经是一些乌龟的朋友,他们不应该尝试结交朋友任何已经有足够朋友的海龟。

let friends-needed x - count my-links计算出他们需要多少朋友。

let turtles-needing-friends other turtles with [ count my-links < x ]让所有其他海龟仍然可以结交新朋友。

let available-turtles turtles-needing-friends with [ not member? self [ link-neighbors ] of myself ]摆脱了当前乌龟已经与之相关的那些乌龟。

create-links-with n-of friends-needed available-turtles抓住这些海龟的friends-needed并与它们建立联系。

NetLogo支持使用链接。有a lot of primitives that help you work with them。它们会自动为您提供所需的对称性。他们还帮助您形象化友谊。如果您不想看到友谊,可以ask links [ hide-link ]隐藏它们。

更新

正如评论中所指出的,有时候这段代码会引发运行时错误,而一些海龟最终会得到少于正确数量的朋友。这是我在发布之前没有测试我的代码所得到的......那就是说,这是一个有趣的问题。

假设我们有100只海龟,并希望每只海龟都有2个朋友。在为前99只海龟分配朋友的同时,他们没有机会连接到第100只。因此,第100只乌龟将需要两个朋友,但所有其他乌龟已经拥有他们需要的所有朋友。或者,前98只龟可能根本不连接到最后2只龟。然后,最后2个将相互连接,但每个需要另外1个朋友。像这样的情况越来越可能是所需数量的朋友越多。

事实证明,解决这个问题实际上非常棘手。问题在于,最简单的解决方案会偏向朋友选择过程,因此您更有可能看到某些朋友的分配(尽管当前的策略可能都是如此;我不是正面的)。无论如何,绝对最简单的策略不会让事情产生偏见,只是简单地抛弃网络并在遇到问题时重新开始。这是代码:

to setup-agent-friends
  while [ any? turtles with [ count my-links != x ] ] [
    clear-links
    ask turtles [
      let friends-needed x - count my-links
      let turtles-needing-friends other turtles with [ count my-links < x ]
      let available-turtles turtles-needing-friends with [ not member? self [ link-neighbors ] of myself ]
      if count available-turtles >= friends-needed [
        create-links-with n-of friends-needed available-turtles
      ]
    ]
  ]
end

您可以在此处详细了解此问题的通用版本:http://mathinsight.org/generating_networks_desired_degree_distribution