装配线调度问题(算法导论+动态规划)

某汽车工厂有2个装配线,每个装配线有n 个装配站(按顺序编号1~n ),两个装配线对应的装配站执行相同的功能,但所用的时间可能不同。经过第i条流水线(i=1,2)的第j 个装配站所花的时间为Aij。从第i条流水线的第j 个装配站移到第j+1个装配站的时间可以忽略,而移到另外一个流水线的下一个装配站则需要一定的时间Tij。
汽车进入流水线不需要花时间,出流水线时需要花时间Tin。
汽车的装配需要按顺序经过所有装配站。
现在已知装配时间Aij 和转移时间Tij,要求输出装配一辆汽车所需要的最短时间。


 

// 装配线调度问题.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#define n 6
using namespace std;
int e1=2,e2=4;
int x1=3,x2=2;
int f[2][6];]//装配站的时间
int l[2][6];//装配线
int a[2][6]={{7,9,3,4,8,4},{8,5,6,4,5,7}};
int t[2][5]={{2,3,1,3,4},{2,1,2,2,1}};
int last;//最后出口
int result;//总结果
void fast_way(int a[][6],int t[][5])
{
	f[0][0]=e1+a[0][0];
	f[1][0]=e2+a[1][0];
	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][5]+x1)<=(f[1][5]+x2))
		{
			result=f[0][5]+x1;
			last=0;
		}
		else
		{
			result=f[1][5]+x2;
			last=1;

		}

	}
}
void print_line(int l[][6],int last)
{
	int i=last;
	int j;
	cout<<"line "<<(i+1)<<",station"<<n<<endl;
	for(j=5;j>=1;j--)
	{
		i=l[i][j];
		cout<<"line "<<(i+1)<<",station"<<j<<endl;
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	fast_way(a,t);
	print_line(l,last);
	cout<<"所需要的时间为"<<result<<endl;
	return 0;
}


你可能感兴趣的:(算法)