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

How to identify nodes which are adjacent to at least two members of a list?

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

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

好的,这是一个完整的程序,可以帮助您入门。我已经将它作为代理集而不是列表来完成,但是如果你真的想要一个列表,你可以做 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