Python 使用scipy搜索图的示例
我很难找到关于如何在中使用和获取各种搜索算法路径的教程/示例 谷歌中出现的最常见的一个例子是,示例末尾有一些错误,并用括号括起来Python 使用scipy搜索图的示例,python,scipy,graph-theory,Python,Scipy,Graph Theory,我很难找到关于如何在中使用和获取各种搜索算法路径的教程/示例 谷歌中出现的最常见的一个例子是,示例末尾有一些错误,并用括号括起来 from scipy.sparse.csgraph import dijkstra distances, predecessors = dijkstra(graph, indices = i1, return_predecessors = True) path = [] i = i2 while i != i1: path.append(word_list[i
from scipy.sparse.csgraph import dijkstra
distances, predecessors = dijkstra(graph, indices = i1, return_predecessors = True)
path = []
i = i2
while i != i1:
path.append(word_list[i])
i = predecessors[i]
path.append(word_list[i1])
print path[::-1]i2]
我没有输入,因此无法复制它,但我认为删除i2]是可行的
我的主要问题是如何搜索计算所有索引的图形,而不是给它一个可选参数index=i1
。同样,如何使用Floyd-Warshall方法并获得从任何i,j
索引到任何其他i,j
索引的路径。我的困惑部分在于缺乏对前置矩阵的描述,以及如何解析前置矩阵
是否有更全面的教程,或者有人能给出一些简单的示例来梳理和理解吗?我将使用此无向图作为示例: 首先,我们需要表示从节点i到j的距离的矩阵:
import numpy as np
from scipy.sparse.csgraph import shortest_path
M = np.array([[ 0, 7, 9, 0, 0, 14],
[ 7, 0, 10, 15, 0, 0],
[ 9, 10, 0, 11, 0, 2],
[ 0, 15, 11, 0, 6, 0],
[ 0, 0, 0, 6, 0, 9],
[14, 0, 2, 0, 9, 0]])
现在我们打电话
D, Pr = shortest_path(M, directed=False, method='FW', return_predecessors=True)
这里,D
是最短距离矩阵,Pr
是最短距离矩阵D[i,j]
给出从节点i到节点j的最短距离,Pr[i,j]
给出从点i到点j的最短路径中前一个节点的索引。如果从节点i到节点j没有任何路径,则Pr[i,j]=-9999。使用method='FW'
我们选择Floyd-Warshall算法
最后,我们可以使用前置矩阵定义一个函数,以获得从节点i到节点j的最短路径中的节点列表:
def get_path(Pr, i, j):
path = [j]
k = j
while Pr[i, k] != -9999:
path.append(Pr[i, k])
k = Pr[i, k]
return path[::-1]
要获取从节点0到4的最短路径,请执行以下操作:
In [16]: get_path(Pr,0,4)
Out[16]: [0, 2, 5, 4]
In [17]: D[0,4]
Out[17]: 20.0
编辑:可能值得一看该软件包:
将networkx导入为nx
G=nx。从_numpy_数组(M)#M是上面的邻接矩阵
[14]中的:nx.最短路径(G,0,4,weight='weight')
输出[14]:[0,2,5,4]
[15]:nx.最短路径长度(G,0,4,weight='weight')
Out[15]:20
我将使用此无向图作为示例:
首先,我们需要表示从节点i到j的距离的矩阵:
import numpy as np
from scipy.sparse.csgraph import shortest_path
M = np.array([[ 0, 7, 9, 0, 0, 14],
[ 7, 0, 10, 15, 0, 0],
[ 9, 10, 0, 11, 0, 2],
[ 0, 15, 11, 0, 6, 0],
[ 0, 0, 0, 6, 0, 9],
[14, 0, 2, 0, 9, 0]])
现在我们打电话
D, Pr = shortest_path(M, directed=False, method='FW', return_predecessors=True)
这里,D
是最短距离矩阵,Pr
是最短距离矩阵D[i,j]
给出从节点i到节点j的最短距离,Pr[i,j]
给出从点i到点j的最短路径中前一个节点的索引。如果从节点i到节点j没有任何路径,则Pr[i,j]=-9999。使用method='FW'
我们选择Floyd-Warshall算法
最后,我们可以使用前置矩阵定义一个函数,以获得从节点i到节点j的最短路径中的节点列表:
def get_path(Pr, i, j):
path = [j]
k = j
while Pr[i, k] != -9999:
path.append(Pr[i, k])
k = Pr[i, k]
return path[::-1]
要获取从节点0到4的最短路径,请执行以下操作:
In [16]: get_path(Pr,0,4)
Out[16]: [0, 2, 5, 4]
In [17]: D[0,4]
Out[17]: 20.0
编辑:可能值得一看该软件包:
将networkx导入为nx
G=nx。从_numpy_数组(M)#M是上面的邻接矩阵
[14]中的:nx.最短路径(G,0,4,weight='weight')
输出[14]:[0,2,5,4]
[15]:nx.最短路径长度(G,0,4,weight='weight')
Out[15]:20
这是您第二次提供帮助,谢谢!。作为前导矩阵的后续步骤,以便我正确理解,似乎从节点0到4的路径被传递为I和j,然后k被设置为j(4),因此对[I,k]在Pr中为[0,4]。该值为5。那么5是不是正好在最后一个节点之前,而你是反向工作的?@user1938107!如果有人发现这一点并想知道,矩阵中的第二个数组应该是:[7,0,10,15,0,0]
而不是[7,0,9,15,0,0]
同样,我不确定,但到未连接节点的距离应该是0还是某个无穷大的数字?将其设置为零似乎表明距离与到源节点的距离相同。@eugene感谢您的提示,我已修复了输入错误。邻接矩阵A只包含1和0。当没有连接节点i和j的边时,则A[i,j]=0。距离矩阵只是加权邻接矩阵,因此未连接节点的距离应为0。这是您第二次提供帮助,谢谢!。作为前导矩阵的后续步骤,以便我正确理解,似乎从节点0到4的路径被传递为I和j,然后k被设置为j(4),因此对[I,k]在Pr中为[0,4]。该值为5。那么5是不是正好在最后一个节点之前,而你是反向工作的?@user1938107!如果有人发现这一点并想知道,矩阵中的第二个数组应该是:[7,0,10,15,0,0]
而不是[7,0,9,15,0,0]
同样,我不确定,但到未连接节点的距离应该是0还是某个无穷大的数字?将其设置为零似乎表明距离与到源节点的距离相同。@eugene感谢您的提示,我已修复了输入错误。邻接矩阵A只包含1和0。当没有连接节点i和j的边时,则A[i,j]=0。距离矩阵只是加权邻接矩阵,因此未连接节点的距离应为0。