使用scipy的搜索图示例

时间:2018-10-31 01:14:16

标签: python scipy graph-theory

我很难在scipy中找到有关如何使用和获取各种搜索算法的路径的教程/示例。

在Google中出现的最常见的是this one,该示例在结尾处带有括号的错误。

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]是可行的。

我的主要问题是如何搜索计算所有索引的图形,而不是给它一个可选参数indices=i1。同样,如何使用Floyd-Warshall方法并获取从任何i,j索引到任何其他i,j索引的路径。我感到困惑的部分原因是前驱者矩阵的真正含义以及如何对其进行解析都缺乏描述。

是否有更详尽的教程,或者有人可以举一些简单的例子来梳理和理解吗?

1 个答案:

答案 0 :(得分:1)

我将以这个无向图为例(取自Wikipedia),并假定节点标记为0,1,...,5而不是1,2,...,6。

enter image description here

首先,我们需要表示从节点i到j的距离的矩阵:

import numpy as np
from scipy.sparse.csgraph import shortest_path

M = np.array([[0, 7, 9, 0, 0, 14],
              [7, 0, 9, 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算法。

最后,我们可以使用predecessors-matrix定义一个函数,以从节点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的最短路径(图片中分别为1到5):

In [16]: get_path(Pr,0,4)
Out[16]: [0, 2, 5, 4]  # in the picture: 1, 3, 6, 5

In [17]: D[0,4]
Out[17]: 20.0