Python基于回溯法子集树模板解决最佳作业调度问题示例

发布时间 - 2026-01-11 03:09:58    点击率:

本文实例讲述了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

解编码:(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 Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。


# Python  # 回溯法  # 子集树模板  # 最佳作业调度问题  # Python基于回溯法子集树模板解决野人与传教士问题示例  # Python基于回溯法子集树模板解决马踏棋盘问题示例  # Python基于回溯法子集树模板解决找零问题示例  # Python使用回溯法子集树模板解决爬楼梯问题示例  # Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法  # Python基于回溯法子集树模板解决选排问题示例  # Python基于回溯法子集树模板解决全排列问题示例  # python 回溯法模板详解  # 时间为  # 两台  # 进阶  # 操作技巧  # 都有  # 相关内容  # 遍历  # 分别在  # 数据结构  # 给大家  # 使其  # 为例  # 更多关于  # 两项  # 所述  # 不能超过  # 最优  # 程序设计  # 使用技巧  # 讲道理 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端网站建设与定制开发一站式解决方案 中企动力  千库网官网入口推荐 千库网设计创意平台入口  如何在IIS7上新建站点并设置安全权限?  lovemo网页版地址 lovemo官网手机登录  网站页面设计需要考虑到这些问题  高端建站如何打造兼具美学与转化的品牌官网?  清除minerd进程的简单方法  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Android利用动画实现背景逐渐变暗  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何在建站主机中优化服务器配置?  大型企业网站制作流程,做网站需要注册公司吗?  Laravel怎么在Blade中安全地输出原始HTML内容  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  5种Android数据存储方式汇总  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何基于PHP生成高效IDC网络公司建站源码?  如何在IIS7中新建站点?详细步骤解析  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  IOS倒计时设置UIButton标题title的抖动问题  企业网站制作这些问题要关注  如何快速打造个性化非模板自助建站?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  详解阿里云nginx服务器多站点的配置  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  EditPlus中的正则表达式实战(6)  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何为API编写文档_Laravel API文档生成与维护方法  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  潮流网站制作头像软件下载,适合母子的网名有哪些?  PHP正则匹配日期和时间(时间戳转换)的实例代码  iOS UIView常见属性方法小结  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Python文件流缓冲机制_IO性能解析【教程】  Laravel如何为API生成Swagger或OpenAPI文档  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程