假设我有一个数组,即Map
。 Map[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]
,因为从4
到area0
且经过至少2个区域的最短路径是{area0
-> {{ 1}}-> area0
},路线的距离为area1
+ area0
= 2 + 2 = 4
想知道什么是最好的方法吗?
答案 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}}的结果。