在完整的图形中计算距离指标

时间:2018-08-02 11:28:21

标签: python-3.x algorithm

假设我有一个数组,即MapMap[i][j]表示区域i和区域j之间的距离。在此定义下,我们得到:

a)Map[i][i]始终等于0。

b)所有Map[i][k] <= Map[i][j] + Map[j][k]的{​​{1}}

我想构建一个返回度量标准i,j,k的函数func(Map,k),而D是从区域D[i][j]到区域i的路线的最短距离,并且此路线应至少穿过j个不同的区域。

这是我这样做的python代码:

k

返回距离指标def func(Map,k): n=len(Map) D_temp = [list(x) for x in Map] D = [list(x) for x in Map] for m in range(k - 1): for i in range(n): for j in range(n): tmp = [D[i][x] + Map[x][j] for x in range(n) if x != i and x != j] D_temp[i][j] = min(tmp) D = [list(x) for x in D_temp] return D func([[0, 2, 3], [2, 0, 1], [3, 1, 0]],2) 等于D

[[4, 4, 3], [4, 2, 5], [3, 5, 2]]等于D[0][0],因为从4area0且经过至少2个区域的最短路径是{area0-> {{ 1}}-> area0},路线的距离为area1 + area0 = 2 + 2 = 4

想知道什么是最好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用A *算法,将Map[i][j]用作启发法,以达到到目标节点的最小剩余距离(假设您说过,Map[i][j] <= Map[i][x] + Map[x][j]对于所有{{1} }。与常规A *的唯一区别是,您仅接受路径的最小长度为i,j,x的路径。

k

相应地更改您的import heapq def min_path(Map, k, i, j): heap = [(0, 0, i, [])] while heap: _, cost, cur, path = heapq.heappop(heap) if cur == j and len(path) >= k: return cost for other in range(len(Map)): if other != cur: c = cost + Map[cur][other] heapq.heappush(heap, (c + Map[other][j], c, other, path + [other])) 以使用此func返回列表理解。

min_path

这给了我def func(Map, k): n = len(Map) return [[min_path(Map, k, i, j) for i in range(n)] for j in range(n)] res = func([[0, 2, 3], [2, 0, 1], [3, 1, 0]], 2) 的结果[[4, 4, 3], [4, 2, 3], [3, 3, 2]]len(path) >= k的{​​{1}}的结果。