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实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python 类的特殊成员解析
Jun 20 Python
python之文件读取一行一行的方法
Jul 12 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
Python设计模式之外观模式实例详解
Jan 17 Python
python字符串循环左移
Mar 08 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
python 实现在一张图中绘制一个小的子图方法
Jul 07 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 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/10/10 PHP
浅谈php7的重大新特性
2015/10/23 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
基于jquery的滑动样例代码
2010/11/20 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
Python里面如何实现tuple和list的转换
2012/06/13 面试题
房屋产权共有协议书范本
2014/11/03 职场文书
安装工程师岗位职责
2015/02/13 职场文书
离婚律师函范本
2015/05/27 职场文书
中学语文教学反思
2016/02/16 职场文书
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
python实现简单的三子棋游戏
2022/04/28 Python