介绍
迪克斯特拉(Dijkstra )算法,也叫标志设置法。该方法的基本原理网上很多,这里我只说我的理解。
标志设置法是通用方法的一种特例。通用方法在我理解看来它是通过两个数组不断迭代来实现的,一个是“候选列表”,另一个是“节点标记”。“候选列表”来放节点,“节点标记”来存取从起点到对应节点的距离。开始的话“候选列表”只有节点1(开始节点),节点标记距离未知的话为无穷大,本节点到本节点距离为0,下面开始迭代:将节点i从候选列表中移出,如果因为节点i出发的边到其他节点j的距离加上开始节点到i的距离要及开始节点经过i到j 比“节点标记”中j的小,则更新节点标记,并把j加入候选列表。不断迭代得出结果。如果算法未停止,说明图中存在以1为起点含有长度为负值的环的路,或者序列中路的长度趋近负无穷大。
而标记设置法不过是每次移出“获选列表”的是对应于“标记节点”中距离最小的节点。
代码
clc,clear
a=zeros(6);
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;
a=a+a';
a(find(a==0))=inf;
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1;
while sum(pb)<length(a)
tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+a(temp,tb));
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb(1));
pb(temp)=1;
index1=[index1,temp];
temp2=find(d(index1)==d(temp)-a(temp,index1));
index2(temp)=index1(temp2(1));
end
d, index1, index2
这是以一个矩阵为例,矩阵内容为节点之间的距离。
用矩阵a 存放各边权的邻接矩阵,行向量pb 、index1,index2、 d 分别用来存放P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。其中分量pb(i) = 1 i节点已标号,0:未标号index2(i) 存放始点到第i 点最短通路中第i 顶点前一顶点的序号;d (i) 存放由始点到第i 点最短通路的值。
简单方法
在Matlab中有可以计算最短路的函数,先用digraph生成加权图,再用shortestpath计算最短路。
以下Matlab代码可以计算上面有向图中节点 1 到 5 的最短路,path是最短路的路径,distance是最短距离。
a = [1,1,1,2,2,3,4]; % 起点节点
b = [2,3,4,3,5,4,5]; % 终点节点
c = [3,2,2,1,3,4,3]; % 对应权值
g = digraph(a,b,c); % 创建图
[path,distance] = shortestpath(g,1,5); % 计算最短路
plot(g)
---------------------
作者:Anonymoushi
来源:优快云
原文:https://blog.youkuaiyun.com/u011317780/article/details/82429511
版权声明:本文为博主原创文章,转载请附上博文链接!