如何识别与列表中至少两个成员相邻的节点?
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
我想找到与给定 '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