多节点最短路径算法——改进型dijstra(迪杰斯特拉)算法

多节点最短路径算法——改进型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

如有疑问,欢迎与我交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值