问题描述:给定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。

以1,2,3为例:
作业1在机器1上完成的时间为2,在机器2上完成的时间为3
作业2在机器1上完成的时间为5,在机器2上完成的时间为6
作业3在机器1上完成的时间为7,在机器2上完成的时间为10
3+6+10=19,所以时间和为19。

以1,3,2为例:
作业1在机器1上完成的时间为2,在机器2上完成的时间为3
作业3在机器1上完成的时间为4,在机器2上完成的时间为7
作业2在机器1上完成的时间为7,在机器2上完成的时间为8
3+7+8=18,所以时间和为18。

批处理作业调度问题要从n个作业的所有排列中找出具有最小完成时间和的作业调度,所以如图,批处理作业调度问题的解空间是一颗排列树。按照回溯法搜索排列树的算法框架,设开始时x=[1,2,……n]是所给的n个作业,则相应的排列树由x[1:n]的所有排列构成。

算法分析:

#include<iostream>#include<stdlib.h>
using namespace std;
class Flowshop
{public:int **M;//各作业需要的处理时间 int *x;//当前作业调度 int *bestx;//当前最优作业调度 int *f2;//机器2完成处理时间 int f1;//机器1完成处理时间 int f;//完成时间和 int bestf;//当前最优值 int n;//作业数量 void Backtrack(int i);//回溯算法 };void Flowshop::Backtrack(int i)
{if(i>n){for(int i=1;i<=n;i++)//记录路径 {bestx[i]=x[i];}bestf = f;//因为到了叶子结点了,不需要判断了 }else{for(int j=i;j<=n;j++)//分枝数 {//设置作业在机器1完成的时间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 = 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 n;cout<<"请输入要处理作业的数量:";cin>>n;int bestx[n+1];int **M =new int *[n+1];for(int i=0;i<n+1;i++){M[i]= new int [3];}cout<<"请输入每个作业在两个机器上工作的处理时间序列:(如1 2):"<<endl; for(int i=1;i<=n;i++){cin>>M[i][1]>>M[i][2];}cout<<"所有作业在机器2上的完成时间和(该作业调度的完成时间)为:"<<Flow(M,n,bestx);
}


算法的时间复杂度为O(n!)

算法设计与分析——回溯法——批处理作业调度相关推荐

  1. 算法设计与分析-回溯法

    单选题 关于回溯法以下叙述中不正确的是( ). A. 回溯法有"通用解题法"之称,它可以系统地搜索一个问题的所有解或任意解 B. 回溯法是一种既带系统性又带跳跃性的搜索算法 C. ...

  2. 算法设计与分析——回溯法——装载问题

    0027算法笔记--[回溯法]回溯法与装载问题 自己写的代码: #include <iostream> using namespace std; template <class Ty ...

  3. 算法设计与分析——回溯法——n皇后问题

    一.什么是N皇后问题? 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后 ...

  4. 算法设计与分析——回溯法——圆排列问题

    #include<iostream> #include<math.h> using namespace std; class Circle {public:float Cent ...

  5. 算法设计与分析——回溯法——旅行售货员问题

    #include<iostream> #include<bits/stdc++.h> using namespace std; const int noEdge=65535; ...

  6. 算法设计与分析——回溯法——符号三角形问题

    #include<iostream> using namespace std;class Triangle{public:void Backtrack(int t);int n;//第一行 ...

  7. 算法设计与分析——第五章回溯法 批处理作业调度 + 最大团问题+图的m着色问题

    文章目录 6.批处理作业调度(排列树) 7.最大团问题 8.图的m着色问题 6.批处理作业调度(排列树) 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理 ...

  8. 回溯法——批处理作业调度

    问题描述     给定 n 个作业的集合 j = {j1, j2, ..., jn}.每一个作业 j[i] 都有两项任务分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理.作业 j ...

  9. 回溯法 批处理作业调度_不懂调度系统架构,就不要谈银行数据仓库

    调度系统是数据仓库的重要组成部分,也是每个银行或公司一个基础软件或服务,需要在全行或全公司层面进行规划,在全行层面统一调度工具和规范,由于数据类系统调度作业较多,交易类系统批量优先级高,为不互相影响可 ...

最新文章

  1. win下使用QT添加VTK插件实现点云可视化GUI
  2. 第三波精品Android源码袭来!免费下载
  3. ThreadPool原理介绍
  4. 程序员面试题精选100题(57)-O(n)时间的排序[算法]
  5. DbgView软件 查看VC++ MFC 程序的打印信息
  6. ElementUI的el-cascader级联选择器各个属性的设置
  7. 15个C++项目列表
  8. java学习(24):if..else...if
  9. axios某一接口失败后不调用_axios 源码系列之如何取消请求
  10. Numpy random生成不重复的随机数
  11. DCMTK的Lib 引用顺序
  12. 投资五大基本法则,助你在理财投资路上走得更平稳顺利
  13. Linux中的7件武器详解
  14. Axure RP 9 for mac 高保真原型图 - 案例18 【导航栏-展开、收起】导入元件库
  15. chrome frame解决IE9一下不兼容问题
  16. cad线性标注命令_CAD线性标注命令的使用方法
  17. Python之XML解析
  18. html中选择器是什么意思,css选择器是什么意思?
  19. latex怎么打区间_latex 函数中间点
  20. Prometheus 告警配置以及抑制规则inhibit_rules 说明

热门文章

  1. go 返回mysql数组_Go基础之--操作Mysql(一)
  2. 【重磅】ArcGIS 10.8手把手经典图文安装教程(附安装包全套装下载,亲测可用)
  3. Excel实用函数大全(名称、功能、说明、用法、举例)
  4. Android之检查跳转的Activity是否存在
  5. python是偏向bs还是cs_CS与BS架构区别、比较、及现状与趋势分析
  6. python测试之道pdf百度云_Python测试之道——笔记1
  7. 看完这些,孩子的学习效率提高10倍
  8. 不爱读书怎么办?用这个新奇的方法,熟知137亿年来的地球通史
  9. php中unset面试题,php unset和引用——由一道php面试题引发的思考
  10. 华为交换机不同网段互访_华为S5700系列交换机使用高级ACL限制不同网段的用户互访...