《1》装配线调度:
问题描述
一个汽车公司在有2条装配线的工厂内生产汽车,每条装配线有n个装配站,不同装配线上对应的装配站执行的功能相同,但是每个站执行的时间是不同的。在装配汽车时,为了提高速度,可以在这两天装配线上的装配站中做出选择,即可以将部分完成的汽车在任何装配站上从一条装配线移到另一条装配线上。装配过程如下图所示:
装配过程的时间包括:进入装配线时间e、每装配线上各个装配站执行时间a、从一条装配线移到另外一条装配线的时间t、离开最后一个装配站时间x。举个例子来说明,现在有2条装配线,每条装配线上有6个装配站,各个时间如下图所示:
从图中可以看出按照红色箭头方向进行装配汽车最快,时间为38。分别现在装配线1上的装配站1、3和6,装配线2上装配站2、4和5。
代码:
<dynamicPlan.h>
#pragma once
#inclue<iostream>
using namespace std;
#define N 6
int last_f;
int last_l;
void fastest_way(int a[][N],int t[][N-1],int e[],int x[],int f[][N],int l[][N],int n)
{
int i,j;
f[0][0] = e[0] + a[0][0];
f[1][0] = e[1] + a[1][0];
l[0][0] = 1; //保存从哪个站到哪个站
l[1][0] = 2;
for(j=1;j<n;j++)
{
if(f[0][j-1] < f[1][j-1] + t[1][j-1])//跟同时到达下一个位置的前面的事件相那个比较
{
f[0][j] = f[0][j-1] + a[0][j];
l[0][j] = 1;
}
else
{
f[0][j] = f[1][j-1] + t[1][j-1] + a[0][j];
l[0][j] = 2;
}
if(f[1][j-1] < f[0][j-1] + t[0][j-1])
{
f[1][j] = f[1][j-1] + a[1][j];
l[1][j] = 2;
}
else
{
f[1][j] = f[0][j-1] + t[0][j-1] + a[1][j];
l[1][j] = 1;
}
}
if(f[0][n-1] + x[0] < f[1][n-1] + x[1])
{
last_f = f[0][n-1] + x[0];
last_l = 1;
}
else
{
last_f = f[1][n-1] + x[1];
last_l = 2;
}
}
void print_station(int l[][N],int last_l,int n)
{
int i = last_l;
int j;
printf("line %d,station %d\n",i,n);
for(j=n-1;j>0;--j)
{
i = l[i-1][j];
printf("line %d,station %d\n",i,j);
}
}
#include"dynamicPlan.h"
int main()
{
int Station[2][6] = {{7,9,3,4,8,4},{8,5,6,4,5,7}};
int Midtime[2][5] = {{2,3,1,3,4},{2,1,2,2,1}};
int f[2][6] = {0};
int l[2][6] = {0};
int Exern[2] = {2,4};
int Out[2] = {3,2};
int i,j;
fastest_way(a,t,e,x,f,l,6);
print_station(l,last_l,6);
return 0;
}