装配线调度问题
装配一辆汽车,有两条装配线分别有n个装配点,每条装配线在进出所花时间为e[i],x[i] (i=0,1),每个装配点所需时间a[i][j](i=0,1;j=1,2,...,n),从一条装配线i的第j个装配点到另一条装配线的第j+1个装配点所需时间t[i][j](i=0,1;j=1,2,...,n-1).
S[1,1]处理完成所经历的时间 = e1 + a[1,1];
S[1,j] (2<=j<=n)处理完成所经历的时间 =min {S[1,j-1] 处理完成所经历的时间 + a[1,j], S[2,j-1]处理完成所经历的时间 + t[2,j-1] + a[1,j]};
“出口”处理完成所经历的时间 = min {S[1,n]处理完成所经历的时间 + x[1], S[2,n]处理完成所经历的时间 + x[2]}。
于是得到以下递推式(截至《算法导论》):
# define MAX n; int way[3][MAX + 1]; void FindWay(int e[3], int a[3][MAX + 1], int t[3][MAX + 1], int x[3], int sum[3][MAX + 1]) { int i, j, k; sum[1][1] = e[1] + a[1][1]; sum[2][1] = e[2] + a[2][1]; for (i = 2; i <= MAX; i++) { //line 1 if (sum[1][i - 1] + a[1][i] > sum[2][i - 1] + t[2][i - 1] + a[1][i]) { sum[1][i] = sum[2][i - 1] + t[2][i - 1] + a[1][i]; way[1][i] = 2;//way[1][i]记录station[1][i]的前一个station所属的line } else { sum[1][i] = sum[1][i - 1] + a[1][i]; way[1][i] = 1; } //line 2 if (sum[2][i - 1] + a[2][i] > sum[1][i - 1] + t[1][i - 1] + a[2][i]) { sum[2][i] = sum[1][i - 1] + t[1][i - 1] + a[2][i]; way[2][i] = 1; } else { sum[2][i] = sum[2][i - 1] + a[2][i]; way[2][i] = 2; } } if (sum[1][MAX] + x[1] > sum[2][MAX] + x[2]) { cout << "mintime:" << sum[2][MAX] + x[2] << endl; PrintWay(2); } else { cout << "mintime:" << sum[1][MAX] + x[1] << endl; PrintWay(1); } } void PrintWay(int exitline)//反序输出 { int i; cout << "line:" << exitline << "-->" << "station:" << MAX << endl; for (i = MAX; i >=2 ; i--) { cout << "line:" << way[exitline][i] << "-->" << "station:" << i - 1 << endl; exitline = way[exitline][i]; } }