Dijkstra和Bellman-Ford算法摘要
图论的最短路径问题
图的概念
图论中的图即是由若干点和线组成的图形。图表示为 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,自己写:
还没写出来