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。