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文档生成工具pydoc使用介绍
Jun 02 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
使用python 3实现发送邮件功能
Jun 15 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
Python实现分段线性插值
Dec 17 Python
Python统计分析模块statistics用法示例
Sep 06 Python
tensorflow 实现数据类型转换
Feb 17 Python
python3.7添加dlib模块的方法
Jul 01 Python
Python容器类型公共方法总结
Aug 19 Python
Python实现排序方法常见的四种
Jul 15 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
一个用于网络的工具函数库
2006/10/09 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
js 获取Listbox选择的值的代码
2010/04/15 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python三引号输出方法
2019/02/27 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
广州一家公司的.NET面试题
2016/06/11 面试题
软件测试英文面试题
2012/10/14 面试题
幼儿园教师师德师风承诺书
2015/04/28 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android