【算法导论】动态规划--装配线调度问题

来源:互联网 发布:如何下载淘宝助理 编辑:程序博客网 时间:2024/04/29 11:14
/*********题目为算法导论《第15章 动态规划》问题1 *********************装配线调度问题*******************************************************************/#include<stdio.h>#define N 6 //定义装备站的个数#define LineNum 2int main(){int a[LineNum][N] ={ {7,9,3,4,8,4},                  {8,5,6,4,5,7}};//定义每个装配站需要的时间int t[LineNum][N-1] = { {2,3,1,3,4},                   {2,1,2,2,1}  };//定义从一条装配线转到另一条需要的时间 ,ex:t[0][1]=2表示从line1的S1转到line2的S2需要2个时间int X1 =3, X2 =2;//出装配线时间int e1 =2, e2 =4;//进装配线时间int f[LineNum][N] = {{0}, {0}};  //保存从起点到终点s(i,j)的最短时间int Full_time = 0;               //保存总的时间/*保存经过的线路,元素的值为某一条装配线;ex:l[0][2]=0表示从line1(0+1)出发的最短路中,经过站点1(由2-1得到)的线路是第1条装配线,0表示线路1, 1表示线路2*/int l[2][N] = {{0}, {0}};  int Line_out = -1;  //保存从哪条线走出装配线int path[N] = {-1}; //保存正序的最短装配路线int i,j;f[0][0] = e1 + a[0][0];f[1][0] = e2 + a[1][0];for(j = 1; j < N; j++){if(f[0][j-1] + a[0][j] <= f[1][j-1] +  t[1][j-1] + a[0][j] ){f[0][j] = f[0][j-1] + a[0][j];l[0][j] = 0;//从线路1走并加工的时间小于从线路2走过来+加工时间+换线时间,故记下此节点走线路1}else{f[0][j] = f[1][j-1]  + t[1][j-1]+ a[0][j];l[0][j] = 1;}if(f[1][j-1] + a[1][j] <= f[0][j-1] + t[0][j-1]+ a[1][j]){f[1][j] = f[1][j-1] + a[1][j];l[1][j] = 1; }else{f[1][j] = f[0][j-1]  + t[0][j-1]+ a[1][j];l[1][j] = 0;}}if(f[0][N-1] + X1 <= f[1][N-1] + X2){Line_out = 0;Full_time = f[0][N-1] + X1;}else{Line_out = 1;Full_time = f[1][N-1] + X2;}printf("full time is %d\n", Full_time);i = Line_out;for(j = N-1; j >1; j--){i = l[i][j]; //这里很巧妙,l[i][j]取出来的是通过s(i,j)的需要走的线,同时i又作为下一次选择的参数path[j] = i;}for(i = 1; i < N; i++){printf("line: %d, station: %d\n", path[i]+1, i);}printf("line: %d, station: %d\n", Line_out+1, N);scanf("%d", &i);}

原创粉丝点击