路径规划算法之Dijkstra算法

概念都是参考此篇文章:全局路径规划算法——Dijkstra算法(含python实现 | c++实现

Dijkstra算法

1、简介

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个节点遍历其余各节点的最短路径算法,解决的是有权图中最短路径问题。
它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止。它是图搜索算法的一种。

2、算法思想

  1. 设G=(V,E)是一个带权图,V为节点集合。通过Dijkstra计算图G中的最短路径时,需要指定一个起点(假设为D,即从顶点D开始计算)。
  2. 此外,引进两个点集S和U。初始时S中只有一个起点,S的作用是记录已求出最短路径的节点(以及相应的最短路径长度);而U则是记录还未确定最短路径的节点(以及该节点到起点D的距离)。
  3. 初始时,数组S中只有起点D,而数组U中是除起点D之外的节点集合,并且数组U中记录各节点到起点D的距离。如果节点与起点D不相邻,距离设为无穷大。
  4. 然后,从数组U中找出路径最短的节点K,并将其加入到数组S中;同时,从数组U中移除节点K。接着,更新数组U中的各节点到起点D的距离。
  5. 重复第4步操作,直到遍历完所有节点。

3、实例

视频链接:最短路径查找法——Dijkstra算法
有如下图,0为起点,4为终点,各边上的数值为权重。
在这里插入图片描述
先看总结:

​ 1、每次从未标记的节点中选择距离出发点最近的节点,标记,收录到最优路径集合中。

​ 2、计算刚加入A的邻近节点B的距离(不包含标记的节点),若(节点A的距离+节点A到节点B的边长)< 节点B的距离,就更新节点B的距离和前面点。)

  • 开始:出发点列代表上面的点集S前面点列代表上面的点集U
    在这里插入图片描述
  • 首先,节点0自己到自己的距离肯定是0,更新相应的值,随后检查所有节点中距离最短的点,当然是0自己本身,把0标为最优路径中的节点。

在这里插入图片描述

  • 接着,更新节点0相邻的节点的距离,即为0到节点1和节点7的距离,分别是4和8,更新出发点0到节点1和节点7的距离,并将节点0作为节点1和节点7的前面节点。
    在这里插入图片描述
  • 在未标记的节点中寻找距离出发点最小的节点,发现是节点1,标记节点1。并收录进最优路径节点中。
    在这里插入图片描述
  • 尝试更新新标记的节点1的邻近节点,分别是节点2和节点7,节点1到节点2的距离为8,如果从起始节点0,经由节点1到达节点2为最优路径的话,那么0到1到2的距离为12,小于 ∞ \infty ,如下图2,更新表中的数据,并将节点2的前面节点记为1。
    在这里插入图片描述
    在这里插入图片描述
  • 接着来看节点7,起始点0经由节点1再到节点7的距离是15,大于起始点到节点7本来的距离,所以不更新表中数据。

在这里插入图片描述

  • 在未标记的节点中寻找距离最小的节点,是节点7。标记节点7,并收录最优路径中。

在这里插入图片描述

  • 接着尝试更新邻近节点,分别是节点8和节点6,起始点0经过节点7到达节点8的距离是15,到达节点6
    的距离是9,更新表中数据,并将节点8和节点6的前面点更新为节点7。

在这里插入图片描述

  • 接下来循环上面类似步骤,一直到目标点被标记。

  • 从未被标记的节点中选出距离出发点最近的节点----节点9,更新节点6临近节点的距离,到节点5的距离为11,小于 ∞ \infty ,更新表中数据。而从出发点到节点6,到达节点8的距离为15,与表中原数据相等,不更新数据。

在这里插入图片描述
在这里插入图片描述

  • 同样的步骤,节点5的临近节点为节点2、节点3和节点4,距离分别为15、25和21,节点2不更新,更新节点3和节点4的相应数据,不更新节点2。

在这里插入图片描述

  • 表中最短距离变为节点2,相邻的节点为节点8和节点3(节点5已经被标记),更新对应的数据为14和19,更新两者对应的节点数据,并将两者的前面点设为2。

在这里插入图片描述

  • 然后最短路径节点是8,周围节点都已经被标记,无需更新。

在这里插入图片描述

  • 尝试更新节点3的邻近节点-----节点4,19+9=28>21,不更新。

在这里插入图片描述

  • 最终标记节点4。

在这里插入图片描述

  • 最后到达节点4的最短路径是21,根据表中前面数据一项回溯回去,4 → \rightarrow 5 → \rightarrow 6 → \rightarrow 7 → \rightarrow 0。

在这里插入图片描述

  • Dijkstra是从一个顶点到其余各顶点的最短路径算法,节点边都有各自不同的权重,但必须是正数,如果有负数,则需要Bellman-Ford算法;如果想要求任意两点之间的最短路径,那就需要Floyd算法。

4、Matlab演示

以下是matlab中Dijkstra算法的演示。
来自:路径规划算法
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值