热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图论模型Floyd算法

图论模型-Floyd算法1.引例某公司在六个城市CC11,C22,C33,C44,C55,C66都有分公司,公司成员经常往来于它们之间,已知从Ci到

图论模型-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) j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

3. 通用代码


3.1代码块一:

tulun2.ma= [ 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.mfunction [D,path,min1,path1]=floyd(a,start,terminal)
D=a;n=size(D,1);path=zeros(n,n);
for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;end, end,
end
for k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)i,j)D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);end, end, end,
end
if nargin==3min1=D(start,terminal);m(1)=start;i=1;path1=[ ]; while path(m(i),terminal)~=terminalk=i+1; m(k)=path(m(i),terminal);i=i+1;endm(i+1)=terminal;path1=m;
end

4. 结果分析:

D =0 35 45 35 25 1035 0 15 20 30 2545 15 0 10 20 3535 20 10 0 10 2525 30 20 10 0 3510 25 35 25 35 0path =1 6 5 5 5 66 2 3 4 4 65 2 3 4 5 45 2 3 4 5 61 4 3 4 5 11 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 =30path =2 4 5

5.4 分析

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

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

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


推荐阅读
author-avatar
西瓜246
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有