【轮子】【matlab】赋权图最短路径求法之迪克斯拉算法(Dijkstra)

运筹学图与网络部分。可以直接使用。注意输入三个参数。

function [min,path]=dijkstra(w,start,terminal)
% w赋权矩阵,要求不可达权值为inf
% start起点,terminal终点
n=size(w,1);
label(start)=0;
f(start)=start;
for i=1:n
    if i~=start
        label(i)=inf;
    end
end
s(1)=start;
u=start;
while length(s)<n %要求遍历所有点
    for i=1:n
        if ~ismember(i,s)
            if label(i)>(label(u)+w(u,i))
                label(i)=(label(u)+w(u,i));
                %将Xbar中可连接X的点找出
                %保留其最优的label值
                %比如,1是起始点
                %在第二次迭代中,4指向2的值小于1指向2的值
                %那么label(2)的值就更新
                f(i)=u; %f表示各点指向,f中坐标值指向f坐标值的相应值
            end
        end
    end
    k=inf;
    for i=1:n
        if ~ismember(i,s)
            if k>label(i)
                k=label(i); %把比k小的留下
                v1=i;
            end
        end
    end
    s(end+1)=v1;
    u=v1;
end
min=label(terminal);
path(1)=terminal;
i=1;
%下面是根据各点间最优指向关系,利用f值指向,求解最佳路径path
while path(i)~=start
    path(i+1)=f(path(i));
    i=i+1;
end
L=length(path);
path=path(L:-1:1);

第一次看程序也许会有些烧脑,想理解的话看图可能会有些帮助:
《【轮子】【matlab】赋权图最短路径求法之迪克斯拉算法(Dijkstra)》
这是程序运行的时的一个片段。

label就是[x,y]中的x,f就是y。

此时,
label=[0,5,3,4,……]
f=[1,3,1,1]。

多用脑用手捋一捋程序就懂了。

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/weixin_42815609/article/details/85953776
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