算法和数据结构|【回溯法】批处理作业调度问题

给定n个作业的集合J=(J1,J2,...,Jn)。每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji;i=1,2,...n;j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和f=F21+F21+...+F2n成为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。
分析:批处理作业调度问题要从n个作业的所有排列中找出最小完成时间和的作业调度,所以批处理作业调度的解空间是一颗排列树。按照回溯法搜索排列树的算法框架,设开始时x=[1,2,...,n]是所给的n个作业,则相应的排列树由x[1:n]的所有排列构成。
【算法和数据结构|【回溯法】批处理作业调度问题】递归回溯

#include using namespace std; class Flowshop; int Flow(int **,int, int []); void Swap(int &a, int &b) { int temp=a; a=b; b=temp; }class Flowshop { friend int Flow(int **,int, int []); private: void Backtrack(int i); int **M,//各作业所需的处理时间 *x,//当前作业调度 *bestx,//当前最优作业调度 *f2,//机器2完成处理的时间 f1,//机器1完成处理的时间 f,//完成时间和 bestf,//当前最优值 n; //作业数 }; void Flowshop::Backtrack(int 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)// 因为问题的解空间是一颗由x[1:n]的所有排列构成的排列树 { // 所以第i次所调度的作业是从序号为i到n的作业中选择一个座位子树分支 f1 += M[x[j]][1]; // +第i次所调度的作业在机器1上的处理时间 f2[i] = ((f2[i-1]>f1) ? f2[i-1] : f1) + M[x[j]][2]; f += f2[i]; //+第i次所调度的作业在机器2上的处理时间 if(fin_avail()+1); return 0; }




    推荐阅读