方法一:Dijkstra
方法二:A*算法
- 初始化和判断是否在U集合中的部分相同
u = [0]#初始放一个
n = 6
dist = []
path = []
d = [[0, 4, 6, 6, 10000, 10000, 10000],
[10000, 0, 1, 10000, 7, 10000, 10000],
[10000, 10000, 0, 10000, 6, 4, 10000],
[10000, 10000, 2, 0, 10000, 5, 10000],
[10000, 10000, 10000, 10000, 0, 10000, 6],
[10000, 10000, 10000, 10000, 1, 0, 8],
[10000, 10000, 10000, 10000, 10000, 10000, 0]]
for i in range(n + 1):
dist.append(d[0][i])
if d[0][i] < 10000:
path.append(0)
else:
path.append(-1)
def is_in_u(v):
return v in u
- 启发式函数(方法二独有)
def heuristic(node):
# 简化处理
heuristic_values = [10, 5, 7, 3, 8, 0, 4]
return heuristic_values[node]
- 遍历部分(不同)
- 方法一:
for i in range(1, n + 1): min_dist = float('inf') min_dist_point = -1 for j in range(n + 1): if dist[j] < min_dist and is_in_u(j) == False and i != j: #注意i!=j min_dist_point = j min_dist = dist[j] u.append(min_dist_point) for k in range(n + 1): if is_in_u(k) == False: if d[min_dist_point][k] < 10000: #!!!! dist[k] = min(dist[k], dist[min_dist_point] + d[min_dist_point][k]) path[k] = min_dist_point
- 方法二:
for i in range(1, n + 1): min_dist = float('inf') min_dist_point = -1 for j in range(n + 1): if dist[j] + heuristic(j) < min_dist and not is_in_u(j) and i != j: min_dist_point = j min_dist = dist[j] + heuristic(j) u.append(min_dist_point) for k in range(n + 1): if not is_in_u(k): if d[min_dist_point][k] < 10000: dist[k] = min(dist[k], dist[min_dist_point] + d[min_dist_point][k]) path[k] = min_dist_point
- 输出路径部分(反向输出的)
i = n
print(i)
while(1):
last = path[i]
print(last)
i = last
if last == 0:
break