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

批处理作业调度问题

给定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;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值