数模(04)---图论模型(Dijkstra算法)

matlab---Dijkstra算法

    • Dijkstra算法简介
    • 带权邻接矩阵
    • Dijkstra算法matlab源码

Dijkstra算法简介

数模(04)---图论模型(Dijkstra算法)_第1张图片
数模(04)---图论模型(Dijkstra算法)_第2张图片
下面给出一例,如下图。

数模(04)---图论模型(Dijkstra算法)_第3张图片
       按照上方给出的算法步骤可以求得V1-V11的最短距离顺序结果如下图:
       不会Dijkstra算法的可以去参考下面的博客,自己试着进行求解:https://blog.csdn.net/heroacool/article/details/51014824
数模(04)---图论模型(Dijkstra算法)_第4张图片

带权邻接矩阵

数模(04)---图论模型(Dijkstra算法)_第5张图片
数模(04)---图论模型(Dijkstra算法)_第6张图片
        注意:第一幅图为无向图,第二幅图为无向有向混合图。当为无向图时,带权邻接矩阵为对称矩阵。

Dijkstra算法matlab源码

  • 求解一点到另一点的最短距离和路径,根据Dijkstra算法的求解步骤,可以编写matlab代码如下。只需要根据需要求解的图,得到带权邻接矩阵,把邻接矩阵作为代码的输入,就可以求得一点到另一点的最短距离和路径:

tulun1.m

weight = [0   2   8   1   Inf  Inf  Inf  Inf  Inf  Inf  Inf;
          2   0   6   Inf 1    Inf  Inf  Inf  Inf  Inf  Inf;
          8   6   0   7   5    1    2    Inf  Inf  Inf  Inf;
          1   Inf 7   0   Inf  Inf  9    Inf  Inf  Inf  Inf;
          Inf 1   5   Inf 0    3    Inf  2    9    Inf  Inf;
          Inf Inf 1   Inf 3    0    4    Inf  6    Inf  Inf;
          Inf Inf 2   9   Inf  4    0    Inf  3    1    Inf;
          Inf Inf Inf Inf 2    Inf  Inf  0    7    Inf  9;
          Inf Inf Inf Inf 9    6    3    7    0    1    2;
          Inf Inf Inf Inf Inf  Inf  1    Inf  1    0    4;
          Inf Inf Inf Inf Inf  Inf  Inf  9    2    4    0;]
   [dis,path]=dijkstra(weight,1,11)

dijkstra.m

function [min,path]=dijkstra(w,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
        ins=0;
        for j=1:length(s)
            if i==s(j)
                ins=1;
            end,
        end
        if ins==0
            v=i;
            if label(v)>(label(u)+w(u,v))
                label(v)=(label(u)+w(u,v));
                f(v)=u;
            end,
        end,
    end
    v1=0;
    k=inf;
    for i=1:n
        ins=0;
        for j=1:length(s)
            if i==s(j)
                ins=1;
            end,
        end
        if ins==0
            v=i;
            if k>label(v)
                k=label(v);
                v1=v;
            end,
        end,
    end
    s(length(s)+1)=v1;
    u=v1;
end
min=label(terminal);
path(1)=terminal;
i=1;
while path(i)~=start
    path(i+1)=f(path(i));
    i=i+1;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);

        注意:修改程序,就只要把tulun1.m程序的邻接矩阵换一下,以及起始点和终止点换一下即可。

你可能感兴趣的:(数学建模)