算法导论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;  }  

原创粉丝点击