一个简单实例弄懂Dijkstra算法

1、算法简介

Dijkstra 是一种寻找最短路径的算法(如解决TSP问题等),TSP问题一般采用图来描述,图就是由节点和边组成的,边是用来描述节点之间的连接关系,比如节点1到节点2的边表示了由节点A到节点B所花费的代价,其代价为5(如下图),寻常情况下代价即是路径的长度。
在这里插入图片描述
Dijkstra算法即从起始节点开始逐步扩展,每一步都为一个节点找到最短路径,主要分为以下两步:
Step1:基于贪心思想,从未访问的节点选择距离最小的节点收录;
Step2:收录节点后遍历该节点的邻接节点,采用松弛的方法来更新到起点的距离;
Dijstra算法每一步都为一个节点找到最短路径,这样一步一步扩展,在需要为终点扩展时即找到了从起点到终点的最短路径。

2 求解示例

在路径规划中,还需要维护Open ListClose List两个列表,Open List中存放与起点已经存在路径的节点;Closed List中存放收录之后的节点,这些节点都是已经找到起点最短路径的节点。
对于上图由起点1开始寻找最短路径的过程可以表示如下(注:括号中表示当前点到起点的距离):
Step1 :
Open : 1(0)
Closed: 1(0) (加入Closed表后就需要将其从Open表里删除)
遍历已经收录节点的邻接节点:2(5)、6(20),将其加入Open表。
Step2:
Open : 2(5) 6(20)
Closed: 2(5)
Step3:
Open : 6(20) 5(-) 3(-) — 6(20) 5(5+22) 3(5+10)(“松弛”邻近节点)
Closed: 2(5)
Step4:
Open : 6(20) 5(27) 4(-) —6(20) 5(27) 4(15+8) (“松弛”邻近节点)
Closed: 2(5) 3(15)
Step5:
Open: 5(27) 4(23)
Closed: 2(5) 3(15) 6(20)
Step6:
Open: 5(27)
Closed: 2(5) 3(15) 6(20) 4(23)
Step7:
Open :
Closed: 2(5) 3(15) 6(20) 4(23) 5(27)
即找到了起始节点1到各个节点之间的最短路径。

3 Dijkstra算法伪代码

用伪代码表示更容易理解Dijkstra算法原理

###start###
while ture
	if Open List为空
		搜索失败,结束
	else
		取Open List中g(n)最小的节点,将节点加入Closed List中
		if 节点为终点
			找到路径,结束
		else
			遍历当前节点未在Closed List中的邻接节点
			if 节点在Open List中
				更新节点g(n)else
			计算节点g(n)值,加入Open List中
			end 
		end
	end

4 小结

Dijkstra算法能保证找到一条最短路径,但显然其每次都要遍历图中所有节点,耗时长也是其最大的缺点,在实际应用中都是与其它启发式算法结合起来运用,如A*、D*等。(对算法的理解还存在不足之处,如有错误,还请指出┭┮﹏┭┮)
在这里插入图片描述

好的,我们来看一个例子: 假设有一个城市地图,其中有6个城市和它们之间的道路,如下图所示: ![graph_example](https://cdn.luogu.com.cn/upload/image_hosting/ty1u9gs7.png) 现在要从城市1出发,到达城市6。我们可以使用Dijkstra算法来找到最短路径。 首先,我们初始化一个距离数组dist,它表示从起点出发到每个城市的距离。由于起点是1号城市,所以我们将dist[1]初始化为0,其他城市的距离先设为无穷大(表示暂时不可达)。 然后,我们从起点1开始遍历所有可到达的城市,并将它们加入一个优先队列中(按照距离从小到大排序)。然后每次从队列中取出距离最小的城市,更新与它相邻的城市的距离值。这个过程持续进行,直到我们找到了终点6或者队列为空。 具体的步骤如下: 1. 初始化dist数组:dist[1] = 0,dist[2..6] = ∞ 2. 将起点1加入优先队列 3. 取出队列中距离最小的城市1,遍历它的所有邻居城市 4. 如果从1号城市到某个邻居城市的距离更短,就更新邻居城市的dist值,并将该城市加入优先队列中 5. 重复步骤3~4,直到找到终点6或者队列为空 具体执行过程如下图所示: ![dijkstra_example](https://cdn.luogu.com.cn/upload/image_hosting/8l8n2vrn.png) 最终,我们得到了从起点1到终点6的最短路径长度为11,该路径为1 -> 3 -> 6。 希望这个例子能够帮助你更好地理解Dijkstra算法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘广隶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值