学习了一下路径规划中的Dijstrak算法,一开始看一个博主的感觉很懂,换了个有代码的又看不懂了...编写思想不一样但是DIjstrak算法的核心应该就是贪心思想,记录一下学习过程。
Dijkstra算法
- 任务:找到从起点到终点的最短路径
- 思想:从起点开始扩展每一步为一个节点找到最短路径。贪心策略,声明一个数组dis:保存起点到各个节点的最短距离,声明一个集合:保存已经找到了最短路径的顶点的集合。
如图所示举例说明,求顶点V1到其他各个顶点的最短路径.
- 声明数组并初始化为起点到各个顶点的初始距离:dis={0,无穷,10,无穷,30,100}分别表示到v1-v6的距离,不能直接到达的设为无穷。顶点集T初始化为T={V1},T收录已经找到最短距离的顶点。
- 由dis可知v3距离v1最短,v3加入T,加入新节点后需要看新接入的节点对数组有无影响。
- 下面寻到v3到达节点,为v4,看v1-v3-v4是否比v1-v4短,长度分别为60和无穷,因此dis[3]松弛为60,dis更新为dis={0,无穷,10,60,30,100}
- 继续寻找未选定节点中的最小值,为dis[4]=30,v5也加入T集合[注:此时v4并未加入T],v5两个出路:v6.v4,v1-v5-v4=50<60,因此更新dis[3]=60,v1-v5-v6=90<100,更新dis[5],更新后:{0,无穷,10,50,30,90},T={v3,v5}
- 继续从未选定的点中找最小距离,除了v3v5的之外为50,即v4,v1-v5-v4-v6=60,更新到dis.dis={0,无穷,10,50,30,60}
- 以此类推最终得到结果:
- 博主IR IRON ROBOT代码Dijkstra思想
若要计算从节点1到节点6的最小距离:
整体思想为:
从起点开始,找到代价最小点——代价最小点收录进closlist——找代价最小点的邻接节点并收录进openlist并更新距离——重复直到openlist为空
- 将起点收录进openlist,再收录进closelist【】【1(0)】
- 找1节点邻接节点2,4,收录进openlist,【2(2),4(1)】【1(0)】
- 找代价最小点4(1),没在closelist,收录进去【2(2)】【1(0),4(1)】
- 找4邻接节点收录进open并更新距离【2(2),3(3),6(9),7(5)】【1(0),4(1)】
- 找代价最小点2(2)收录进close,并找2邻接节点收录进open并更新距离【3(3),6(9),7(5),5(13)】【1(0),4(1),2(2)】
- 以此类推直到openlist为空
感觉稍微有点抽象,没学过数据结构也很吃亏,是不是还需要学数据结构啊,nku电子信息我恨你的课程体系...研究生一年仍是代码小白,慢慢学吧