Floyd算法又称为弗洛伊德算法、插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

课题名称:设备更新,使总的支付费用最少

工厂的某台机器可连续工作四年,决策者每年年初都要决定机器是否需要更新。若更新,就要支付购置费用;若不更新,则要支付维修与运行费用,且随着机器使用年限的增加维修与运行费用逐年增多。计划期(4年)中每年年初的购置价格及各个年限内维修与运行费用由表1给出,

(1)试制订今后4年的机器更新计划,使总的支付费用最少。

表1

第 i 年初

第1年初

第2年初

第3年初

第4年初

购置费(万元)

2.5

2.6

2.8

3.1

使用年限

1

2

3

4

使用年限下对应的每年的维修与运行费(万元)

1

1.5

2

4

可将此问题看成一个最短路问题。设 v1 和 v5 分别表示计划期的始点和终点(v5 可理解为第4年年末)。下图中各边的值(vi,vj)表示在第 i 年初购进的机器使用到第 j 年初(即第 j-1 年底),(vi,vj)的值可由表1的数据计算得到。因此,把求最优设备更新问题转化为求从 i 到 j 的最短路问题。

(vi,vj)的值计算示例:

(v1,v2) = 2.5(第1年初的购置费)+1(使用第一年的维修费) = 3.5;

(v3,v5) = 2.8(第3年初的购置费)+1(使用第一年的维修费)+1.5(使用第二年的维修费) = 5.3;

             

Matlab求解

Matlab程序:

a=[0 3.5 5 7 11;inf 0 3.6 5.1 7.1;inf inf 0 3.8 5.3;inf inf inf 0 4.1;inf inf inf inf 0];
n=size(a,1);
D=a;
path=zeros(n,n);
for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;endend
end
for k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);endendend
end
D;path;

Matlab运行结果:

D =0    3.5000    5.0000    7.0000   10.3000Inf         0    3.6000    5.1000    7.1000Inf       Inf         0    3.8000    5.3000Inf       Inf       Inf         0    4.1000Inf       Inf       Inf       Inf         0
>> path
path =1     2     3     4     30     2     3     4     50     0     3     4     50     0     0     4     50     0     0     0     5

解得方案:最短路(v1,v3,v5),即计划期内机器更新最优计划为第1年、第3年初各购进一台新机器,4年总的支付费用为10.3万元。

新问题来了!

按照上述方案,第3年初购置新机器,那么旧机器是否可以低价处理掉呢?这样也更加符合实际。如果已知不同役龄机器年末的处理价格如表2所示,那么在这计划期内机器的最优更新计划又会怎样?

表2

年度

第一年末

第二年末

第三年末

第四年末

机器处理价(万元)

2.0

1.6

1.3

1.1

类似上面的处理方式,可转化为求下图中从 v1 到 v5 的最短路问题。

       

Matlab求解

Matlab程序:

a=[0 1.5 3.4 5.7 9.5;inf 0 1.6 3.5 5.8;inf inf 0 1.8 3.7;inf inf inf 0 3.1;inf inf inf inf 0];
n=size(a,1);
D=a;
path=zeros(n,n);
for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;endend
end
for k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);endendend
end
D;path;

Matlab运行结果:

D =0    1.5000    3.1000    4.9000    6.8000Inf         0    1.6000    3.4000    5.3000Inf       Inf         0    1.8000    3.7000Inf       Inf       Inf         0    3.1000Inf       Inf       Inf       Inf         0
>> path
path =1     2     2     2     20     2     3     3     30     0     3     4     50     0     0     4     50     0     0     0     5

即最后解得:最短路 (v1,v2,v3,v5),即计划期内机器更新最优计划为第1年初购进一台新机器并在第2年初处理掉,第2年初购进一台新机器并在第3年初处理掉,第3年初购进一台新机器,4年总的支付费用为6.8万元。

内容很多,消化一下吧,希望可以为你所用!

