第五章【回溯法】批处理作业调度问题
来源:互联网 发布:招商证券交易软件 编辑:程序博客网 时间:2024/05/16 05:54
http://blog.csdn.net/yuanyu5237/article/details/6595305
给定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 <iostream>
- 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(f<bestf)
- {
- Swap(x[i], x[j]);
- Backtrack(i+1);
- Swap(x[i], x[j]);
- }
- f1 -= M[x[j]][1]; // -第i次所调度的作业在机器1上的处理时间
- f -= f2[i]; // -第i次所调度的作业在机器2上的处理时间
- }
- }
- int Flow(int **M, int n, int bestx[])
- {
- int ub=INT_MAX;
- Flowshop X;
- X.x = new int[n+1];
- X.f2 = new int[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;
- return X.bestf;
- }
- int main(int argc, char *argv[])
- {
- int **M = new int*[4];
- for(int i=0; i<=3; ++i)
- M[i] = new int[3];
- M[1][1] = 2; M[1][2]=1;
- M[2][1] = 3; M[2][2]=1;
- M[3][1] = 2; M[3][2]=3;
- int *bestx = new int[4];
- for(int m=1; m<=3; m++)
- {
- for(int n=1; n<=2; n++)
- cout << M[m][n] << " ";
- cout << endl;
- }
- cout << Flow(M, 3, bestx) << endl;
- for(int i=1; i<=3; ++i)
- cout << bestx[i] << ",";
- cout << "Press the enter key to exit";
- cin.ignore(cin.rdbuf()->in_avail()+1);
- return 0;
- }
- 第五章【回溯法】批处理作业调度问题
- 第五章 回溯法-批处理作业调度
- 【回溯法】批处理作业调度问题
- 批处理作业调度问题 回溯法
- 回溯法解决批处理作业调度问题
- 回溯法 批处理作业调度问题
- 批处理作业调度-----回溯法
- 回溯法--批处理作业调度
- 算法java实现--回溯法--批处理作业调度问题
- 回溯之批处理作业调度问题
- 第5章 回溯法,批处理作业调度
- 批处理作业调度(回溯法)
- 回溯法实现批处理作业调度
- 回溯法-5.3批处理作业调度
- 批处理作业调度(回溯)
- 批处理作业调度(回溯)
- 算法作业-批处理作业调度-回溯|分支限界法
- Java语言描述:回溯法之批处理作业调度
- android 短信发送器
- 判别分析
- NYOJ-283-对称排序-2013年11月5日22:11:16
- Computer vision with iOS Part 1: Building an OpenCV framework
- 如何获取当前配置的IPV6地址的前缀长度(掩码)
- 第五章【回溯法】批处理作业调度问题
- DP题集
- dbo与db_owner区别
- QtGui实现计算圆的面积
- Linux下驱动开发之一-------Tiny 6410
- 在Linux下简单编写、编译并执行一个C语言程序
- 玉兔号月球车?
- Oracle中Hint深入理解
- 系统分析师复习笔记之数据库篇