100 likes | 328 Views
算法设计与分析 第三章 动态规划 - 作业调度. 杨圣洪. 3.9 流水作业问题. 15. 2. M1. 作业 {1,2,…,n} 在由 M1 和 M2 组成的流水线上加工。 作业都是先由 M1 加工,再由 M2 上加工。 M1 和 M2 加工作业 i 所需的时间分别为 a i 和 b i 。 确定加工顺序,使得从首个作业在 M1 上 开始 加工,到 最后作业 在 M2 上加工 完成 ,所需的时间最少。. 11. 18. 耗时 :15+11+18=44. M2. 2. 15. M1. 18. 11. 耗时 :2+18+11=31. M2.
E N D
3.9 流水作业问题 15 2 M1 • 作业{1,2,…,n}在由M1和M2组成的流水线上加工。 • 作业都是先由M1加工,再由M2上加工。 • M1和M2加工作业i所需的时间分别为ai和bi。 • 确定加工顺序,使得从首个作业在M1上开始加工,到最后作业在M2上加工完成,所需的时间最少。 11 18 耗时:15+11+18=44 M2 2 15 M1 18 11 耗时:2+18+11=31 M2
确定加工顺序,所需的时间最少。分析: 开始时M2无事可作,(怎样才能少等待?) 运行中间也可能空闲 ,如图2 (怎样才能少等待?) M2有忙不过来即积压情况。如图1 M2少等待少积压,多与M1平行,则整体时间短 3.9 流水作业问题 25 2 M1 11 18 图1 M2 2 图2 25 M1 18 11 M2
3.9 流水作业问题 a1 a2 a3 M1 • 作业{1,2,…,n}在由M1和M2组成的流水线上加工。 • 作业都是先由M1加工,再由M2上加工。 • M1和M2加工作业i所需的时间分别为ai和bi。 • 确定加工顺序,使得从首个作业在M1上开始加工,到最后作业在M2上加工完成,所需的时间最少。 • 全部作业的集合为N={1,2,…,n}。S是N的作业子集。 • M1开始加工S中作业时,M2还在加工其他作业,要等时间t分钟(即M1开始加工S中作业t分钟后M2才空)后M2才会加工S中作业。 • 完成S的最短时间记为T(S,t)。S待完成作业,t为最初等待M 2时间(板) • 流水作业问题的最优为T(N,0)。N全部作业,0为最初等待M 2时间(板) b1 b2 M2
最优子结构性质 a1 a2 a3 M1 • 设是最优调度,它所需加工时间T(N,0)= a (1)+ T(S,bπ(1)) 。 • 因M1加工好(1)后, M1可立即加工(2), • 此时M2正加工(1),要等待b(1)才空,根据T(S,t)的定义,完成作业(2),…,(n)即S=N-{(1)}时间为T(S,bπ(1))。 • 可以证明T(S,bπ(1))是完成(2),…,(n)的最短时间。整体最优局部最优 • 假设存在另一调 度',使得'(2),…,'(n)完成的时间< T(S,bπ(1)) • 则(1),'(2),…,'(n)是整体N的调度,完成时间a(1)+{ '(2),…,'(n)的完成时间} <a (1)+ T(S,bπ(1)) =T(N,0)。即比调度π更省时间,这与是N的最优调度矛盾。 • 故假设不对,即不存在更短的调度,全局最优的调度也是局部最优的调度 b1 b2 M2
递推公式 ai--1 ai ai+1 • 整体最短时间为:每个作业i为首做时的完成时间的最小者(板) M1 t bi M2 • 推广到一般情形即子集S:M1开始加工S时,要等t后M2才空 • 完成S的最短时间为:S中每个作业为首做时的最小者 (板) • M1开始加工S-{i}中作业时要等一定时间后M2才空,等待时间 • =M2加工作业i的时间bi+ • (M1加工作业i时M2的等待时间t- M1加工作业i时已飞逝的时间ai) • t<ai表示ai加工完成前,M2的等待时间就已经结束,可直接加工
ai aj aj ai a3 a3 M1 M1 bi bj bj bi M2 M2 Johnson不等式 • 若作业i和j满足Johnson不等式即 • min{bi,aj}≥min{bj,ai} 则为最优调度(不证明!)。(板) • 若不满足则对换就满足,如下图所示, • 这也是作业总是动态规划解法的基本思想
算法 min(bi,aj)min(bj,ai) (i<j) • 流水作业调度问题的Johnson算法: • 记N1={i|ai<bi}即M1的时间<M2的时间的作业集合(板) • 记N2={i|ai≥bi}即M1的时间≥M2的时间的作业集合(板) • 将N1中作业依ai的非减序即升序排序; • 将N2中作业依bi的非增序即降序排序; • N1中作业接N2中作业构成满足Johnson法则的最优调度。 • 证明:N1中ai<bi,aj<bj,aiaj(升序),故ai<bj故min(bj,ai)=ai, 又bi>ai,ajai即二者均ai,故min(bi,aj)ai=min(bj,ai) • 故min(bi,aj)min(bj,ai)即满足Johnson规则 • N2中因aibi,ajbj,bibj(降序),因aibj故min(bj,ai)=bj, • 又bibj(降序),ajbj即二者均bj,故min(bi,aj)bj=min(bj,ai) • 故min(bi,aj)min(bj,ai)即满足Johnson规则 • i在N1、j在N2则ai<bi(N1),ajbj(N2)即bjaj,故min(bj,ai)bi,aj 故min(bj,ai)min(bi,aj)故min(bi,aj)min(bj,ai)即满足Joh规则
int[] jobprom(int[] a, int[] b,int n) { //参数a在M1的加工时间,b在M2时间 int[] N1=new int[n];N1a=new int[n]; int[] N2=new int[n]; N2b=new int[n]; int m=0,k=0; //N1={i|ai<bi} N2={i|ai>=bi} for (int i=0;i<n;i++){ if (a[i]<b[i]){ N1[m]=i;N1a[m]=a[i];m++;} else { N2[k]=i;N2b[k]=b[i];k++;} } sorta(N1b,N1,m); //N1b[]即ai升序排队,同步调N1 sortb(N2b,N2,k); //N2b[]即bi降序排队,同步调N2 int[] retV=new int[n]; //安排作业 for (int i=0;i<m;i++){retV[i]=N1[i];} for (int i=m;i<n;i++){retV[i]=N2[i-m];} return retV;} 算法描述
算法及其复杂性 • 所有作业调整为min(b(i),a(j))min(b(j),a(i))时间变为最少(i<j) • 流水作业调度问题的Johnson算法: • 记N1={i|ai<bi}即M1的时间<M2的时间的作业集合 • 记N2={i|ai≥bi}即M1的时间≥M2的时间的作业集合 • 将N1中作业依ai的非减序即升序排序; • 将N2中作业依bi的非增序即降序排序; • N1中作业接N2中作业构成满足Johnson法则的最优调度。 算法复杂度分析:算法的主要计算时间花在对作业集的排序。因此,在最坏情况下算法所需的计算时间为O(nlogn)。所需的空间为O(n)。