python 节点_python – 两个节点之间的路径

igraph,Python的另一个图形模块可以计算给定的一对节点之间的所有最短路径.计算所有的路径没有意义,因为你有无数许多这样的路径.

从顶点0计算所有最短路径的示例:

>>> from igraph import Graph

>>> g = Graph.Lattice([10, 10], circular=False)

>>> g.get_all_shortest_paths(0)

[...a list of 3669 shortest paths starting from vertex 0...]

如果您有Æ0.6或更高版本(这是编写时的开发版本),您可以将get_all_shortest_paths的结果限制在给定的端点顶点:

>>> g.get_all_shortest_paths(0, 15)

[[0, 1, 2, 3, 4, 14, 15],

[0, 1, 2, 12, 13, 14, 15],

[0, 10, 11, 12, 13, 14, 15],

[0, 1, 11, 12, 13, 14, 15],

[0, 1, 2, 3, 13, 14, 15],

[0, 1, 2, 3, 4, 5, 15]]

当然你要小心点例如,假设您有一个100 x 100的网格图(可以很容易地由Graph.Lattice([100,100],circular = False))生成.从左上方节点到右下方节点的最短路径数等于200个选择100个元素的可能性数(证明:最短路径的长度有200个边,其中100个将“水平”在网格中,其中100个将“垂直”移动).这可能不适合您的记忆,因此即使计算这两个节点之间的所有最短路径在这里也不是真的可行.

如果您真的需要两个节点之间的所有路径,您可以重写在使用igraph的网页上给出的功能,这可能比纯Python解决方案更快,因为igraph的核心是在C:

def find_all_paths(graph, start, end, path=[]):

path = path + [start]

if start == end:

return [path]

paths = []

for node in set(graph.neighbors(start)) - set(path):

paths.extend(find_all_paths(graph, node, end, path))

return paths

它可以通过将图形转换为邻接列表表达式进行优化,因为它会省去对graph.neighbors的重复调用:

def find_all_paths(graph, start, end):

def find_all_paths_aux(adjlist, start, end, path):

path = path + [start]

if start == end:

return [path]

paths = []

for node in adjlist[start] - set(path):

paths.extend(find_all_paths_aux(adjlist, node, end, path))

return paths

adjlist = [set(graph.neighbors(node)) for node in xrange(graph.vcount())]

return find_all_paths_aux(adjlist, start, end, [])

编辑:固定的第一个例子,在图片0.5.3中也工作,不仅在图书0.6.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值