一、无人驾驶--路径规划算法:Dijkstra
2、Dijkstra
2.1、算法简介
迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又称为狄克斯特拉算法;
它是从一个节点遍历其余各个节点的最短路径算法,解决的是有权图中最短路径问题。
主要特点:从起点开始,采用贪心算法的策略,每次遍历到初始点距离最近且未访问过的顶点的邻接点,直到扩展到终点为止。
2.2、算法思路
如上图G=(V,E)是一个带权有向图,把图中节点集合V分成两组:
第一组为已经求出最短路径的节点集合(用S表示,初始时S只有一个源点,即:D(0),之后每求得一条最短路径,就将该节点加入到集合S中,指导全部节点都加入到S中,算法就结束了);第二组为其余未确定最短路径的节点集合(U表示),按最短路径长度的递增次序把第二组的节点加入S中。在加入的过程中,总保持从源点V到S中节点的最短路径长度不大于从源点V到U中任何节点的最短路径长度。
此外,每个节点对应一个距离,S中的节点的距离就是从V到此节点的最短路径长度,U中的节点的距离,是从V到此节点只包含S中的节点为中间节点的当前最短路径长度。
具体流程:
设D为起点,A为终点,找到D~A的最短路径
1、S中只包含起节点D(0);U包含除S外的其它节点,如C节点,C与D相邻,所以C(3)表示C到D的距离为3,而F与D不相邻,所以设F到D的距离为∞。
2、在U中选出最短节点,这里为C(3),将C移到S中,并在U中删除。
3、按上述方法依次选出,在U中选出最短节点,此时为E(4),将E移到S中,并在U中删除。
4、此时就要对比DCB=13;DCF=9;DEF=6;DEG=12的距离,所以将F(6)移到S中,并在U中删除;
5、依次按照上述方法推算
6、直到U为空集,此时,可以得到最短距离:A(22) = DEF~A =4+2+16;
2.3、算法具体实现
defColorMap.m文件:
作用:生成栅格图
1 | function [field,cmap] = defColorMap(rows, cols) |
getNeighborNodes.m文件:
作用:搭建个节点之间的关系;实现查找当前父节点临近的周围8个子节点
1 | function neighborNodes = getNeighborNodes(rows, cols, lineIndex, field) |
Dijkstra.m文件:
具体的算法实现
1 | % 基于栅格地图的机器人路径规划算法 |
2.3.1、程序详解
①、 算法初始化
1 | %% 算法初始化 |
1 | 对U集合进程初始化,生成如下表,第一列未线性索引值,第二列为距离都设为∞ |
1 | %将初始节点放入S集合中,并设置它的距离为0;再U集合中删除初始节点! |
②、更新起点的邻节点及代价
1 | % 更新起点的邻节点及代价 |
这里调用了getNeighborNodes函数实现查找当前父节点临近的周围8个子节点
有三种情况:
①、两列都为inf,即这个节点不存在;
②、两个都是数字,即此节点存在,且为自由空间(可以走的节点);
③、第一列是数字,第二列是inf,即此节点为障碍物
for i = 1:8
;之后进行8次循环,判断该子节点是否存在,如果子节点存在,则将从父节点到子节点的距离存放到U集合中;
如上图中D是父节点,它有两个子节点C和E,那么就要再U集合中更新D到这两个节点的距离为3和4。
③、S集合的最优路径集合
1 | % S集合的最优路径集合 |
这里是生成初始节点的最优路径
④、进行循环,循环的条件是U集合不为空
1 | while ~isempty(U) |
得出个节点的距离值,进行排序后得到最优路径!
Dijkstra算法动态效果实现图: