最短路径问题解决——迪杰斯特拉和贝尔曼·福特算法摘要

图论的最短路径问题

图的概念

图论中的图即是由若干点和线组成的图形。图表示为 G(V(G),E(G))。 其中V和E分别表示点和边。图可分为有向图和无向图,有权值图和无权值图。
无向图(左) 有向图(右):
无向图有向图
权重定义:
权重的定义
在线做图网站:Graph Editor

Matlab做图

无向图无权值图: graph函数——只能从1开始连续编号,dot元素和line元素个数必须相同,上下呈对应关系,或者是元胞数组。

dot = [1 2 3 4 5];
line = [5 5 5 1 4];
G = graph(dot,line);
plot(G)

无向有权值图:

dot = [1 2 3 4 5];
line = [5 5 5 1 4];
weight = [3 2 4 8 3];
G2 = graph(dot,line,weight);
plot(G2, 'EdgeLabel', G2.Edges.Weight, 'linewidth', 2)  

有向图只需把graph换成 digraph 即可。

构建权重邻接矩阵

矩阵元素Dij是指i对j之间的权重,i对i自身权重为0,若无权重则为Inf。因此无向图矩阵是对称的。
对于有向图则一般不对称。

迪杰斯特拉算法求最短路径

Dijkstra算法概要

用于求图的最短路径问题,从起点开始,主要采用贪心算法的策略。如有下面的这无向图,如果以1为起始点,各个点之间的权值作为路径,那么要求出从1到5的最短路径,就通常用Dijkstra算法来实现。
无向图例子

Dijkstra算法的实现具体过程

假如1为起始点,5为目的点,各个点之间的权重为距离,那么需要求出路径的最短值。根据迪杰斯特拉的演绎方法,大致是如下的过程:
首先假设1自身起始距离为0,各个点的距离数值为无穷。那么1可以到达3和4,而到达4的距离相对短,那么我们偏向于先走到4点,此时累积距离已经达到了3。到了4点后,4可以走2和5,那么由于4→2到4→5的距离都大于1→3的距离,因此考虑走1→3。此时3处距离为4,而4可以到达的最短距离为3+2=5。现在3可以走到2或5,但是最短距离仍然是1→4→2,因此选择此路径,此时距离为5。2可以走向5或3,当2走向5的时候,距离之和为3+2+2=7,小于等于 当前的1→3→所处的路径,因此仍然可以选此路径为最短路径,此时,5已经是目的点,因此1→4→2→5是最短路径。

通过观察,可以发现Dijkstra的思想就是确定一个起始点,从起始点开始判断相对较短的路径,并和已有的路径之和作比较,每次都去走相对较短的路径,从而使得最终的路径为最短路径。

Dijkstra的MATLAB代码

法1,调用MATLAB的shortestpath函数

s = [1 1 2 2 2 3 4];
t = [4 3 3 4 5 5 5];
w = [3 4 3 2 2 5 5];
G = graph(s,t,w);                  %创建无向图

[P,d] = shortestpath(G,1,5);       %表示从节点1到节点5的最短路径,P为节点顺序,d为最短距离
P,d
%将P路径绘制出来
highlight(plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) ,P,'EdgeColor','g')

结果显示:
最短路径最短路径
法2,自己写:
还没写出来

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值