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 相关文章推荐
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python中实现switch功能实例解析
Jan 11 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
python使用正则筛选信用卡
Jan 27 Python
详解python中__name__的意义以及作用
Aug 07 Python
Python数据正态性检验实现过程
Apr 18 Python
通过代码实例了解Python sys模块
Sep 14 Python
利用Python过滤相似文本的简单方法示例
Feb 03 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
python 动态加载的实现方法
2017/12/22 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
Python 切分数组实例解析
2019/11/07 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
什么是lambda函数
2013/09/17 面试题
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
2014年行政部工作总结
2014/11/19 职场文书
2014年保洁工作总结
2014/11/24 职场文书
教师旷工检讨书
2015/08/15 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书