装配线调度问题

 
装配一辆汽车,有两条装配线分别有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];
    }
}
View Code
 
原文地址:https://www.cnblogs.com/mmcmmc/p/3892124.html