问题描述:
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{t−ai,0})}, Ji∈S
假设最佳方案是先加工Ji,然后加工Jj,则有
T(S,t)=ai+T(S−{Ji},bi+max{t−ai,0})=ai+aj+T(S−{Ji,Jj},bi+bj+Tij)
Tij=bj+max{bi+max{t−ai,0}−aj,0},0}=bi+bj−ai−aj+max{t,ai,ai+aj−bi}
若Ji和Jj调换顺序则:
T′(S,t)=ai+aj+T(S−{Ji,Jj},Tji)
Tji=bi+bj−ai−aj+max{t,aj,ai+aj−bj}
所以T(S,t)<=T′(S,t),所以有
max{t,ai,ai+aj−bi}<=max{t,aj,ai+aj−bj}
ai+aj+max{−bi,−aj}<=ai+aj+max{−bj,−ai}
(其实2步转化我不太清楚,只是意会了一下,如有理解的麻烦告诉我,感谢)
即
min{bj,ai}<=min{bi,aj}
也就是说Ji在Jj之前加工最优得满足上式条件,
则ai<=bi,aj或者 bj<=bi,aj
即在A机器上加工时间短的任务优先,而在B机器上加工时间短的排在后面,与具体实现的步骤相符
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!