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实现删除Android工程中的冗余字符串
Jan 19 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
Dec 16 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
Python tkinter常用操作代码实例
Jan 03 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
selenium自动化测试入门实战
Dec 21 Python
pytorch显存一直变大的解决方案
Apr 08 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给一组指定关键词添加span标签的方法
2015/03/31 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
带你了解python装饰器
2017/06/15 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
python查看数据类型的方法
2019/10/12 Python
python如何将两个txt文件内容合并
2019/10/18 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
Opencv求取连通区域重心实例
2020/06/04 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
css3media响应式布局实例
2016/07/08 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
病媒生物防治方案
2014/05/13 职场文书
小学生环保倡议书
2014/05/15 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
基层党支部承诺书
2015/04/30 职场文书
宾馆安全管理制度
2015/08/06 职场文书