zoukankan      html  css  js  c++  java
  • 装配线调度问题

    装配一辆汽车,有两条装配线分别有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]。
    对于图来说(截至《算法导论》)::
    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}。
    于是得到以下递推式(截至《算法导论》):
     
    /**
     * @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;
    	}
    }
    
    /**
     * 打印路径
     */
    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/               
      *************************************************************************/

  • 相关阅读:
    Winform配置文件读写操作
    Winform 实现图片轮播(解决Image.FromFile内存不足)
    asm磁盘dd破坏恢复
    文件系统重新分区oracle恢复
    删除分区 oracle asm disk 恢复
    raid强制上线后数据库无法启动故障处理
    记录一次oracle现场故障处理经过
    .makop病毒加密数据库恢复
    Oracle Recovery Tools解决数据库open过程报 ORA-01555错误
    操作系统层面反删除恢复文件损坏太多处理—-oracle碎片恢复
  • 原文地址:https://www.cnblogs.com/submarinex/p/2078636.html
Copyright © 2011-2022 走看看