《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;
}