打破网络链接而不创建孤儿?

时间:2015-01-14 06:12:35

标签: netlogo

我有一个10x10节点的网格,其中所有相邻节点都链接在一起,以创建180个链接的图形 - 即:

enter image description here

我希望做的是创建一个会破坏这些链接的x%的过程,但重要的是这样做而不创建任何孤立的子图 - 也就是说,100个节点中的任何一个仍然可以从所有其他99个节点访问 - 即

enter image description here

我最初(天真地)认为我可以做以下事情:

ask n-of 45 nodes with [count my-links > 1] 
[
    ask one-of my-links [die]
]

然而,这并不妨碍子图从主图中孤立 - 即

enter image description here

另一种选择可能是反复询问单个链接是否死亡,然后检查图形总数不超过1 - 如果是,则重新创建链接并选择另一个断开。但是,(1)这似乎并不特别优雅; (2)我一直无法使用内置链接或nw程序找到计算不同图表数量的方法。

我确实认为我的部分问题是不知道这些子图/隔离/派系等的正确术语......

如果有人对如何做到这一点有任何想法(或者可以纠正我对图论理论术语的理解不足),我们将不胜感激。

2 个答案:

答案 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版本是否会更快。这可能取决于网络的规模。