您的位置:首页 > 其它

动态规划-流水线问题

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章动态规划思想
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: