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读取键盘输入的2种方法
Jun 16 Python
Python画图学习入门教程
Jul 01 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
使用Python生成XML的方法实例
Mar 21 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
python回调函数中使用多线程的方法
2017/12/25 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
python安装gdal的两种方法
2019/10/29 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
法制宣传日活动总结
2014/04/29 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
2014年共青团工作总结
2014/12/10 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
实习单位意见
2015/06/04 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技