列出链接乌龟之间的所有潜在路径

时间:2014-12-15 12:26:23

标签: netlogo

是否有一种简单的方法可以使用NW扩展生成一对链接乌龟之间没有循环(不仅仅是使用路径最短的路径)的所有可能路径?

2 个答案:

答案 0 :(得分:0)

既然这个问题再次公开,我只是将我的评论作为答案重新发布:

对于无向网络,如果网络中的任何地方存在任何环路,则两个海龟之间存在无限数量的路径。因此,我假设你的意思是“不包含循环的海龟之间的所有路径”。

NW扩展并不支持我害怕。它将为您提供所有最短路径(每次调用路径时随机选择一个)。非最短路径在计算上非常难以找到(或者更确切地说,发现所有这些路径都很紧张,因为它们很多)并且通常不是非常有用。请随意申请此功能:https://github.com/NetLogo/NW-Extension/issues/new

请注意,查找单个随机非最短路径非常容易,尤其是在您不介意循环的情况下:只需走网络,每次都选择随机链接,直到您到达目的地。要消除循环,请确保您尚未访问该节点。那就是:

to-report random-path-to [ target ]
  let path (list self)
  while [ last path != target ] [
    set path lput [one-of link-neighbors] of (last path) path
  ]
  report path
end

没有循环:

to-report random-path-to [ target ]
  let path (list self)
  while [ last path != target ] [
    set path lput [one-of link-neighbors with [ not member? self path ] ] of (last path) path
  ]
  report path
end

我没有测试其中任何一个,但它们至少应该指向正确的方向。此外,它们应该进行修改,以考虑到海龟没有连接的情况。

答案 1 :(得分:0)

我还没有完全认识到这一点,但它部分正确,我希望它可以激发一个解决方案。想象一下,您正在尝试查找nodeA和nodeB之间的所有路径。您可以做的是遍历所有可能的nodeC(即,所有不是A或B的节点)并找到nodeA和nodeC之间以及nodeC和nodeB之间的最短路径。然后A和B之间的路径是两条路径的组合。然后你必须抛弃回溯的路径,但我认为如果任何节点(除了C)出现在两个部分中,就可以通过拒绝建议的路径来完成。还有一些副本需要被抛出,并且还有其他路径,例如,A和C之间的最短路径,然后是C和D,然后是D和B.