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利用elaphe制作二维条形码实现代码
May 25 Python
Python单链表的简单实现方法
Sep 23 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
深入浅析Python中的yield关键字
Jan 24 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python 控制终端输出文字的实例
Jul 12 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
Python的这些库,你知道多少?
Jun 09 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打印输出函数汇总
2016/08/28 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
Array对象方法参考
2006/10/03 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
如何利用Fabric自动化你的任务
2016/10/20 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
Python bisect模块原理及常见实例
2020/06/17 Python
学校门卫工作职责
2013/12/07 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
辞职信如何写
2015/02/27 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
叶问观后感
2015/06/15 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
六年级作文之自救
2019/12/19 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL