图论模型-Floyd 算法

版权声明:by goog https://blog.csdn.net/qq_39481214/article/details/82149994

图论模型-Floyd 算法

1. 引例

某公司在六个城市C C 1 1 ,C 2 2 ,C 3 3 ,C 4 4 ,C 5 5 ,C 6 6 都有分公司,
公司成员经常往来于它们之间,已知从 Ci 到C C j j 的直达航
班票价由下述矩阵的第i i 行,第j j 列元素给出(∞ ∞ 表示无
直达航班),该公司想算出一张任意两个城市之间的最
廉价路线航费表。
这里写图片描述

1.1 矩阵解释

第一行:(1,1)=> 第一个城市到第一个城市的费用为 0
(1,2) => 第一个城市到第二个城市的费用为 50
(1.,3) => 第一个城市到第三个城市的费用为 无穷大,即不能直接到达。
以此类推…

2. Floyd算法思想

算法思想原理:

Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)

从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到
j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

3. 通用代码

3.1代码块一:

tulun2.m

a= [ 0,50,inf,40,25,10;
     50,0,15,20,inf,25;
     inf,15,0,10,20,inf;
     40,20,10,0,10,25;
     25,inf,20,10,0,55;
     10,25,inf,25,55,0];
 % 只需修改举证即可
[D, path]=floyd(a)

3.2 代码块二:

floyd.m

function [D,path,min1,path1]=floyd(a,start,terminal)
D=a;n=size(D,1);path=zeros(n,n);
for i=1:n
   for j=1:n
      if D(i,j)~=inf
         path(i,j)=j;
      end, 
   end,
end
for k=1:n
   for i=1:n
      for j=1:n
         if D(i,k)+D(k,j)<D(i,j)
            D(i,j)=D(i,k)+D(k,j);
            path(i,j)=path(i,k);
         end, 
      end, 
   end,
end
if nargin==3
   min1=D(start,terminal);
   m(1)=start;
   i=1;
   path1=[ ];   
   while   path(m(i),terminal)~=terminal
      k=i+1;                                
      m(k)=path(m(i),terminal);
      i=i+1;
   end
   m(i+1)=terminal;
   path1=m;
end   

4. 结果分析:

D =

     0    35    45    35    25    10
    35     0    15    20    30    25
    45    15     0    10    20    35
    35    20    10     0    10    25
    25    30    20    10     0    35
    10    25    35    25    35     0


path =

     1     6     5     5     5     6
     6     2     3     4     4     6
     5     2     3     4     5     4
     5     2     3     4     5     6
     1     4     3     4     5     1
     1     2     4     4     1     6

4.1 解析:

D: 城市间最短费用(距离等)
PATH : 城市间最短费用(距离等)对应的路线。
例如(2,5)城市二到城市五 。观察path矩阵 :要经过城市四,即2->4->5。再根据(2,4)对应4, (4,5)对应5,故最佳路线为2->4->5
观察D矩阵:(2,5)对应值30,则最便宜费用30。

5. 图论模型-Floyd 算法与图论模型-Dijkstra不同

我们使用Floyd算法来计算上面引例 城市二到城市五:

5.1主代码快一:

weight=    [ 0,50,inf,40,25,10;
     50,0,15,20,inf,25;
     inf,15,0,10,20,inf;
     40,20,10,0,10,25;
     25,inf,20,10,0,55;
     10,25,inf,25,55,0;];
[dis, path] = dijkstra(weight,2, 5)

5.2 函数代码块一样

5.3 结果

dis =

    30


path =

     2     4     5

5.4 分析

最低费用30,最佳路线:2->4->5。 此结果和floyd算法结果一致。
所以我们可以很容易发现他们的不同了吧。

Floyd:能一次性显示所有路线问题。
Dijkstra:能显示一条规定的最佳路线,和最佳值,较直观。

通常在建模中,两种算法应该都使用,这样能互相证明,更具有说服力。也能为论文加分。

猜你喜欢

转载自blog.csdn.net/qq_39481214/article/details/82149994