快速算法找到断开边缘的最小路径

时间:2016-10-30 13:20:30

标签: python algorithm

嗨,我有一个有向图的邻接矩阵:

∞   12  0   28  0   0   0
12  ∞   10  43  0   0   0
0   10  ∞   0   10  0   0
28  43  17  ∞   0   0   0
0   31  10  0   ∞   8   0
0   0   0   0   14  ∞   6
0   0   0   0   0   6   ∞

这里我们有一些没有直接连接的边缘,我想用边缘之间的最小路径替换零。预期产出:

∞   12  22  28  32  40  46
12  ∞   10  40  20  28  34
22  10  ∞   50  10  18  24
28  27  17  ∞   27  35  41
32  20  10  60  ∞   8   14
46  34  24  74  14  ∞   6
52  40  30  80  20  6   ∞

是否有任何快速python解决方案?(请注意图表是直接的)

1 个答案:

答案 0 :(得分:3)

numpynetworkx使这很简单。

首先,定义邻接矩阵。正如Kenny Ostrom所指出的那样,对角线通常为0(稍后会更多):

import numpy as np
import networkx as nx

am = np.array([[0,   12,  0,   28,  0,   0,   0],
    [12,  0,   10,  43,  0,   0,   0],
    [0,  10,  0,   0,   10,  0,   0],
    [28,  43,  17,  0,   0,   0,   0],
    [0,   31,  10,  0,   0,   8,   0],
    [0,   0,   0,   0,   14,  0,   6],
    [0,   0,   0,   0,   0,   6,   0]])

现在找到最短的距离:

dists = nx.floyd_warshall_numpy(nx.from_numpy_matrix(am, create_using=nx.DiGraph()))

(非常感谢@curious_cat指出需要create_using=nx.DiGraph(),BTW。)

最后,您可以按找到的距离替换0条目:

>>> np.where(am, am, dists)
array([[  0.,  12.,  22.,  28.,  32.,  40.,  46.],
       [ 12.,   0.,  10.,  43.,  20.,  28.,  34.],
       [ 22.,  10.,   0.,  50.,  10.,  18.,  24.],
       [ 28.,  43.,  17.,   0.,  27.,  35.,  41.],
       [ 32.,  31.,  10.,  60.,   0.,   8.,  14.],
       [ 46.,  34.,  24.,  74.,  14.,   0.,   6.],
       [ 52.,  40.,  30.,  80.,  20.,   6.,   0.]])

如果你想让对角线成为别的东西(这对我来说不那么有意义,我必须说),你可以使用np.fill_diagonal