數模(04)---圖論模型(Dijkstra算法)

Dijkstra算法簡介

在這裏插入圖片描述
在這裏插入圖片描述
下面給出一例,如下圖。

在這裏插入圖片描述
       按照上方給出的算法步驟可以求得V1-V11的最短距離順序結果如下圖:
       不會Dijkstra算法的可以去參考下面的博客,自己試着進行求解:https://blog.csdn.net/heroacool/article/details/51014824
在這裏插入圖片描述

帶權鄰接矩陣

在這裏插入圖片描述
在這裏插入圖片描述
        注意:第一幅圖爲無向圖,第二幅圖爲無向有向混合圖。當爲無向圖時,帶權鄰接矩陣爲對稱矩陣。

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程序的鄰接矩陣換一下,以及起始點和終止點換一下即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章