创建具有参数节点数和平均度

时间:2017-11-10 07:41:22

标签: network-programming netlogo

我想创建一个随机网络(并且无标度),其中N个节点和<k>作为平均度。我怎么能这样做?

NetLogo NW 扩展程序的nw: generate-random(和nw:generate-preferential-attachment)方法似乎不允许处理平均节点数。

我错了?提示? 感谢。

1 个答案:

答案 0 :(得分:2)

确实,nw:generate-randomnw:generate-preferential-attachment都不允许您指定确切的平均度数。但是,在nw:generate-random的情况下,平均度数约为connection-probability * num-nodes。例如:

observer> repeat 10 [ ca nw:generate-random turtles links 1000 0.1 print 2 * count links / count turtles ]
99.902
100.358
100.522
99.674
100.338
100.272
99.772
100.24
100.24
100.412

也就是说,如果你想指定确切的平均学位,你可以使用以下内容:

to generate-random [ num-nodes avg-degree ]
  crt num-nodes
  while [ 2 * count links < avg-degree * count turtles ] [
    ask one-of turtles [
      create-link-with one-of other turtles
    ]
  ]
end

请注意,该代码故意执行create-link-with one-of other turtles with [ not link-neighbor? myself ]之类的操作,因为最终会创建更多程度更高的海龟(也就是说,平均度数会是正确的) ,但学位分布会有所偏差。)

优惠附件稍微复杂一些。我们必须播种足够的海龟,以便传入的海龟有足够的海龟来附着:

to generate-preferential-attachment [ num-nodes avg-degree ]
  crt avg-degree + 1 [
    create-links-with other turtles
  ]
  repeat (num-nodes - (avg-degree + 1)) [
    crt 1 [
      while [ 2 * count links < avg-degree * count turtles ] [
        create-link-with one-of other [ both-ends ] of one-of links
      ]
    ]
  ]
end

此代码使用与优先附件相同的机制作为模型库中的优先附件模型。从那种模式:

;; This code is the heart of the "preferential attachment" mechanism, and acts like
;; a lottery where each node gets a ticket for every connection it already has.
;; While the basic idea is the same as in the Lottery Example (in the Code Examples
;; section of the Models Library), things are made simpler here by the fact that we
;; can just use the links as if they were the "tickets": we first pick a random link,
;; and than we pick one of the two ends of that link.

在大多数情况下,我只是在我的模型中使用NW程序生成,但是当我真的需要控制精确的平均度时,我使用上面的变体。同样,它们比你预期的要复杂得多,以防止程度分布的偏差蔓延。

两个程序都假定没有预先存在的海龟。如果你的模型不是这种情况,请告诉我,我会修改。否则会使代码变得不必要(因为你必须跟踪你创建的海龟)。

编辑是评论中对问题的回应:

while [ 2 * count links < avg-degree * count turtles ] [ ... ]会导致...一遍又一遍地运行,直到平均度数等于avg-degree。回想一下,平均度等于2 * count links / count turtles

因此,在生成随机网络的情况下,我们尝试添加一个链接,检查我们是否有足够的链接,如果没有,我们会继续前进,直到我们这样做。这里使用while代替repeat的原因是因为外观的主体可能实际上没有创建链接(如果乌龟试图与已经链接的乌龟链接)。它是用这种方式编写的,以防止程度分布的偏差:乌龟的链接越多,获得新墨水的可能性就越小。

在优先附件的情况下,我们一次添加一个节点,然后添加到该节点的链接,直到我们的平均度数正确。这总是只是让乌龟进入avg-degree / 2链接,因为它在奇数度下会更好。