Python基于回溯法子集树模板解决最佳作业调度问题示例


Posted in Python onSeptember 08, 2017

本文实例讲述了Python基于回溯法子集树模板解决最佳作业调度问题。分享给大家供大家参考,具体如下:

问题

给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成。每一个作业必须先由机器1 处理,然后由机器2处理。

试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达到最小。

分析:

看一个具体的例子:

tji 机器1 机器2
作业1 2 1
作业2 3 1
作业3 2 3

最优调度顺序:1 3 2

处理时间:18

这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

1,3,2

作业1在机器1上完成的时间为2, 在机器2上完成的时间为3
作业3在机器1上完成的时间为4,在机器2上完成的时间为7
作业2在机器1上完成的时间为7,在机器2上完成的时间为8

3+7+8 = 18

Python基于回溯法子集树模板解决最佳作业调度问题示例

解编码:(X1,X2,...,Xn),Xi表示顺序i执行的任务编号。所以,一个解就是任务编号的一个排列。

解空间:{(X1,X2,...,Xn)| Xi属于S,i=1,2,...,n},S={1,2,...,n}。所以,解空间就是任务编号的全排列。

讲道理,要套用回溯法的全排列模板。

不过,有了前面两个例子做铺垫,这里套用回溯法的子集树模板。

代码

'''
最佳作业调度问题
tji     机器1   机器2
作业1     2     1
作业2     3     1
作业3     2     3
'''
n = 3 # 作业数
# n个作业分别在两台机器需要的时间
t = [[2,1],
   [3,1],
   [2,3]]
x = [0]*n  # 一个解(n元数组,xi∈J)
X = []   # 一组解
best_x = [] # 最佳解(一个调度)
best_t = 0 # 机器2最小时间和
# 冲突检测
def conflict(k):
  global n, x, X, t, best_t
  # 部分解内的作业编号x[k]不能超过1
  if x[:k+1].count(x[k]) > 1:
    return True
  # 部分解的机器2执行各作业完成时间之和未有超过 best_t
  #total_t = sum([sum([y[0] for y in t][:i+1]) + t[i][1] for i in range(k+1)])
  j2_t = []
  s = 0
  for i in range(k+1):
    s += t[x[i]][0]
    j2_t.append(s + t[x[i]][1])
  total_t = sum(j2_t)
  if total_t > best_t > 0:
    return True
  return False # 无冲突
# 最佳作业调度问题
def dispatch(k): # 到达第k个元素
  global n, x, X, t, best_t, best_x
  if k == n: # 超出最尾的元素
    #print(x)
    #X.append(x[:]) # 保存(一个解)
    # 根据解x计算机器2执行各作业完成时间之和
    j2_t = []
    s = 0
    for i in range(n):
      s += t[x[i]][0]
      j2_t.append(s + t[x[i]][1])
    total_t = sum(j2_t)
    if best_t == 0 or total_t < best_t:
      best_t = total_t
      best_x = x[:]
  else:
    for i in range(n): # 遍历第k个元素的状态空间,机器编号0~n-1,其它的事情交给剪枝函数
      x[k] = i
      if not conflict(k): # 剪枝
        dispatch(k+1)
# 测试
dispatch(0)
print(best_x) # [0, 2, 1]
print(best_t) # 18

效果图

Python基于回溯法子集树模板解决最佳作业调度问题示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
让python同时兼容python2和python3的8个技巧分享
Jul 11 Python
python代码制作configure文件示例
Jul 28 Python
Python中unittest用法实例
Sep 25 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
详解flask入门模板引擎
Jul 18 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
python内置数据类型之列表操作
Nov 12 Python
python开发游戏的前期准备
May 05 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
实例详解Python装饰器与闭包
Jul 29 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
python中实现延时回调普通函数示例代码
Sep 08 #Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 #Python
老生常谈Python startswith()函数与endswith函数
Sep 08 #Python
python学习必备知识汇总
Sep 08 #Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 #Python
python 函数传参之传值还是传引用的分析
Sep 07 #Python
windows下python之mysqldb模块安装方法
Sep 07 #Python
You might like
php数组合并与拆分实例分析
2015/06/12 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
Python类的多重继承问题深入分析
2014/11/09 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
python 实现多维数组转向量
2019/11/30 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
jupyter实现重新加载模块
2020/04/16 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
心理学专业毕业生推荐信范文
2013/11/21 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
城市创卫标语
2014/06/17 职场文书
检讨书怎么写
2015/05/07 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL