动态规划算法之装配线调度

找工作的时候,才发现算法的重要性,特别是找互联网相关的工作时,算法显的尤为重要。本人以前从事的是嵌入式方面的学习和研究,但找的工作时云计算,趁着去工作之前的空档期,恶补一下算法,争取能坚持下去。

今天就是算法导论的高级技术和分析技术开始。前面章节讲的数据结构和排序算法有一些涉猎,就此略过。今天学习动态规划算法。

类似于分治算法,动态规划算法也是组合子问题的解来解决整个问题。但是动态规划算法的子问题不是独立的,也就存在重复的求解公共的子问题,动态规划对每个子问题只求解一次,将其结果保存到一张表中,从而避免的重复求解的情况。

1、装配线调度问题。算法导论P193,其中图1为题目,图2为公式推导,图3为伪代码。


图1


图2


图3

如上述3幅图片所示,每一次循环都用数组记录下到达该站的最小代价(F数组)和当前所出的生产线(L数组),根据F数组能够确定最小代价,根据L数组可以找到花费做最小代价的路径。
下面的代码为找到代价最小的路劲并打印出该路径。
#include<stdio.h>
int main(void)
{
int S1[6] = {7,9,3,4,8,4};
int S2[6] = {8,5,6,4,5,7};
int T1[5] = {2,3,1,3,4};
int T2[5] = {2,1,2,2,1};
int E1=2,E2=4,X1=3,X2=2;
int F1[6],F2[6],L1[6],L2[6],Fmin,Lmin;
int i,line;
F1[0] = E1+S1[0];
F2[0] = E2+S2[0];
L1[0] = 1;
L2[0] = 2;
for(i=1; i<6; i++)
{
if(S1[i]+F1[i-1] > S1[i]+F2[i-1]+T2[i-1])
{
F1[i] = S1[i]+F2[i-1]+T2[i-1];
L1[i] = 2;
}
else
{

F1[i] = S1[i]+F1[i-1];
L1[i] = 1;
}
if(S2[i]+F2[i-1] > S2[i]+F1[i-1]+T1[i-1])
{
F2[i] = S2[i]+F1[i-1]+T1[i-1];
L2[i] = 1;
}
else
{

F2[i] = S2[i]+F2[i-1];
L2[i] = 2;
}
}
if(F1[5] > F2[5])
{
Fmin = F2[5]+X2;
Lmin = 2;
}
else
{
Fmin = F1[5]+X1;
Lmin = 1;
}
printf("Fmin = %d,Lmin = %d\n", Fmin,Lmin);
line = Lmin;
for(i=5; i>=0; i--)
{
printf("Line %d,Positon %d\n", line,i+1);
if(1 == line)
line = L1[i];
else
line = L2[i];
}
return 0;
}

如代码实现,复杂度为O(n),书上说如果采用递归方法的话复杂度为O(2^n),这点不太理解,忘有人详细解答。

猜你喜欢

转载自blog.csdn.net/zhangjiajieshiyongdi/article/details/12290273