回溯之批处理作业调度问题

来源:互联网 发布:淘宝上买dota2饰品 编辑:程序博客网 时间:2024/06/11 06:52

批处理作业调度问题

给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。

批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。


3个作业的6种可能的调度方案是1,2,31,3,22,1,32,3,13,1,23,2,1;它们所相应的完成时间和分别是191820211919。易见,最佳调度方案是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;}