批处理作业调度问题
给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。
这3个作业的6种可能的调度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它们所相应的完成时间和分别是19,18,20,21,19,19。易见,最佳调度方案是1,3,2,其完成时间和为18。
代码实现:
//批处理作业调度问题
#include <iostream>
#include <climits>
using namespace std;
class Flowshop
{
friend intFlow(int **,int ,int []);
private:
voidBacktrack(int);
int**M, //各作业所需的处理时间
*x, //当前作业调度
*bestx, //当前最优作业调度
*f2, //机器2完成处理时间
f1, //机器1完成处理时间
f, //完成时间和
bestf, //当前最优值
n; //作业数
};
void Swap(int &a, int &b)
{
int temp;
temp = a ;
a = b;
b = temp;
}
void Flowshop :: Backtrack(int i) //搜索第i层结点
{
if(i > n) //到达结点
{
for(int j= 1; j <= n; j++)
{
bestx[j] = x[j]; //当前最优作业调度
}
bestf =f; //当前最优完成时间和
} else {
for(int j= i; j <= n; j++)
{
f1 +=M[x[j]][1];
f2[i]= ((f2[i-1] > f1) ? f2[i-1]:f1) + M[x[j]][2];
f +=f2[i];
if(f< bestf){ //完成时间和小于当前最优值
Swap(x[i],x[j]);
Backtrack(i+1);
Swap(x[i],x[j]);
}
f1-= M[x[j]][1];
f-= f2[i];
}
}
}
int Flow(int **M, int n, int bestx[])
{
int ub =INT_MAX;
Flowshop X;
//初始化X
X.x = newint[n+1];
X.f2 = newint[n+1];
X.M = M;
X.n = n;
X.bestx =bestx;
X.bestf = ub;
X.f1 = 0;
X.f = 0;
for(int i =0; i <= n; i++)
{
X.f2[i] =0;
X.x[i] =i;
}
X.Backtrack(1);
delete []X.x;
delete []X.f2;
returnX.bestf;
}
int main()
{
int**M,*bestx,n;
cout<<"输入作业数:"<<endl;
cin>>n;
M = newint*[n+1];
for(int i =1; i <= n; i++)
{
M[i] =new int[2];
}
for(int k =1; k <= n; k++)
{
for(int j= 1; j <= 2; j++)
{
cout<<"输入第"<<k<<"个作业在机器"<<j<<"上的处理时间:";
cin>>M[k][j];
}
}
bestx = newint[n+1];
for(int t =1; t <= n; t++)
{
bestx[t]= 0;
}
cout<<"最优完成时间:\n"<<Flow(M,n,bestx)<<endl;
cout<<"最佳调度方案:"<<endl;
for(int l =1; l <= n; l++)
{
cout<<bestx[l]<<" ";
}
cout<<endl;
return 0;
}