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轻松实现代码编码格式转换
Mar 26 Python
python实现决策树分类
Aug 30 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
python操作文件的参数整理
Jun 11 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
解决python使用list()时总是报错的问题
May 05 Python
用Python开发app后端有优势吗
Jun 29 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 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
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
Nuxt.js踩坑总结分享
2018/01/18 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python 初始化多维数组代码
2008/09/06 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
一行python实现树形结构的方法
2019/08/09 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
没编程基础可以学python吗
2020/06/17 Python
Python项目打包成二进制的方法
2020/12/30 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
投资合作协议书范本
2014/04/17 职场文书
党支部意见范文
2015/06/02 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS