A*算法及迪杰斯特拉算法求解最短路径问题

本文对比了A*算法与迪杰斯特拉算法在求解最短路径问题上的应用,探讨了A*算法的估计代价性质及其可能不是最优解,以及迪杰斯特拉算法的动态规划特性及其适用场景。
A*算法及迪杰斯特拉算法求解最短路径问题
一、题目

最短路径问题:求各节点到Bucharest的最小距离。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMugchyR-1641633409771)(C:\Users\Jackson\AppData\Roaming\Typora\typora-user-images\image-20220108122828222.png)]

二、数据表示

在表示图的数据结构中,需要涵盖节点的相连关系相连节点间的距离,以下为python数据结构表示

  1. 记录图中的全部节点,用于循环遍历:
vertex_list_ = ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Fagaras', 'Timisoara', 'Rimnicu Vilcea', 'Lugoj', 'Mechadia', 'Pitesti', 'Craiova', 'Drobeta', 'Giurgiu', 'Bucharest', 'Urziceni', 'Vaslui', 'Hirsova', 'Iasi', 'Neamt', 'Eforie']
  1. 记录相连的节点—Map字典

    一个元素的键为图中的节点,值为与键相连的节点列表。可以直接通过键值得到与该节点相连的节点。

# 采用字典记录节点间相连的关系,其中键为节点,值为与之相连的节点列表
Map = {
   
   'Oradea': ['Zerind', 'Sibiu'], 'Zerind': ['Arad', 'Oradea'],
       'Arad': ['Zerind', 'Sibiu', 'Timisoara'],
       'Sibiu': ['Fagaras', 'Oradea', 'Arad', 'Rimnicu Vilcea'],
       'Fagaras': ['Sibiu', 'Bucharest'],
       'Timisoara': ['Arad', 'Lugoj'],
       'Rimnicu Vilcea': ['Pitesti', 'Sibiu', 'Craiova'],
       'Lugoj': ['Timisoara', 'Mechadia'],
       'Mechadia': ['Lugoj', 'Drobeta'],
       'Pitesti': ['Rimnicu Vilcea', 'Craiova', 'Bucharest'],
       'Craiova': ['Drobeta', 'Pitesti', 'Rimnicu Vilcea'],
       'Drobeta': ['Mechadia', 'Craiova'],
       'Giurgiu': ['Bucharest'],
       'Bucharest': ['Fagaras', 'Pitesti', 'Giurgiu', 'Urziceni'],
       'Urziceni': ['Vaslui', 'Bucharest', 'Hirsova'],
       'Vaslui': ['Iasi', 'Urziceni'],
       'Hirsova': ['Urziceni', 'Eforie'],
       'Iasi': ['Neamt', 'Vaslui'],
       'Neamt': ['Iasi'],
       'Eforie': ['Hirsova']
       }
  1. 记录节点间的距离–disMap字典

    该字典的键为相连节点组成的元组,值为两节点之间的距离。

disMap = {
   
   
    ('Oradea', 'Oradea'): 0, ('Oradea', 'Zerind'): 71, ('Oradea', 'Sibiu'): 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值