动态规划 - Floyd算法求最短路径 - (Matlab建模)相关推荐

  1. Floyd算法求最短路径(附代码实例)

    Floyd算法 使用范围: 1)求每对顶点的最短路径; 2)有向图.无向图和混合图; 算法思想: 直接在图的带权邻接矩阵中用插入顶点的方法依次递推地构造出n个矩阵D(1), D(2), -, D(n) ...

  2. Python Floyd算法求最短路径

    Floyd算法简介: Floyd算法 floyd算法(多源最短路径) python实现 例题 求下图各节点最短路径 Floyd算法如下: from math import * import numpy ...

  3. 最短路径 floyd java_java实现Floyd算法求最短路径

    关于无向图的最短路径问题: 这个程序输出:最短路径矩阵 例如:W[0][5]=9 代表vo->v5的最短路径为9 W=: 0 1 3 7 4 9 1 0 2 6 3 8 3 2 0 4 1 6 ...

  4. C++floyd warshall算法求最短路径(附完整源码)

    C++floyd warshall算法求最短路径 floyd warshall算法求最短路径的完整源码(定义,实现,main函数测试) floyd warshall算法求最短路径的完整源码(定义,实现 ...

  5. Floyd算法求解最短路径

    Floyd算法求解最短路径 1.算法概述 2.算法实例 3.算法实战 3.1 算法描述 3.2 解题思路 3.3 代码实现 1.算法概述   Floyd算法又称为插点法,是一种利用动态规划的思想寻找给 ...

  6. Floyd算法求无向图最小环

    原理可看菊苣博文:http://www.cnblogs.com/khan724/p/4383686.html 自己代码中解释一些小细节.该算法适用于无向图,而有向图的最小环,实际上就是初始化所有点为i ...

  7. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  8. .弗洛伊德算法求最短路径

    5. 弗洛伊德算法求最短路径 [问题描述] 对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径. [输入形式] 顶点个数n,以及n*n的邻接矩阵,其中不可达使 ...

  9. 佛洛依德算法求最短路径实例

    佛洛依德算法求最短路径实例 #include <iostream> #include <string.h> #include <stdlib.h> #include ...

最新文章

  1. linux主机密钥管理,管理ssh主机和私钥的最佳方法
  2. 学考语言成绩c对高考有影响吗_学考成绩会影响高考录取吗?2021年广东高中学考...
  3. 老男孩教育每日一题-第86天-nfs客户端挂载信息写入/etc/fstab中,系统重启,没有自动挂载是什么原因?...
  4. 外媒称青客公寓计划赴美IPO 筹资1.5亿美元
  5. C# Unity依赖注入
  6. AS3.0文档类:FLASH右键菜单文档类
  7. 举例说明在SQL中,DELETE语句与DROP TABLE的区别
  8. matlab实现振动弹簧的实时动画,仿真动画软件设计作品--理想弹簧振子简谐振动...
  9. 上海交通大学计算机科学与技术招生网,上海交通大学计算机科学与技术研究生招生...
  10. 数仓学习笔记(7)——数仓搭建(DWT层)
  11. 一步一步实现WPF透明化窗口
  12. 【笔记】CMake构建C++工程
  13. TCP的TIME_WAIT状态为什么要等待2MSL的时长
  14. 四舍六入五留双与四舍五入之间的差别
  15. 移动互联网开发教学案例学习-8
  16. 计算机组成原理之外围设备
  17. 云合影程序_毕业季主题活动——云合影
  18. 关于添加android:name=android.permission.INSTALL_PACKAGES报错的解决方法
  19. 基于遗传算法改进的BP神经网络电网负荷预测,GA-BP神经网络电网负荷预测,1000案例之14
  20. matlab 数组去掉0,科学网—在Matlab环境下去除矩阵中的零向量 - 李航的博文

热门文章

  1. 前端模块化(二):模块化编程
  2. php 对象赋值后改变成员变量影响赋值对象
  3. 简单banner制作
  4. Android菜鸟如何学习Android系统开发?
  5. 笨鸟学Android开发(1):HelloWorld
  6. presto领读 查询引擎翻译
  7. CAN总线很难吗?CAN总线看不懂是不可能的!
  8. Linux下的gpio,gpiod
  9. 一直想说的,技术职业化
  10. Service rootservice does not have a SELinux domain defined