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 写的一个爬虫程序源码
Feb 28 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
Python中过滤字符串列表的方法
Dec 22 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 Python
python实现商品进销存管理系统
May 30 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中fsockopen用法实例
2015/01/05 PHP
php实现的简单检验登陆类
2015/06/18 PHP
php常量详细解析
2015/10/27 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
javascript类型转换示例
2014/04/29 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Python docx库用法示例分析
2019/02/16 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python根据文本生成词云图代码实例
2019/11/15 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
如何在django中添加日志功能
2020/02/06 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
python 递归相关知识总结
2021/03/03 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
Intersport西班牙:在线体育商店
2019/11/06 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
行政管理人员精品工作推荐信
2013/11/04 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
医科大学生的自我评价
2013/12/04 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
交通事故协议书范本
2014/11/18 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
css3新特性的应用示例分析
2022/03/16 HTML / CSS