动态规划-流水线问题
2016-04-09 15:26
302 查看
流水线问题如图所示,两条流水线上相应位置上的梯级S1j和S2j所完成的任务相同,但完成时间不同分别为c1j和c2j。指令从内存发射到流水线上的时间分别为c10,c20。如果从一条流水线转移到另一个流水线,产生流动成本x。这个问题的最优解决方案里面包含了对子问题的最优解,这就是动态规划里面的最优子结构。所以我们选择动态规划来解决流水线问题。这种由底至上的算法的效率是线性的。
/**流水线问题,用动态规划解决O(n) * @author Qing * */ public class pipeline { final static int N = 7;//流水线长度 public final static int[][] c={{4,2,8,7,2,4,1,1},{1,5,1,4,2,3,2,2}};//两条流水线完成任务时时间分别为c1j和c2j public final static int[][] x = {{1,2,4,1,3,4,2},{1,4,1,2,2,1,2}};//从一条流水线到另一条的流动成本 public static int[][] t = new int[2][N+1];//tj为通过Sj的最短时间 public static int[][] l = new int[2][N+1];//lj为到达Sj最快路线上梯级j-1所处的线路(1或者2) public static int t_final = 0; public static int l_final = 0; public static void fastWay(){ t[0][1] = c[0][0] + c[0][1]; t[1][1] = c[1][0] + c[1][1]; for(int j = 2; j <= N; j ++){ //t1j选择 if(t[0][j-1] + c[0][j] <= t[1][j-1]+c[1][j]+x[1][j-2]){ t[0][j] = t[0][j-1] + c[0][j]; l[0][j] = 1; } else{ t[0][j] = t[1][j-1]+c[1][j] + x[1][j-2]; l[0][j] = 2; } //t2j选择 if(t[1][j-1] + c[1][j] <= t[0][j-1]+c[0][j] +x[0][j-2]){ t[1][j] = t[1][j-1] + c[1][j]; l[1][j] = 2; } else{ t[1][j] = t[0][j-1]+c[0][j]+x[0][j-2]; l[1][j] = 1; } //最后阶梯选择 if(t[0] + x[0][N-1] <= t[1] +x[1][N-1]){ t_final = t[0] + x[0][N-1]; l_final = 1; } else{ t_final = t[1] +x[1][N-1]; l_final = 2; } } } public static void main(String[] args){ System.out.println("流水线问题:"); fastWay(); int line_choose = l_final; System.out.println("pipe line choose " + line_choose +", the stage is "+N); for(int j = N; j >=2; j--){ line_choose = l[line_choose-1][j]; System.out.println("pipe line choose " +line_choose +", the stage is " + (j-1)); } } }运行结果
本算法及其实现详情参考算法之道(第二版)第4章动态规划思想
相关文章推荐
- 移动开发工具 Charles 使用介绍
- Ubuntu vi 上下左右不正常
- 最大的矩形
- Android2.3 MediaPlayer系统祥解系列(概述)
- spring - property和constructor-arg的使用
- 2016年4月7日 - 2016年4月9日笔记
- 设z=〖(1+xy)〗^y,求 ∂z/∂y
- 南阳oj 题目6 喷水装置(一)
- jquery 验证插件简单原理
- 练习15:读取文件
- Android学习基本索引(四)——记录,没事自己看
- php 中的伪静态
- 拉勾网大数据相关岗位数据爬虫分析
- iOS获取UUID,并使用keychain存储
- java 对象与内存
- Intent中各种常见的Action
- spring profile来用不同的文件,配置不同的环境, deploy不同的war
- 软件工程结对作业02
- Scala类与对象
- poj 3281 Dining (最大流解决匹配问题)