如何识别与列表中至少两个成员相邻的节点?

时间:2017-12-31 11:15:30

标签: netlogo

我想查找与给定生成列表中的至少两个成员相邻的节点列表(即,具有链接)。代理人例如,生成列表包含[turtle2,turtle11,turtle9,turtle10,turtle7]。如果turtle13与turtle2和turtle9都有链接,那么它应该在返回的列表中。但是,不应返回仅包含列表中一个成员的link-neighbors节点。

以下代码设置生成列表(称为maxDegList)。但我没有任何代码(或算法)来查找所需的列表。该网络有大约14,000个节点和26,000个链接,因此效率是一个问题。但是,生成列表很小(少于20个节点)。

    to setup
      ca
      crt 60 [fd random 15]

      ask turtles with [color = red] [create-links-to other turtles with [color = blue]]
      ask turtles with [color = blue] [create-links-from other turtles with [color = yellow]]

      maxdeg
    end

    to maxdeg
      let maxDegList reverse sort-on [ count my-links ] max-n-of 4 turtles [ count my-links ]
        show-inf maxDegList "Top ten turtles using max-n-of:"
      foreach maxDegList [
        ask myself [
        ask other nw:turtles-in-radius 2 [set shape "circle"]  
      ]]
    end
    to show-inf [ turtle-list maxD ]
      print maxD
      foreach turtle-list [ t -> ask t [ show count my-links ] ]
    end

1 个答案:

答案 0 :(得分:2)

好的,这是一个完整的程序,可以帮助您入门。我已将其作为代理集而非列表完成,但如果您真的需要列表,则可以foreach而不是ask进行其他更改,逻辑将是相同的。如果您正在使用定向网络,还需要进行一些更改。

您要求的位是common-neigbors程序,它接受生成代理程序集和数字。在你的情况下,数字是2,但是以这样的方式编写它也很容易,你也可以要求不同数量的相邻节点。

我利用了生成代理集很小的事实,因此迭代发生的地方。首先,它构造生成代理集的link-neighbors的代理集(称为邻接集),因为具有至少2个作为集合成员的邻居的任何节点显然必须是该集合的邻居的成员。然后,它查看邻接集中的每个代理,并简单地计算其原始生成集中有多少网络邻居。如果该计数足够高,则将代理添加到最终报告的代理集中。

extensions [nw]

to setup
  clear-all
  nw:generate-random turtles links 40 0.1 [ set color red ]
  repeat 10 [ layout-spring turtles links 0.2 15 1 ]
  let maxDegNodes max-n-of 4 turtles [ count my-links ]
  show-inf maxDegNodes "Central turtles using max-n-of:"
  print "Relevant nodes:"
  let wanted common-neighbors maxDegNodes 2
  ask wanted
  [ set color blue
    show link-neighbors
  ]
end

to-report common-neighbors [ in-turtles min-links ]
  let adjacents nobody
  ask in-turtles [ set adjacents (turtle-set adjacents link-neighbors) ]
  let out-set nobody
  let intersection nobody
  ask adjacents
  [ set intersection link-neighbors with [ member? self in-turtles ]
    if count intersection >= min-links [ set out-set (turtle-set out-set self) ]
  ]
  report out-set
end

to show-inf [ in-turtles title ]
  print title
  ask in-turtles
  [ show count my-links
    set size 2
    set color yellow
  ]
end