流水作业调度问题———Johnson算法

问题描述:

N个作业1,2,…,n要在由2台机器A和B组成的流水线上完成加工。每个作业加工的顺序都是先在A上加工,然后在B上加工。A和B加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器A上开始加工,到最后一个作业在机器B上加工完成所需的时间最少。求这个最少的时间。

大概思路:求一个加工顺序使得加工时间最短,就是让机器空闲时间最短,当A开始工作便会一直运作,关键是B会等待A,很明显A加工第一个作业时B得等待,同理B加工最后一个作业A得等待

Johnson算法

此算法是一种贪心策略:把在A机器上加工最快的作业先加工,把B机器上加工最快的作业放在最后

具体实现:

Mi=min{ai,bi}
将数组M由小到大排序,然后从第一个开始处理,若Mi=ai则按顺序排在作业加工顺序的前面,若Mi=bi则按顺序排在后面
最后排出来的顺序就是最优解


算法证明

S={J1,J2,J3····Jn}为待加工作业排序,
T(S,t)为A开始加工S中作业,B需t时刻后才能加工A加工完的作业,这种情况下加工完S中作业所需最小的时间
T(S,t)=min{ai+T(S{Ji},bi+max{tai,0})}, JiS
假设最佳方案是先加工Ji,然后加工Jj,则有
T(S,t)=ai+T(S{Ji},bi+max{tai,0})=ai+aj+T(S{Ji,Jj},bi+bj+Tij)
Tij=bj+max{bi+max{tai,0}aj,0},0}=bi+bjaiaj+max{t,ai,ai+ajbi}
JiJj调换顺序则:
T(S,t)=ai+aj+T(S{Ji,Jj},Tji)
Tji=bi+bjaiaj+max{t,aj,ai+ajbj}
所以T(S,t)<=T(S,t),所以有
max{t,ai,ai+ajbi}<=max{t,aj,ai+ajbj}
ai+aj+max{bi,aj}<=ai+aj+max{bj,ai}
(其实2步转化我不太清楚,只是意会了一下,如有理解的麻烦告诉我,感谢)

min{bj,ai}<=min{bi,aj}
也就是说JiJj之前加工最优得满足上式条件,
ai<=bi,aj或者 bj<=bi,aj
即在A机器上加工时间短的任务优先,而在B机器上加工时间短的排在后面,与具体实现的步骤相符

posted @   I_N_V  阅读(1387)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示