一、Dijkstra算法特点:
Dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径集。
二、Dijkstra算法原理:
Dijkstra算法采用的是一种贪心的策略,利用一个集合openlist来保存原点到各个顶点的最短距离和一个closelist集来保存已经找到的最短路径的集合。
一开始openlist中只有起始点S,且它的路径权重node_cost为0。将S点放入closelist中,然后将S的相邻节点放入openlist中。
A*算法的流程步骤为:
①、将起始点加入openlist中;
②、重复下面的过程:
1、遍历openlist,查找node_cose值最小的节点,把它当作当前要处理的节点current_node;
2.把这个节点加入closelist表中;
3、对当前节点的相邻节点处理如下(对于二维平面可以选择只有直线运动的4个方向或者带
对角线运动的8个方向):
- a、如果它是障碍点或不可达点(边界外点)或在closelist中,忽略它;
- b、如果它不在openlist中,把它加入openlist中,并且把当前方格设置为它的父节点,记录它的node_cost值;
- c、如果它已经在openlist中,则说明已经有父节点可以到达这个点,则需要看通过当前节点到达它是否是更好的路径,比较node_cost是不是不原来小。如果更好,则将它的父节点设置为当前节点,并更新其node_cost值;如果openlist中是按node_cost大小排序则更改了节点的node_cost后需要重新排序;
4、停止:当终点加入到了openlist中,或者查找失败,并且openlist是空的,此时没有路径;
5、保存路径,从终点开始,每个方格沿着父节点移动到起点,便是路径;
下面以一个图示说明一下(绿色代表起点,黄色代表终点,红色表示已放入closelist中,蓝色表示在openlist中,白色表示还没有遍历到):
①、按照步骤流程,一开始openlist中只有A节点,所以遍历openlist时只得到了A,并且它的node_cost=0;然后将A加入到closelist中,并从openlist中删除,将A设置为当前节点current_code;
②、由图知A的相邻节点有三个,B、C、D,他们都不在closelist中(且不是障碍点或边界外点),他们的node_cost分别为2、2、1;所以将他们加入openlist中并且父节点为A;