算法导论15.1 装配线调度问题
来源:互联网 发布:se网络验证 编辑:程序博客网 时间:2024/06/04 18:17
//15.1装配线调度问题#include <iostream>using namespace std;#define I 2#define J 6int a[I+1][J+1],e[I+1],x[I+1],t[I+1][J+1],n=J;int f[I+1][J+1],l[I+1][J+1],rf,rl;void Input()//输入{int i,j;for(i=1;i<=I;++i){for(j=1;j<=J;++j){cout<<"Please input a["<<i<<"]"<<"["<<j<<"]";cin>>a[i][j];cout<<endl;}}for(i=1;i<=I;++i){cout<<"Please input e["<<i<<"]";cin>>e[i];cout<<endl;}for(i=1;i<=I;++i){cout<<"Please input x["<<i<<"]";cin>>x[i];cout<<endl;}for(i=1;i<=I;++i){for(j=1;j<J;++j){cout<<"Please input t["<<i<<"]"<<"["<<j<<"]";cin>>t[i][j];cout<<endl;}}}void fastest_way()//求装配线的最快路径{int j;f[1][1]=e[1]+a[1][1];f[2][1]=e[2]+a[2][1];for(j=2;j<=n;++j){//求到达f[1][j]的最快路线if(f[1][j-1]+a[1][j]<=f[2][j-1]+t[2][j-1]+a[1][j]){f[1][j]=f[1][j-1]+a[1][j];l[1][j]=1;}else{f[1][j]=f[2][j-1]+t[2][j-1]+a[1][j];l[1][j]=2;}//求到达f[1][j]的最快路线if(f[2][j-1]+a[2][j]<=f[1][j-1]+t[1][j-1]+a[2][j]){f[2][j]=f[2][j-1]+a[2][j];l[2][j]=2;}else{f[2][j]=f[1][j-1]+t[1][j-1]+a[2][j];l[2][j]=1;}}//最终的最快路线的结果if(f[1][n]+x[1]<=f[2][n]+x[2]){rf=f[1][n]+x[1];rl=1;}else{rf=f[2][n]+x[2];rl=2;}}void Print_Stations(){cout<<"输出装配路线"<<endl;int i=rl,j;//i表示最后是从哪条装配路线到达出口的//倒序输出cout<<"line "<<i<<" station "<<n<<endl;for(j=n;j>1;j--){i=l[i][j];cout<<"line "<<i<<" station "<<j-1<<endl;}}void Print_Stations2(int i, int j) { if(j != n) i = l[i][j+1]; //先输出前面的 if(j > 1) Print_Stations2(i, j-1); //再输出当前的 cout<<"line "<<i<<" station "<<j<<endl; } void Output() { int i, j; cout<<"输出f[i][j]"<<endl; //f[i][j]表示一个底盘从起点开始到装配站s[i][j]的最快可能时间 for(i = 1; i <= I; i++) { for(j = 1; j <= J; j++) cout<<f[i][j]<<' '; cout<<endl; } cout<<"输出l[i][j]"<<endl; //l[i][j]表示使得f[i][j]最小时在哪个装配线上装配j-1 for(i = 2; i <= I; i++) { for(j = 1; j <= J; j++) cout<<l[i][j]<<' '; cout<<endl; } } int main() { Input(); fastest_way(); Output(); Print_Stations(); cout<<"顺序输出装配路线"<<endl; Print_Stations2(rl, J); return 0; }