Python中路径的方矩阵长度

时间:2015-01-24 12:27:34

标签: python numpy matrix

我在单位之间有一个方形连接真值矩阵。它显示了哪些单元相互连接 例如。

[[False, False, True], # 1
 [False, False, True], # 2
 [True, True, False]]  # 3

可以解释为:

  • 1不与自身连接,也不与2连接,并且连接到3
  • 2未连接到1,也未连接到自身,并且连接到3
  • 3连接到1,3连接到2,但它没有连接到自己

当我想要找到所有单位的路径长度时,结果将是:

distances = [[0, 2, 1], 
             [2, 0, 1],
             [1, 1, 0]]

缺乏算法技巧,我无法弄明白......

请注意,我知道最短路径评估,但我需要这种结构,因为这样可以很容易地进行进一步的操作。

例如,稍后我可能会说,我想知道最短距离的最长距离,我可以从单位5,7,10开始到单位15,16,17。

np.max(np.min(distances[np.array([5,6,7])][:, np.array([15,16,17])], 1))

应用程序可能处于风险游戏中,您可能希望从所有拥有的区域开始捕获属于奖励的所有区域。它会给出到达奖金中所有区域所需的回合数量的下限(忽略你是否能够以部队的形式捕获)。在这个简单的例子中:

froms = np.array([1,2])
tos = np.array([0,1])
np.max(np.min(distances[froms][:, tos], 1))
1

2 个答案:

答案 0 :(得分:1)

这将做你想要的:

在[1]:

scipy.sparse.csgraph.floyd_warshall(np.matrix(
    [[False, False, True],
     [False, False, True],
     [True, True, False]]
).astype(int))

输出[1]:

array([[ 0.,  2.,  1.],
       [ 2.,  0.,  1.],
       [ 1.,  1.,  0.]])

答案 1 :(得分:1)

您要找的是“Floyd-Warshall algorithm”。

def floyd_warshall(W):
    n = len(W)
    D = {x: None for x in range(n)}
    D[0] = W
    for k in range(1, n+1):
        D[k] = list(D[k-1])
        for i in range(n):
            for j in range(n):
                D[k][i][j] = min(D[k-1][i][j], D[k-1][i][k-1] + D[k-1][k-1][j])
    return D[n]


if __name__ == '__main__':
    INF = float('inf')
    W = [[0, 1, INF, INF],
         [INF, 0, 3, 1],
         [INF, INF, 0, 8],
         [INF, 2, INF, 0]]
    print(floyd_warshall(W))

对于您的情况,矩阵将是

    W = [[0, INF, 1],
         [INF, 0, 1],
         [1, 1, 0]]

这是一个距离矩阵。 Floyd-Warshall计算出具有最小距离的新距离矩阵。因此,某些值将相同(例如0值),其他值将减少到最小值。

似乎还有一个SciPy实现:cipy.sparse.csgraph.floyd_warshall