装配线调度问题
装配一辆汽车,有两条装配线分别有n个装配点,每条装配线在进出所花时间为e[i],x[i] (i=0,1),每个装配点所需时间a[i][j](i=0,1;j=0,1,...,n-1),从一条装配线i的第j个装配点到另一条装配线的第j+1个装配点所需时间t[i][j]。
![](https://pic002.cnblogs.com/images/2011/266130/2011061123414838.png)
对于图来说(截至《算法导论》)::
S1,1 处所需时间 = e1 + a1,1;
S1,j (2<=j<=n)处所需时间min {到S1,j-1 所需时间 + a1,j, 到S2,j-1 所需时间 + t2,j-1 + a1,j};
出口处所需时间 min {到S1,n所需时间 + x1, 到S2,n所需时间 + x2}。
于是得到以下递推式(截至《算法导论》):
![](https://pic002.cnblogs.com/images/2011/266130/2011061123505676.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | /** * @brief 求装配一辆汽车经过装配线所需最少时间 * @param a a[i][j](0<=i<=1,0<=j<n) i号装配线第j个装配点装配所需时间 * @param t t[i][j](0<=i<=1,0<=j<n-1) i号装配线第j个装配点到另一条装配线的第j+1个装配点所需时间 * @param e e[i](0<=i<=1) 汽车地盘进入装配线的第一个装配点所需时间 * @param x x[i](0<=i<=1) 成品汽车出装配线所需时间 * @param f f[i][j](0<=i<=1,0<=j<n) i号装配线第j个装配点完成装配所需最少时间 * @param l l[i][j](0<=i<=1,1<=j<n) i号装配线第j个装配点之前是另一条装配线的第j-1个装配点(记录第j-1个装配点是哪条装配线上的) * @param n 每个装配线上装配点的个数 * @param fend 最终所需最少时间 * @param lend 记录最后经过的装配点所属的装配线号 * @remark 由于编程习惯,把装配线分为装配线0,1, */ void FastestWay( int a[2][MAXN+10], int t[2][MAXN+10], int e[2], int x[2], int n, int f[2][MAXN+10], int l[2][MAXN+10], int &fend, int &lend) { f[0][0] = e[0] + a[0][0]; f[1][0] = e[1] + a[1][0]; cout << a[0][1] << endl; cout << a[1][1] << endl; for ( int 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; } 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] + x[0] <= f[1][n-1] + x[1]) { fend = f[0][n-1] + x[0]; lend = 0; } else { fend = f[1][n-1] + x[1]; lend = 1; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 打印路径 */ void PrintStation( int l[2][MAXN+10], int n, int fend, int lend) { int i = lend; cout << "line " << i << ",station " << n - 1 << endl; for ( int j = n - 1; j >= 1; j--) { i = l[i][j]; cout << "line " << i << ",station " << j - 1 << endl; } } |
over
/**************************************************************************
原文来自博客园——Submarinex的博客: www.cnblogs.com/submarinex/
*************************************************************************/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步