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 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
Python3实现定时任务的四种方式
Jun 03 Python
什么是Python中的顺序表
Jun 02 Python
python实现数字炸弹游戏
Jul 17 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 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
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
protractor的安装与基本使用教程
2017/07/07 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Python变量访问权限控制详解
2019/06/29 Python
python3字符串操作总结
2019/07/24 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
Python用input输入列表的实例代码
2020/02/07 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
新领导上任欢迎词
2014/01/13 职场文书
购房协议书范本
2014/04/11 职场文书
小学生暑假家长评语
2014/04/17 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
团队队名口号大全
2014/06/06 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
校运会加油稿大全
2015/07/22 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL