Dijkstra和A*算法代码对比

方法一:Dijkstra
方法二:A*算法

  1. 初始化和判断是否在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
  1. 启发式函数(方法二独有)
def heuristic(node):
    # 简化处理
     heuristic_values = [10, 5, 7, 3, 8, 0, 4]
     return heuristic_values[node]
  1. 遍历部分(不同)
    1. 方法一:
    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
    
    1. 方法二:
    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
    
  2. 输出路径部分(反向输出的)
i = n
print(i)
while(1):
    last = path[i]
    print(last)
    i = last
    if last == 0:
        break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值