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 threading模块操作多线程介绍
Apr 08 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
python中的for循环
Sep 28 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
为什么说Python可以实现所有的算法
Oct 04 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 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.ini中文版(1)
2006/10/09 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
幼儿园教师国培感言
2014/02/02 职场文书
个人安全生产责任书
2014/07/28 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
2014年教学工作总结
2014/11/13 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
早上好问候语大全
2015/11/10 职场文书