Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现无权图的最短路径算法?_Python_Algorithm_Graph_Shortest Path - Fatal编程技术网

Python 如何实现无权图的最短路径算法?

Python 如何实现无权图的最短路径算法?,python,algorithm,graph,shortest-path,Python,Algorithm,Graph,Shortest Path,我试图找到一个连通的无权图中从一个顶点到另一个顶点的最短路径 在这个问题中,从一个顶点到其相邻顶点的距离将等于1。也就是说,如果考虑一个有边(a,b),(a,c)的图,从a到b和c的距离将是1,从b到c的距离将是2。 此外,将维护邻接列表以存储每个顶点的所有相邻顶点 那么,对于给定的问题,有没有找到所有最短路径的算法???你可以使用dijkstra的算法来找到距离 下面是使用networkx In [28]: import networkx as nx 创建一个带有节点a、b、c的grpah,

我试图找到一个连通的无权图中从一个顶点到另一个顶点的最短路径

在这个问题中,从一个顶点到其相邻顶点的距离将等于1。也就是说,如果考虑一个有边(a,b),(a,c)的图,从a到b和c的距离将是1,从b到c的距离将是2。 此外,将维护邻接列表以存储每个顶点的所有相邻顶点


那么,对于给定的问题,有没有找到所有最短路径的算法???

你可以使用dijkstra的算法来找到距离

下面是使用
networkx

In [28]: import networkx as nx
创建一个带有节点
a、b、c
的grpah,其中链接是
a、b
和“a、c”

In [29]: g = nx.Graph()

In [30]: g.add_edge('a', 'b')

In [31]: g.add_edge('a', 'c')
然后使用
nx.dijkstra\u path\u length()
查找
b和c之间的距离

In [32]: nx.dijkstra_path_length(g, 'b', 'c')
Out[32]: 2
In [34]: nx.shortest_path(g, source='b',target='c')
Out[34]: ['b', 'a', 'c']
此外,您还可以使用
dijkstra_path()

您还可以对
b和c之间的路径使用
shortest_path()

In [32]: nx.dijkstra_path_length(g, 'b', 'c')
Out[32]: 2
In [34]: nx.shortest_path(g, source='b',target='c')
Out[34]: ['b', 'a', 'c']

您可以使用一个函数查找所有路径,然后选择最小长度的路径

但请注意,此问题更多地基于您的搜索算法,例如BFS算法:

您可以使用返回路径生成器的:

def all_paths(graph, start, goal):
    queue = [(start, [start])]
    while queue:
        (v, path) = queue.pop(0)
        for next in graph[v] - set(path):
            if next == goal:
                yield path + [next]
            else:
                queue.append((next, path + [next])) 
len
为键,用
min
函数查找最小路径:

min_path = min(all_paths(graph, start, goal),key=len)

您可以从该点开始使用BFS:

如果时间不是问题并且您想要简单,您也可以使用运行O(n^3)的Floyd–Warshall算法:

Dijkstra算法解决“在图形中两个顶点(或节点)之间找到路径的问题,从而使其组成边的权重之和最小化”

我想你可以用Dijkstra来解决这个问题,其中一个顶点到相邻顶点的距离对于两个顶点之间的每条路径都是相等的


无论如何,您可以使用BFS

的可能副本。您可以在这里添加解决方案的一些部分,而不仅仅是一个链接吗?您的想法非常好。是的,我们可以将边缘权重设置为1,然后使用Dijkstra。我尝试过,但我使用的pyscipter中没有networkx包。安装的python版本为2.7,pyscripter版本为2.53。。它支持networkx吗?pyscripter只是一个IDE。对模块使用
pip安装networkx