我有一个10x10节点的网格,其中所有相邻节点都链接在一起,以创建180个链接的图形 - 即:
我希望做的是创建一个会破坏这些链接的x%的过程,但重要的是这样做而不创建任何孤立的子图 - 也就是说,100个节点中的任何一个仍然可以从所有其他99个节点访问 - 即
我最初(天真地)认为我可以做以下事情:
ask n-of 45 nodes with [count my-links > 1]
[
ask one-of my-links [die]
]
然而,这并不妨碍子图从主图中孤立 - 即
另一种选择可能是反复询问单个链接是否死亡,然后检查图形总数不超过1 - 如果是,则重新创建链接并选择另一个断开。但是,(1)这似乎并不特别优雅; (2)我一直无法使用内置链接或nw程序找到计算不同图表数量的方法。
我确实认为我的部分问题是不知道这些子图/隔离/派系等的正确术语......
如果有人对如何做到这一点有任何想法(或者可以纠正我对图论理论术语的理解不足),我们将不胜感激。
答案 0 :(得分:2)
非常感谢单挑局:弱组件集群 - 我没有意识到这一点。
我现在已经实现了以下简单的递归过程,该过程将终止链接,如果该链接拆分图形,则重新创建它并重新调用该过程。这适用于我想做的事情。但请注意,如果你运行足够多次,你将最终陷入一个递归循环,因为如果没有拆分图形就没有其他链接可以中断,程序将继续调用自己。
to breakLink
let breakCandidate one-of links
let end1Candidate [end1] of breakCandidate
let end2Candidate [end2] of breakCandidate
ask breakCandidate [die]
if (length nw:weak-component-clusters > 1)
[
ask end1Candidate
[
create-link-with end2Candidate
breakLink
]
]
end
干杯
答案 1 :(得分:1)
对于您想到的解决方案,您可以使用nw
扩展程序通过检查nw:distance-to
是否返回false或数字来检查您刚断开的节点之间是否还有路径
或者,您可以计算connected components的数量。
我认为删除链接并测试连通性是一种非常合理的方法。你实现的任何算法都必须笨拙地假装链接不存在,所以可能比删除这个更复杂。
编辑:添加距离版本的代码以澄清:
to break-link
let break-candidate one-of links
let end-one [end1] of break-candidate
let end-two [end2] of break-candidate
ask break-candidate [die]
if [nw:distance-to end-two] of end-one = false [
ask end-one [ create-link-with end-two ]
break-link
]
end
不确定此版本或nw:weak-component-cluster
版本是否会更快。这可能取决于网络的规模。