Matlab:数模04-图论模型(dijstra算法)

Posted fxalll

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab:数模04-图论模型(dijstra算法)相关的知识,希望对你有一定的参考价值。

一个简单的例子

在这里插入图片描述
假设每个数字代表的都是点与点之间的距离。我们从v1出发,v11为终点。要如何走才能使路程最短?

dijstra算法简介与例子计算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
首先先写出各点距离v1的距离,然后走最短距离的那个点。

第二步走到v4,得到v1到v3、v7的距离,比较后决定第二步走v2,得到v1到v3、v5的距离,找最短距离。

第三步走到v5,得到v1到v3、v6、v8、v9的距离,找最短距离。

第四步走到v8,得到v1到v9、v11的距离。我们发现距离都挺长的,于是我们尝试回到v6,得到v1到v3、v7、v9的距离,找最短距离。

第五步走到v3,得到v1到v4、v7的距离,找最短距离。

第六步走到v7,得到v1到v9、v10的距离,找最短距离。

第七步走到v10,得到v1到v9、v11的距离,找最短距离。

第八步走到v9,直接走到v11。

以下为步骤图形化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

但是一旦路线复杂,这样的问题靠人力思考是很难的。我们于是使用Matlab解决这个问题。在使用Matlab之前,我们先引出一个概念,带权邻接矩阵。

带权邻接矩阵

在这里插入图片描述
在这里插入图片描述
这里的数字,比如首行首列的0,为v1到v1距离。首行第二列的2,为v1到v2的距离。以此类推。

当然,也有单箭头单向模式。

在这里插入图片描述

有了这些积累,我们就可以使用Matlab进行编程了。

Matlab代码

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);

我们先将以上代码保存命名为“dijkstra.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)

可将其保存为“tulun.m”。

修改时我们仅需修改tulun.m内的代码中的变量weight以及最下角的1和11这三个。weight的编写参照上文的“带权邻接矩阵”,1代表从v1开始,11代表从v11结束。

代码测试

我们只需要在命令行输入“tulun”即可快速得到结果。
在这里插入图片描述

dis为最短距离,path为经过的编号。

以上是关于Matlab:数模04-图论模型(dijstra算法)的主要内容,如果未能解决你的问题,请参考以下文章

图论模型--dijstra算法和floyd算法

Matlab:数模07-种群竞争模型

Matlab:数模13-多元回归分析模型

Matlab:数模06-模拟退火模型

Matlab:数模03-灰色预测

Matlab:数模02-多属性决策模型