dijkstra 算法_路径规划算法(1)--Dijkstra和Floyd算法

486c5e2506c91a84585c5f13741b10aa.png

1.Dijkstra算法

Dijkstra算法主要用于解决带权重的有向图。其权重只能是正值,不能解决负值问题,其基本思想是利用广度优先搜索的方法,更新起点到各个顶点的最短距离。是一种经典的求单源最短路径的一种方法。其具体做法是定义一个数组

保留源点到各顶点的最短距离,和一个数组表示已经遍历出最短路径的数组
,以图解算法中的一个图为例说明:

b84b67f10fa8de749bff28989802cea9.png

1为源点,定义数组T

9c9250d1a3d1e812c0d5ef204cce2823.png

S中存入源点1,选取离源点1最近的顶点3,将3存入数组S中,(图所有的边都是正数,所以不存在更近的到3顶点的路线)。找到顶点3能到达的顶点。

19af65bbcc0a5210adcdcfcbb317275c.png

可以看出3->2的距离为3,1->3的距离为2,1->3->2的距离为2+3=5,小于6更新T中的2为5。3->4的距离为5,1->3->4=2+5=7。更新数组T:

b17e1e392d1c91ebcef46d738e7786dd.png

选取下一个最短路径且不在数组S中的顶点,如上表可知顶点2的距离最短,将顶点2加入到数组S中,遍历顶点2能到达的顶点

0b3bd64a6de017f1ebb29809fcb80252.png

2->4的距离为1,1->2->4的距离为5+1=6,小于之前的7,更新数组T:

1d20566adb9cd54a522f036d71dd228d.png

至此,得到各订=顶点的最短路径。

以下图[1]为例编写matlab代码:

3e2fc4dd8342251c59bac003d1f5b723.png
function

d=[inf,inf,10,inf,30,100;

inf,inf,5,inf,inf,inf;

inf,inf,inf,50,inf,inf;

inf,inf,inf,inf,inf,10;

inf,inf,inf,20,inf,60;

inf,inf,inf,inf,inf,inf];

带入函数中进行测试得到:

a: []

b: []

c: [1 3]

d: [1 5 4]

e: [1 5]

f: [1 5 4 6]

1->3, 1->5->4, 1->5, 1->5->4->6。

2.Floyd算法

前面介绍的Dijkstra算法可以很好的求解单源权重的路径规划问题,但是当权重存在负数时,则不能很好的解决,对于带负权重边(不存在负权回路)的问题可以应用Floyd算法进行求解。其是一种经典的求多源最短路径的一种方法。Floyd的原理在以下博客中有详细介绍。

https://blog.csdn.net/qq_35644234/article/details/60875818​blog.csdn.net

matlab代码如下:

function

继续上一个例子:

求出:

d =Inf Inf 10 50 30 60

Inf Inf 5 55 Inf 65

Inf Inf Inf 50 Inf 60

Inf Inf Inf Inf Inf 10

Inf Inf Inf 20 Inf 30

Inf Inf Inf Inf Inf Inf

r = 1 2 3 5 5 5

1 2 3 3 5 3

1 2 3 4 5 4

1 2 3 4 5 6

1 2 3 4 5 4

1 2 3 4 5 6

当要输出1->6的路径时调用函数:

DisplayPath(r, 1, 6)

输出为:

V1 -> V5 -> V4 -> V6

参考

  1. ^https://blog.csdn.net/qq_35644234/article/details/60870719
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值