问题描述

给定 n 个作业的集合 j = {j1, j2, …, jn}。每一个作业 j[i] 都有两项任务分别在两台机器上完成。每一个作业必须先由机器1 处理,然后由机器2处理。作业 j[i] 需要机器 j 的处理时间为 t[j][i] ,其中i = 1, 2, …, n, j = 1, 2。对于一个确定的作业调度,设F[j][i]是作业 i 在机器 j 上的完成处理的时间。所有作业在机器2上完成处理的时间之和 f = sigma F[2][i] 称为该作业调度的完成时间之和。
批处理作业调度问题要求对于给定的 n 个作业,制定最佳作业调度方案,使其完成时间和达到最小。

Before you start:

流水作业调度的最终目标是要求完成所有任务的时间最短,所以把最后一个任务的完成时间作为标准;而批处理作业调度的目的是要让每一个作业都尽快得到处理,所以要把每个作业的完成时间之和作为标准。

两者看上去相似,但实际上还是有区别的,可能在某些情况下调度是顺序是一样的。
批处理作业采用回溯法,一定能够得到最优解,因为你搜索的是整个解空间;
流水作业调度采用动态规划法,同样能够等到最优解,这个是可以证明的。
这就是为什么?

self.totaltime += self.f2[depth]

代码实现如下:

class FlowShop:def __init__(self,N,mission):   self.N = N #作业数目self.mission = mission #作业时间self.bestFinishtime = 10000 #最优完成时间self.schedule = [i for i in range(N)] #当前的策略self.bestSchedule = [0]*N #最优策略self.f2 = [0]*N #机器2每个任务完成处理的时间self.f1 =0 #机器1任务完成处理的时间self.totaltime = 0 #机器2每个任务完成处理的时间,求和,这个时间是每个作业完成时间之和self.depth = 0 #def back_tracking(self,depth):#递归出口if depth > self.N-1:self.bestFinishtime = self.totaltimeself.bestSchedule[:] = self.schedule[:]return #机器1作业时间else:for i in range(depth,self.N):self.f1 +=self.mission[0][self.schedule[i]]#机器2作业完成时间if depth ==0:self.f2[depth] = self.f1 + self.mission[1][self.schedule[i]]else:self.f2[depth] = max(self.f1,self.f2[depth-1]) + self.mission[1][self.schedule[i]]#   这个时间是每个作业完成时间之和,为了让每个作业尽可能早的完成self.totaltime += self.f2[depth]# 满足条件,进入下一层处理,这个看成一个模块if self.totaltime < self.bestFinishtime:self.schedule[i],self.schedule[depth] = self.schedule[depth],self.schedule[i]self.back_tracking(depth+1)self.schedule[i],self.schedule[depth] = self.schedule[depth],self.schedule[i]#   回溯处理,又可以理解为没有进入下一层,对上面操作进行undo回溯self.f1 -=self.mission[0][self.schedule[i]]self.totaltime -= self.f2[depth]def print_back_tracking(self):self.back_tracking(self.depth)print self.bestScheduleprint self.bestFinishtimeN = 3
mission = [[2,3,2],[1,1,3]]
instance = FlowShop(N,mission)
instance.print_back_tracking()[0, 2, 1]
18

回溯法:批量作业调度相关推荐

  1. 算法设计与分析——回溯法——批处理作业调度

    问题描述:给定n个作业的集合{J1,J2,-,Jn}.每个作业必须先由机器1处理,然后由机器2处理.作业Ji需要机器j的处理时间为tji.对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时 ...

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

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

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

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

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

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

  5. 五大算法思想(三)回溯法及常见例子

    文章目录 一.理论基础 1.1 基本策略 1.2 使用步骤 1.3 经典例子 二.常见例子 2.1 八皇后问题 2.2 装载问题 2.3 批量作业调度问题 2.4 背包问题 一.理论基础   回溯法作 ...

  6. 回溯法 -数据结构与算法

    1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术 ...

  7. 批处理作业调度问题 ——回溯法详解

    1.问题描述 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理.作业Ji需要机器j的处理时间为tji.对于一个确定的作业调度,设Fji是作业i在机器j上完 ...

  8. 回溯法(算法分析与设计)

    0.回溯法的算法框架 A.简介 回溯法,又称试探法.一般需要遍历解空间,时间复杂度概况:子集树Ω(2^n),排序树Ω(n!),暴力法 B.回溯法解题三步骤 1)定义问题的解空间 如0-1背包问题,当n ...

  9. 计算机算法设计与分析(第五版)---王晓冬--------前六章(递归与分治,动态规划,贪心算法,回溯法,)期末复习资料总结

    --1--  算法:解决问题的一种方法或者一个求解过程 是若干指令的序列 输入 输出 有限性 确定性 程序:用某种设计语言对算法的具体实现 可以不满足 有限性 程序 = 算法+数据结构 果子合并问题( ...

最新文章

  1. 在VMware ESX Server使用华为存储
  2. mongodb 设置远程可以访问
  3. 统计分组的原则是要体现什么_统计学简答题
  4. 数据科学家十年后彻底消失?25年行业元老:无稽之谈!
  5. [记录]java.math.biginteger cannot be cast to java.lang.long
  6. 生成二维码接口,前端调用接口将二维码显示在页面上
  7. 【数据结构与算法】浅谈队列的应用
  8. 对于早期Servlet内核你清楚吗,这些基础的东西,不能忘哦
  9. cmake取消宏定义_魔兽怀旧服,牧师实用宏
  10. Android Studio(14)--点9图片怎么玩
  11. 2月25日线上见!iQOO 3发布会官宣:定义新速度
  12. 网易云音乐刷听歌量_网易云音乐极速版悄然上线!听歌体验同之前没有差别
  13. matlab练习程序(方框模糊)
  14. 干货!一文带您读懂区块链溯源!
  15. 市场推广的及时性要素
  16. TP框架设置的LOG_LEVEL不起作用
  17. java接收前端JSON字符串
  18. Java面试面经大合集(含答案),大厂越来越简单进了,
  19. 京东云PostgreSQL在GIS场景的应用分享
  20. java7java8 集合中对象的某一个字段分组

热门文章

  1. 移动webhead参数
  2. python自动化库_Python自动化测试常用库整理
  3. element vue 获取select 的label_Vue动态组件component的深度使用
  4. 集合在枚举数实例化后进行了修改_(编程知识)C# 枚举与位枚举
  5. 解决Could not load dynamic library ‘cudnn64_7.dll‘; dlerror cudnn64_7.dll not found
  6. mysql多字段修改update_MySQL ------ 触发器(TRIGGER)(二十七)
  7. html 属于mvvm框架,mvvm模式和mvc的区别是什么?
  8. vpc 网络隔离_专有网络(VPC)的六大应用场景
  9. python3 join函数_Python中.join()和os.path.join()两个函数的用法详解
  10. mysql 判断是否日期类型_MySQL:日期类型