#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=105;
const int inf=0x3f3f3f3f;
int n,bestf,f1,f2,f;//f1在第一台机器上加工的完成时间,f2在第二台机器上加工的完成时间,f完成时间和;
int x[maxn],bestx[maxn]; //x[i]表示第i个应该处理的作业;bestx最有调度顺序
struct node{
int x,y;//机器零件在第一台机器上的加工时间x和第二台机器上的加工时间y
}T[maxn];
void backtrack(int t){
if(t>n){
for(int i=1;i<=n;i++)
{
bestx[i]=x[i];//(1)记录最优调度顺序;
}
bestf=f; //(2)记录最优时间和;
return ;
}
for(int i=t;i<=n;i++){//排列树
f1+=T[x[i]].x;
int temp=f2;
f2=max(f1,f2)+T[x[i]].y;
f+=f2;
if(f<bastf)//(3)限界条件填充;
{
Swap(x[t],x[i]); //(4)交换;
backtrack(t+1); //(5)继续深搜;
Swap(x[t],x[i]); //(6)还原现场,复位反操作;
}
f1-=T[x[i]].x;//还原现场
f-=f2;
f2=temp;
}
}
void Intnit(int a[],int b[])
{
for(int i=1;i<=n;i++)//初始化作业处理时间
{
T[i].x=a[i];
T[i].y=b[i];
x[i]=i;
}
}
void print(){
cout<<"最优机器零件加工顺序:";
for(int i=1;i<=n;i++) //输出最优加工顺序
cout<<bestx[i]<<" ";
cout<<endl;
cout<<"最优机器零件加工时间和:";
cout<<bestf<<endl;
}
int main(){
n=3;
int f1t[4]={0,2,3,2};
int f2t[4]={0,1,1,3};
Intnit(f1t,f2t) ;//初始化作业处理时间
bestf=inf; //初始化为无穷大
f1=f2=f=0;
backtrack(1); // 深搜排列树
print();
return 0 ;
}
批处理作业调度
于 2023-05-22 12:36:37 首次发布