本文实例讲述了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 回溯法模板详解
# 时间为
# 两台
# 进阶
# 操作技巧
# 都有
# 相关内容
# 遍历
# 分别在
# 数据结构
# 给大家
# 使其
# 为例
# 更多关于
# 两项
# 所述
# 不能超过
# 最优
# 程序设计
# 使用技巧
# 讲道理
相关文章:
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
黑客入侵网站服务器的常见手法有哪些?
如何在服务器上配置二级域名建站?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
宁波免费建站如何选择可靠模板与平台?
如何在阿里云域名上完成建站全流程?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何快速上传建站程序避免常见错误?
建站之星安装步骤有哪些常见问题?
网站制作企业,网站的banner和导航栏是指什么?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
如何快速搭建虚拟主机网站?新手必看指南
如何快速生成凡客建站的专业级图册?
如何选择域名并搭建高效网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
建站之星后台管理:高效配置与模板优化提升用户体验
大学网站设计制作软件有哪些,如何将网站制作成自己app?
怎么将XML数据可视化 D3.js加载XML
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
如何高效完成自助建站业务培训?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何选择适配移动端的WAP自助建站平台?
建站之星后台密码遗忘或太弱?如何重置与强化?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何在香港免费服务器上快速搭建网站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
音响网站制作视频教程,隆霸音响官方网站?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
建站之星云端配置指南:模板选择与SEO优化一键生成
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何用wdcp快速搭建高效网站?
建站OpenVZ教程与优化策略:配置指南与性能提升
,石家庄四十八中学官网?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
如何快速查询域名建站关键信息?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
建站之星如何开启自定义404页面避免用户流失?
网站制作公司,橙子建站是合法的吗?
电商网站制作公司有哪些,1688网是什么意思?
如何在云主机上快速搭建多站点网站?
山东网站制作公司有哪些,山东大源集团官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。