多节点最短路径算法——改进型dijstra(迪杰斯特拉)算法
原dijstra为单节点最短路径算法,这里是做了一些改进,通过前面已知各个节点间的权重,计算出两两节点间的最短路径。
clc,clear all
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; %将a=0的数全部替换为无强大
m = 6;
path = zeros(m,m);
for i = 1:m
pb = ones(1,m);%pb记录找到的节点记录,现在是全部复制为1,
pb((i+1):m) = 0;%将i后面的节点,需要找最短路径的节点复制为0
d(1:length(a)) = inf; %d是路径,全部复制为无穷大
d(i) = 0; %自身节点复制为0
temp = i; %当前找到的最短路径索引位置为i
for j = (i+1):m
tb = find(pb == 0); %尚未找出最短路径的节点
d(tb) = min(d(tb), d(temp)+a(temp,tb)); %d(tb),d(temp)+a(temp,tb),找出这两个中最小的值。相当于是更新路径
tmpb = find(d(tb)==min(d(tb))); %找出最小路径的索引,相当于是找出当前的最短路径的索引是第几个。
temp = tb(tmpb(1)); %可能会有多个相同值的tmpb,找出第一个,记录其索引
pb(temp) = 1; %在pb中记录一下temp,找到了这个节点,记录为1.
end
path(i,:) = d; %找到了i节点到其他节点所有的最短路径,记录到path中
end
%上一个for循环到这里,是找到了上半矩阵中的最短路径,下面是对矩阵做一个转换,将上半矩阵中的值,转换到下半矩阵中。
for i = 1:m
for j = 1:i
path(i,j) = path(j,i);
end
end
如有疑问,欢迎与我交流。