0018算法笔记——【动态规划】流水作业调度问题与Johnson法则
动态规划----流水线调度问题
动态规划----流⽔线调度问题问题的描述:n个作业{1,2,…,n}要在由2台机器M1和M2组成的流⽔线上完成加⼯。
每个作业加⼯的顺序都是先在M1上加⼯,然后在M2上加⼯。
M1和M2加⼯作业i所需的时间分别为ai和bi。
流⽔作业调度问题要求确定这n个作业的最优加⼯顺序,使得从第⼀个作业在机器M1上开始加⼯,到最后⼀个作业在机器M2上加⼯完成所需的时间最少。
调度规则(1 ) 把全部ai和bi分类成⾮降序列,ai和bi分别是第i个作业在两个机器上所需要的时间。
(2 ) 按照这⼀分类次序考察此序列: 如果序列中下⼀个数是aj 且作业j还没调度,那么在还没使⽤的最左位置调度作业j ; 如果下个数是bj 且作业j还没调度,那么在还没使⽤的最右位置调度作业j ; 如果已经调度了作业j,则转到该序列的下⼀个数。
算法主要利⽤Johnson不等式原理,对于所有的a步骤和b步骤的时间从⼩到⼤排序。
如果合并序列中拿出的元素属于a集合,则将其所属的job作为第⼀个job执⾏;如果属于b集合,则将其所属的job作为最后⼀个job执⾏。
进⾏下⼀个元素的判断,分别作为第⼆、倒数第⼆,依次类推;直到所有job被标记之后退出,获得的job数组就是job的执⾏序列。
例⼦1设 n=4,( a1,a2,a3,a4 ) =( 3,4,8,10 ) 和( b1,b2,b3,b4 ) =(6,2,9,15 ),对这些a和b分类后的序列是( b2,a1,a2,b1,a3,b3,a4,b4 ) = ( 2,3,4,6,8,9,10,15),设σ1,σ2,σ3,σ4是最优调度。
最⼩数是b2, 置σ4 = 2。
下⼀个最⼩数是a1, 置σ1 = 1。
接着的最⼩数是a2,由于作业2已被调度,转向再下⼀个数b1 。
作业1已被调度,再转向下⼀个数a3,置σ2 = 3。
最后剩σ3 是空的,⽽作业4还没调度,从⽽σ3= 4例⼦2:排序的结果( a4,b3,a0,b1,a2,b2,a1,b0,a3,b4 )执⾏顺序为 J4 -> J0 ->J2 ->J1 ->J3。
流水线作业排序问题
流水线作业排序问题/productioncontrol/200908091604.html流水作业排序问题的基本特征是每个工件的加工路线都一致。
在流水生产线上制造不同的零件,遇到的就是流水作业排序问题。
我们说加工路线一致,是指工件的流向一致,并不要求每个工件必须经过加工路线上每台机器加工。
如果某些工件不经某些机器加工,则设相应的加工时间为零。
一般说来,对于流水作业排序问题,工件在不同机器上的加工顺序不尽一致。
但本节要讨论的是一种特殊情况,即所有工件在各台机器上的加工顺序都相同的情况。
这就是排列排序问题。
流水作业排列排序问题常被称作“同顺序”排序问题。
对于一般情形,排列排序问题的最优解不一定是相应的流水作业排序问题的最优解,但一般是比较好的解;对于仅有2台和3台机器的特殊情况,可以证明,排列排序问题下的最优解一定是相应流水作业排序问题的最优解。
这里只讨论排列排序问题。
但对于2台机器的排序问题,实际上不限于排列排序问题。
一、最长流程时间Fmax的计算这里所讨论的是n/m/P /Fmax,问题,其中n为工件数,m为机器数,P表示流水线作业排列排序问题,Fmax为目标函数。
目标函数是使最长流程时间最短,最长流程时间又称作加工周期,它是从第一个工件在第一台机器开始加工时算起,到最后一个工件在最后一台机器上完成加工时为止所经过的时间。
由于假设所有工件的到达时间都为零(ri=0,i= 1,2,…,n),所以Fmax等于排在末位加工的工件在车间的停留时间,也等于一批工件的最长完工时间Cmax。
设n个工件的加工顺序为S=(S1,S2,S3,…,Sn),其中Si为第i位加工的工件的代号。
以表示工件Si在机器M k上的完工时间, 表示工件Si在Mk上的加工时间,k= 1,2,…,m;i=1,2,…,n,则可按以下公式计算:在熟悉以上计算公式之后,可直接在加工时间矩阵上从左向右计算完工时间。
下面以一例说明。
例9.4 有一个6/4/p/F max问题,其加工时间如表9—6所示。
流水作业调度
流水作业调度一、 可行性分析与项目开发计划n个作业}{n ,...2,1要在由2台机器M1和M2组成的流水线上完成加工。
每个作业的顺序都是现在M1上加工,然后再M2上加工。
M1和M2加工作业i 所需的时间分别是i a 和i b ,1<=i<=n.流水作业调度问题要求确定这n 个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需要的时间最少。
直观上,一个最优调度应该使得机器M1没有空闲时间,而且机器M2的空闲时间最少,在一般情况下,机器M2上会出现机器空闲和作业积压两种情况。
设全部作业的集合为N={1,2,…n}。
N S ⊆是N 的作业子集,在一般情况下,机器M1开始加工作业S 中作业时,机器M2还在加工其他作业,要等时间t 后才可以利用。
将这种情况下完成S 中作业所需要的最短时间记做T(S,t),则流水作业调度问题的最优值就是T(N,0).我们通过分析可以知道流水作业调度问题具有最优子结构的性质,因此考虑用动态规划算法自后向前来解决其最优问题。
这就需要通过建模来得出最优子结构的递归式子,从而设计算法求解最优值。
二、 需求分析1、 用户可以根据自己的需要输入想要进入流水线的作业数。
2、 用户可以输入这几个作业在机器M1和M2上的加工时间。
3、 由主函数调用流水作业调度的Johnson 算法来实现对流水作业的安排。
4、 输出经过Johnson 算法安排后的作业序列,这就是最终的一个最优调度。
三、 概要设计 总体设计:假定这n 个作业在机器M1上加工时间为i a ,在机器M2上加工时间为i b ,1<=i<=n. 由流水作业调度问题具有最优子结构性质可知,)}},{(min{)0,(i i b i N T a N T =+= 1<=i<=n 推广到一般情况下,})}0,m a x {},{({),(i a t b i S T a t S T i i -+-+= S i ∈ 式子中,}0,max{i a t -这一项是由于在机器M2上,作业i 必须在},max{i a t 时间之后才能开工,因此,在机器M1上完成作业加工i 之后,在机器还需要}0,max{},max{i i i i i a t b a a t b -+=-+时间完成对作业i 的加工。
精选最优流水作业调度问题:流水作业调度问题
最优流水作业调度问题摘要本文给出了双机流水作业调度的Johnson算法,并结合POJ上的一道题目详述了该算法的具体编程实现和应用。
关键词:双机流水作业调度 Johnson算法正文流水作业是并行处理技术领域的一项关键技术,它是以专业化为基础,将不同处理对象的同一施工工序交给专业处理部件执行,各处理部件在统一计划安排下,依次在各个作业面上完成指定的操作。
流水作业调度问题是一个非常重要的问题,其直接关系到计算机处理器的工作效率。
然而由于牵扯到数据相关、资源相关、控制相关等许多问题,最优流水作业调度问题处理起来非常复杂。
已经证明,当机器数(或称工序数)大于等于3时,流水作业调度问题是一个NP-hard问题(e.g分布式任务调度)。
粗糙地说,即该问题至少在目前基本上没有可能找到多项式时间的算法。
只有当机器数为2时,该问题可有多项式时间的算法(机器数为1时该问题是平凡的)。
我们先给出流水作业调度的定义:设有 n 个作业,每一个作业 i 均被分解为 m 项任务: Ti1,Ti2,… ,Tim(1≤i≤n,故共有n×m个任务),要把这些任务安排到m台机器上进行加工。
如果任务的安排满足下列3个条件,则称该安排为流水作业调度:1. 每个作业 i 的第 j 项任务Tij (1≤i≤n,1≤j≤m) 只能安排在机器Pj上进行加工;2. 作业 i 的第 j 项任务Tij(1≤i≤n,2≤j≤m)的开始加工时间均安排在第j?1项任务Ti,j?1加工完毕之后,任何一个作业的任务必须依次完成,前一项任务完成之后才能开始着手下一项任务;3. 任何一台机器在任何一个时刻最多只能承担一项任务。
最优流水作业调度是指:设任务Tij在机器Pj上进行加工需要的时间为tij。
如果所有的tij (1≤i≤n,1≤j ≤m)均已给出,要找出一种安排任务的方法,使得完成这 n 个作业的加工时间为最少。
这个安排称之为最优流水作业调度。
前面已经说过,当m≥3时该问题是NP问题,这里我们只给出m=2时时间复杂度在多项式以内的Johnson算法。
流水作业调度(贪心)Johnson算法
流⽔作业调度(贪⼼)Johnson算法某⼯⼚收到了 n个产品的订单,这 n个产品分别在 A、B 两个车间加⼯,并且必须先在 A 车间加⼯后才可以到 B 车间加⼯。
某个产品 i在 A,B 两车间加⼯的时间分别为Ai,Bi 。
怎样安排这 n个产品的加⼯顺序,才能使总的加⼯时间最短。
这⾥所说的加⼯时间是指:从开始加⼯第⼀个产品到最后所有的产品都已在 A,B 两车间加⼯完毕的时间。
边上代码边说开始让第⼆台机器等的时间缩⼩最后让第⼀台机器等的时间更⼩#include<bits/stdc++.h>#define re return#define inc(i,l,r) for(int i=l;i<=r;++i)using namespace std;template<typename T>inline void rd(T&x){char c;bool f=0;while((c=getchar())<'0'||c>'9')if(c=='-')f=1;x=c^48;while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);if(f)x=-x;}int n,pos[1005];struct node{int id,atime,btime,mintime;bool operator<(node a)const{re mintime<a.mintime;}}pro[1005];int main(){// freopen("in.txt","r",stdin);rd(n);inc(i,1,n){rd(pro[i].atime);pro[i].id=i; //加编号,第⼆问}inc(i,1,n){rd(pro[i].btime);pro[i].mintime=min(pro[i].atime,pro[i].btime);//取ai和bi中较⼩值mi}sort(pro+1,pro+n+1);//通过mi由⼩到⼤排序int l=1,r=n;inc(i,1,n){if(pro[i].mintime==pro[i].atime)pos[l++]=i;//ai⼩的放在前⾯else pos[r--]=i;//bi⼩的放在后⾯}//模拟int now=0,last=0;inc(i,1,n){now+=pro[pos[i]].atime;last=max(last,now)+pro[pos[i]].btime;}printf("%d\n",last);inc(i,1,n-1)printf("%d ",pro[pos[i]].id);printf("%d",pro[pos[n]].id);re 0;}。
Johnson算法
Johnson调度规则及其Matlab实现对于加工顺序相同的两个或两个以上作业在两台机器上的加工排序,称之为:n个作业两台机床的作业排序问题,经典的启发式排序方法为Johnson规则,其目的是最小化Makespan。
该启发式规则的步骤如下:1)列出n个作业在两台机床上的作业时间;2)根据作业时间将n个作业分成P和Q两组。
分组原则是:P组的作业在第二台机器上的加工时间比在第一台机器上加工时间长;其余作业为Q组;3)将P组作业按他们在第一台机器上加工时间递增顺序排列,将Q组作业按他们在第二台机器上加工时间递减的顺序排列。
4)将P组作业顺序和Q组作业顺序连接在一起,构成的就是生产周期最短的最优作业顺序。
如何使用Matlab计算Johnson调度的Makespan?在获得最优的排程之后,根据如下步骤获取Makespan1)计算机器1上各作业的开始加工时间:StartTime(1,i)=StartTime(1,i-1)+WorkTime(1,i-1) i>1StartTime(1,1)=0其中:WorkTime(1,i)为排程后机器1上的第i个作业的加工时间;2)计算各作业在机器2上的开始加工时间:StartTime(2,1)=WorkTime(1,1)StartTime(2,i)=Max([StartTime(2,i-1)+WorkTime(2,i-1)],[StartTime(1,i)+WorkTime(1,i)]) i>1 3)计算Makespan=StartTime(2,n)+WorkTime(2,n)Matlab程序function Johnson()%Johnson rule to obtain the optimal schedule and calculate the makespan TimeArray=[10 5 11 3 7 9;4 7 9 8 10 15];%The process data could be changed by yourself%Get the optimal schedule by Johnson rule[m,n]=size(TimeArray);if m~=2error('the process time must have two rows')endTimeArray(3,:)=(1:n);P=TimeArray(:,TimeArray(2,:)>TimeArray(1,:));Q=TimeArray(:,TimeArray(2,:)<=TimeArray(1,:));P=(sortrows(P',1))';Q=(-sortrows((-Q)',2))';Schedule=[P Q];%计算最有排序WorkTime(1:2,:)=Schedule(1:2,:);StartTime(1,1)=0;for i=2:nStartTime(1,i)=StartTime(1,i-1)+WorkTime(1,i-1);endStartTime(2,1)=WorkTime(1,1);for i=2:nStartTime(2,i)=max([StartTime(2,i-1)+WorkTime(2,i-1)],[StartTime(1,i)+WorkTi me(1,i)]);endMakespan=StartTime(2,n)+WorkTime(2,n);Schedule(1:2,:)=[];TheOptimalScheduel=ScheduleTheOptimalMakespan=MakespanFFD 算法:先将物体按长度从大到小排序,然后按FF 算法对物体装箱. 不失一般性,对n 件物品的体积按从大到小排好序,即有v1≥v2≥…≥vn ,然后按排序结果对物品重新编号即可。
动态规划-流水作业调度报告
动态规划-流水作业调度报告C1 问题描述和分析N个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。
每个作业加工的顺序都是先在M1上加工,然后在M2上加工。
M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。
流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
设全部作业的集合为N={1,2,…,n}, S⊆N,,一般情况下,机器M1开始加工作业S时,机器M2还在加工其他作业,要等时间t后才可利用.将这种情况下完成S中作业所需的最短时间记为T(S,t).流水作业调度的最优值为T(N,0)即,设π是所给n个流水作业的一个最优调度,它所需的加工时间为a(π1)+T’.其中T’是在此机器M2的等待时间为b(π1)时,安排作业π1, π2,…πn所需时间.所以S=N-{π1},有T’=T(S,b(π1)).由T的定义知T’≥T(S,b(π1)).若T’>T(S,b(π1)),设π’是作业集S在机器M2的等待时间为b(π1)情况下的一个最优调度.则π1, π’2,…, π’n是N的一个调度,且该调度所需的时间为a(π1)+T(S,b(π1))<a(π1)+T’.这与π是N的最优调度矛盾.故T’≤T(S,b(π1).从而T’=T(S,b(π1).即当机器M1为空闲即未安排任何加工任务时,则任何一个作业的第一个任务(第一道工序)都可以立即在M1上执行,无须任何先决条件。
因此容易知道,必有一个最优调度使得在M1上的加工是无间断的。
实际上,如某个最优调度π在M1上安排的加工是有间断的,则我们可以把所有在M1上出现间断处的任务的开始加工时间提前,使得在M1上的加工是无间断的;而在M2上仍按π原先的安排。
把这样调整之后的调度记作为π’。
由于在调度π’下,任何一个任务在M1上加工的结束时间不晚于在调度π下的结束时间,故调度π’不会影响在M2上进行加工的任何一个任务的开始时间。
流水作业调度 Johnson
1.题目:流水作业调度的Johnson法则2.程序清单:#include<iostream>using namespace std;#define MAXSIZE 1000typedef struct{int key,index;bool job;}Jobtype;typedef struct{Jobtype r[MAXSIZE];int length;}Sjob;//顺序表类型void sort(Sjob &L,int n){L.length=n;int i,j;Jobtype t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(L.r[i].key>L.r[j].key){t=L.r[i];L.r[i]=L.r[j];L.r[j]=t;}}int Flowshop(int n,int a[],int b[],int c[]) {int i;Sjob d;for(i=0;i<n;i++){d.r[i].key=a[i]>b[i]?b[i]:a[i];d.r[i].job=a[i]<=b[i];d.r[i].index=i;}sort(d,n);int j=0,k=n-1;for(i=0;i<n;i++){if(d.r[i].job)c[j++]=d.r[i].index;else c[k--]=d.r[i].index;}j=a[c[0]];k=j+b[c[0]];for(i=1;i<n;i++){j+=a[c[i]];k=j<k?k+b[c[i]]:j+b[c[i]];}return k;}void main(){int n,i;int a[MAXSIZE],b[MAXSIZE],c[MAXSIZE];cout<<"作业个数:";cin>>n;cout<<"在M1上的加工时间分别为:";for(i=0;i<n;i++)cin>>a[i];cout<<"在M2上的加工时间分别为:";for(i=0;i<n;i++)cin>>b[i];int m=Flowshop(n,a,b,c);for(i=0;i<n;i++)cout<<c[i]<<" ";cout<<endl<<"最短加工完成时间是:"<<m<<endl;}3.实验截图:。
流水作业调度问题
一、 问题描述给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
二、 算法分析n 个作业{1,2,…,n}要在由2台机器1M 和2M 组成的流水线上完成加工。
每个作业加工的顺序都是先在1M 上加工,然后在2M 上加工。
1M 和2M 加工作业i 所需要的时间分别为t[i,1]和t[i,2], n i ≤≤1.流水作业调度问题要求确定这n 个作业的最优加工顺序,使得从第一个作业在机器1M 上开始加工,到最后一个作业在机器2M 上加工完成所需的时间最少。
从直观上我们可以看到,一个最优调度应使机器1M 没有空闲时间,且机器2M 的空闲时间是最少。
在一般情况下,机器2M 上会有机器空闲和作业积压两种情况。
设全部作业的集合为},....,2,1{n N =。
N S ⊆是N 的作业子集。
在一般情况下,机器1M 开始加工S 中作业时,机器2M 还在加工其他作业,要等时间t 后才能利用。
将这种情况下完成S 中作业所需的最短时间计为),(t S T 。
流水作业调度问题的最优解为)0,(N T 。
1. 证明流水作业调度问题具有最优子结构设a 是所给n 个流水作业的一个最优调度,它所需要的加工时间为']1),1([T a t +。
其中,'T 是在机器2M 的等待时间为]2),1([a t 时,安排作业)(),......,3(),2(n a a a 所需的时间。
记)}1({a N S -=,则我们可以得到])2),1([,('a t S T T =。
事实上,有T 的定义可知])2),1([,('a t S T T ≥.若])2),1([,('a t S T T >,设'a 是作业集S 在机器2M 的等待时间为]2),1([a t 情况下的一个最优调度。
约翰逊法则例题及解答
约翰逊法则例题及解答
约翰逊法则(Johnson's Rule)是一种用来调度作业顺序的方法。
它基于以下两个原则:1)最早开始时间(Earliest Start Time)尽可能早,以最早完成作业。
2)最晚开始时间(Latest Start Time)尽可能晚,以最小化在后面作业上的影响。
下面是一个例题及解答,演示如何使用约翰逊法则调度作业顺序。
例题:
假设有4个作业A、B、C和D,每个作业的任务时间如下:A:3
B:6
C:2
D:5
解答:
1)计算每个作业的处理时间(Processing Time = 加工时间):A:3
B:6
C:2
D:5
2)计算每个作业的最早开始时间(Earliest Start Time = EST):A:0
B:0
C:0
D:0
3)计算每个作业的最晚开始时间(Latest Start Time = LST):A:14(加工时间总和)
B:14
C:14
D:14
4)计算每个作业的提前完成时间(Slack Time):
A:14 - 3 = 11
B:14 - 6 = 8
C:14 - 2 = 12
D:14 - 5 = 9
5)根据提前完成时间排序作业顺序:
先安排C(最早完成时间为2)
然后安排D(最早完成时间为6)
接着安排B(最早完成时间为12)
最后安排A(最早完成时间为14)
因此,按照约翰逊法则,作业顺序为:C、D、B、A。
请注意,这只是一个示例,实际应用中可以根据具体情况进行计算和调度。
0018算法笔记——【动态规划】流水作业调度问题与Johnson法则
0018算法笔记——【动态规划】流水作业调度问题与Johnson法则D记S=N-{π(1)},则有T’=T(S,bπ(1))。
证明:事实上,由T的定义知T’>=T(S,bπ(1))。
若T’>T(S,bπ(1)),设π’是作业集S在机器M2的等待时间为bπ(1)情况下的一个最优调度。
则π(1),π'(2),…,π'(n)是N的一个调度,且该调度所需的时间为aπ(1)+T(S,bπ(1))<aπ(1)+T’。
这与π是N的最优调度矛盾。
故T’<=T(S,bπ(1))。
从而T’=T(S,bπ(1))。
这就证明了流水作业调度问题具有最优子结构的性质。
由流水作业调度问题的最优子结构性质可知:从公式(1)可以看出,该问题类似一个排列问题,求N个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
将问题规模缩小。
公式(2)说明一般情况下,对作业集S进行调度,在M2机器上的等待时间,除了需要等该部件在M1机器上完成时间,还要冲抵一部分原来的等待时间,如果冲抵已成负值,自然仍需等待M1将作业做完,所以公式取max{t-ai,0}。
3、动态规划法求解思路假设有一组作业需要在M1和M2 两台机器上进行流水作业,他们在M1和M2上的作业时间如下表:问题是如何安排他们的加工顺序,使得,到最后一个作业在机器M2上加工完成所需要的时间最少。
也就是所有作业在两台机器全部加工完成所需的时间最少。
思路如下:考虑如果只有一个作业的情况,肯定所需时间就是它自身需要在M1和M2 上的加工时间总和;如果有两个作业就要考虑在两种不同的加工顺序下选取最优的一种作为候选,三个作业的时会出现三种组合情况(0,(1,2)); (1,(0,2)); (2,(0,1)),拿第一种为例,它表示先加工作业0,然后再按照作业1和作业2的优化顺序加工;将三种的作业时间计算出来,取最小值,即为三个作业的优化结果,同理可对更多的作业进行排序优化。
流水作业调度问题
流水作业调度问题-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII流水作业调度问题描述:N个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。
每个作业加工的顺序都是先在M1上加工,然后在M2上加工。
M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。
流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
可以假定任何任务一旦开始加工,就不允许被中断,直到该任务被完成,即非优先调度。
输入:输入包含若干个用例,第一行为一个正整数K(1<=K<=1000),表示用例个数,接下来K个用例,每个用例第一个为作业数N(1<=N<=1000),接下来N行,每行两个非负整数,分别表示在第一台机器和第二台机器上加工时间。
输出:每个用例用一行输出采用最优调度所用的总时间,即从第一台机器开始到第二台机器结束的时间。
样例输入:145 612 24 148 7样例输出:33假定直接按顺序进行完成,则机器1可以不用考虑,因为作业1完成后就可以完成作业2,直到作业n,需要的时间为所有作业在机器1上的时间总和。
但是,机器2上完成的时间呢?机器2上完成的时间显示除了作业在机器2上完成的时间总和,还要加上等待时间,即要求先在机器1上完成后,才能在机器2上开始。
例如5 612 2两个作业,顺序如下:按顺序,则在机器1上进行作业1需要5小时,后进行作业2,需要12小时,和为17小时;机器2上,作业1只能从第5小时开始,第11小时完成,等待了5小时,等到作业2在机器1上完成后(已经是第17时),再完成2小时,共19小时。
机器2的等待时间总计为11小时。
逆序,在机器1上进行作业2需要12小时,后进行作业1需要5小时,和为17小时,和前面一样;机器2上,作业2完成后开始,等待了12小时,然后再等3小时开始作业1的6小时,共计21小时,共等待了15小时。
流水作业调度
流水作业调度1.问题描述:定义:设有n个作业,每一个作业Ti均被分解为m项任务:Ti1, Ti2, …, Tim(1≤i ≤n),要把这些任务安排到m台机器上进行加工。
如果任务的安排满足下列3个条件,则称该安排为流水作业调度:1.每个作业i的第j项任务Tij (1≤i≤n, 1≤j≤m) 只能安排在机器Mj上进行加工2.作业i的第j项任务Tij(1≤i≤n, 2≤j≤m)的开始加工时间均安排在第j-1项任务Ti,j-1加工完毕之后,即任何一个作业的任务必须依次完成,前一项任务完成之后才能开始着手下一项任务;3.任何一台机器在任何一个时刻最多只能承担一项任务。
设任务Tij在机器Mj上进行加工需要的时间为tij。
如果所有的tij (1≤i≤n, 1≤j≤m)均已给出,要找出一种安排作业的方法,使得完成这n个作业的加工时间为最少。
完成n个作业的加工时间为从安排的第一个作业开始加工, 到最后一个作业加工完毕,其间所需要的时间。
2.分析:一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
在一般情况下,机器M2上会有机器空闲和作业积压2种情况。
设全部作业的集合为N={1, 2, …, n}。
S N是N的作业子集。
在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其它作业,要等时间t后才可利用。
将这种情况下完成S中作业所需的最短时间记为T(S, t)。
流水作业调度问题的最优值为:T(N,0)。
设M1和M2加工作业i所需的时间分别为ai和bi。
n个流水作业的一个最优调度,它所需的加工时间为 a(1)+T’。
T’:是在机器M2的等待时间为b(1)(2), …, (n)所需的时间。
记S=N - {(1)},则有T’=T(S, b(1))流水作业调度的Johnson法则S在机器M2的等待时间为t时的任一最优调度。
若π(1)=i, π(2)=j,则由动态规划递归式可得:T(s,t)=ai+T(S-{is],bi+max{t-ai,0})=ai+aj+T(s-{i,j},tij)若作业i和j满足,则称作业i和j满足Johnson不等式。
动态规划算法解并行任务调度问题
动态规划算法解并⾏任务调度问题感谢晶星童鞋的讨论啥也不说,上题⽬:⽤两台处理机A和B处理个作业。
设第i个作业交给机器A处理时所需要的时间是ai,若由机器B来处理,则所需要的时间是bi。
现在要求每个作业只能由⼀台机器处理,每台机器都不能同时处理两个作业。
设计⼀个动态规划算法,使得这两台机器处理完这个作业的时间最短(从任何⼀台机器开⼯到最后⼀台机器停⼯的总的时间)。
我⼀开始以为只有第⼀个作业完成后,才能进⾏第⼆个作业呢,后来才意识到是并⾏。
啥也不说,上代码,C++描述。
#include<iostream>#include<string>using namespace std;int findMax(int a, int b){if(a > b){return a;}else{return b;}}int findMin(int a, int b){if(a < b){return a;}else{return b;}}int main(){int N = 6;int a[] ={ 2, 5, 7, 10, 5, 2 };int b[6] = { 3, 8, 4, 11, 3, 4 };int least[6] = {0};string result[6] = {""};for (int i = 0; i < N; i++){least[i] = 99;}int aSum = 0, bSum = 0;for (int i = 0; i < N; i++){aSum += a[i];bSum += b[i];}int timeA[6][1000];int timeB[6][1000];int timeB[6][1000];int timeMax[6][1000];char who[6][100];char tempRlt[100];for (int i = 0; i <= a[0]; i++){timeA[0][i] = i;if (i < a[0]){timeB[0][i] = b[0];who[0][i] = 'b';}else{timeB[0][i] = 0;who[0][i] = 'a';}timeMax[0][i] = findMax(timeA[0][i], timeB[0][i]); }if (a[0] <= b[0]){least[0] = a[0];tempRlt[0] = 'a';}else{least[0] = b[0];tempRlt[0] = 'b';}result[0] = string(tempRlt);for (int k = 1; k < N; k++){int tempSum = 0;for (int temp = 0; temp <= k; temp++){tempSum += a[temp];}for (int i = 0; i <= tempSum; i++){timeA[k][i] = i;if (i < a[k]){timeB[k][i] = timeB[k - 1][i] + b[k];who[k][i] = 'b';}else{if ((timeB[k - 1][i] + b[k]) <= timeB[k - 1][i - a[k]]) {timeB[k][i] = timeB[k - 1][i] + b[k];who[k][i] = 'b';}else{timeB[k][i] = timeB[k - 1][i - a[k]];who[k][i] = 'a';}}timeMax[k][i] = findMax(timeA[k][i], timeB[k][i]); }for (int i = tempSum + 1; i < aSum; i++){{timeA[k][i] = tempSum;timeB[k][i] = 0;}int flag = 0;for (int i = 0; i <= tempSum; i++){if (timeMax[k][i] > 0 && timeMax[k][i] < least[k]){least[k] = timeMax[k][i];flag = i;}}tempRlt[k] = who[k][flag];for (int i = k; i > 0 && flag > 0; i--){if (tempRlt[i] == 'a'){flag -= a[i];tempRlt[i - 1] = who[i - 1][flag];}if (tempRlt[i] == 'b'){tempRlt[i - 1] = who[i - 1][flag];}}result[k] = string(tempRlt);}cout << "完成" << N <<"任务顺序为:" << result[N-1] << " 时间为" <<least[N-1] << endl; }。
流水作业调度问题———Johnson算法
流⽔作业调度问题———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机器上加⼯最快的作业放在最后具体实现:设M i=min{a i,b i}将数组M由⼩到⼤排序,然后从第⼀个开始处理,若M i=a i则按顺序排在作业加⼯顺序的前⾯,若M i=b i则按顺序排在后⾯最后排出来的顺序就是最优解算法证明设S={J1,J2,J3····J n}为待加⼯作业排序,T(S,t)为A开始加⼯S中作业,B需t时刻后才能加⼯A加⼯完的作业,这种情况下加⼯完S中作业所需最⼩的时间T(S,t)=min{a i+T(S−{J i},b i+max{t−a i,0})}, J i∈S假设最佳⽅案是先加⼯J i,然后加⼯J j,则有T(S,t)=a i+T(S−{J i},b i+max{t−a i,0})=a i+a j+T(S−{J i,J j},b i+bj+T ij)T ij=b j+max{b i+max{t−a i,0}−a j,0},0}=b i+b j−a i−a j+max{t,a i,a i+a j−b i}若J i和J j调换顺序则:T′(S,t)=a i+a j+T(S−{J i,J j},T ji)T ji=b i+b j−a i−a j+max{t,a j,a i+a j−b j}所以T(S,t)<=T′(S,t),所以有max{t,a i,a i+a j−b i}<=max{t,a j,a i+a j−b j}a i+a j+max{−b i,−a j}<=a i+a j+max{−b j,−a i}(其实2步转化我不太清楚,只是意会了⼀下,如有理解的⿇烦告诉我,感谢)即min{b j,a i}<=min{b i,a j}也就是说J i在J j之前加⼯最优得满⾜上式条件,则a i<=b i,a j或者b j<=b i,a j即在A机器上加⼯时间短的任务优先,⽽在B机器上加⼯时间短的排在后⾯,与具体实现的步骤相符Processing math: 100%。
0018算法笔记__[动态规划]流水作业调度问题及Johnson法则
0018算法笔记——【动态规划】流水作业调度问题与Johnson 法则1、问题描述:n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。
每个作业加工的顺序都是先在M1上加工,然后在M2上加工。
M1和M2加工作业i所需的时间分别为ai和bi。
流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
2、问题分析直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
在一般情况下,机器M2上会有机器空闲和作业积压2种情况。
设全部作业的集合为N={1,2,…,n}。
S是N的作业子集。
在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其他作业,要等时间t后才可利用。
将这种情况下完成S中作业所需的最短时间记为T(S,t)。
流水作业调度问题的最优值为T(N,0)。
设π是所给n个流水作业的一个最优调度,它所需的加工时间为aπ(1)+T’。
其中T’是在机器M2的等待时间为bπ(1)时,安排作业π(2),…,π(n)所需的时间。
记S=N-{π(1)},则有T’=T(S,bπ(1))。
证明:事实上,由T的定义知T’>=T(S,bπ(1))。
若T’>T(S,bπ(1)),设π’是作业集S在机器M2的等待时间为bπ(1)情况下的一个最优调度。
则π(1),π'(2),…,π'(n)是N的一个调度,且该调度所需的时间为aπ(1)+T(S,bπ(1))<aπ(1)+T’。
这与π是N的最优调度矛盾。
故T’<=T(S,bπ(1))。
从而T’=T(S,bπ(1))。
这就证明了流水作业调度问题具有最优子结构的性质。
由流水作业调度问题的最优子结构性质可知:从公式(1)可以看出,该问题类似一个排列问题,求N个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
johnson算法例题解析
johnson算法是一种求解双机调度问题的算法,它可以将作业分配到两个不同的机器上,使得所有作业的总完成时间最小。
假设有5个作业,其加工时间分别为40、50、100、60和20,如果两个机器并行工作,那么可以采用johnson 算法求解最佳调度方案。
根据johnson算法,首先将作业按照加工时间从大到小排序,得到一个序列为50、60、40、100和20。
然后根据两个机器的加工时间,将作业分配到两个机器上。
机器M1的加工时间为30,机器M2的加工时间为50,所以按照johnson算法,将加工时间超过30的作业分配给机器M1,将加工时间小于或等于30的作业分配给机器M2。
根据上述排序后的作业序列,作业50和60的加工时间都超过30,所以应该分配给机器M1;作业40和100的加工时间超过30,所以应该分配给机器M1;作业20的加工时间为20,小于30,所以应该分配给机器M2。
因此,最佳调度方案为:机器M1完成作业50、60、40和100,总加工时间为280;机器M2完成作业20,总加工时间为20。
总完成时间为300,是最小的总完成时间。
流水作业的排序问题
(1)工件3加工时间最长,作为关键工件。 (2)满足Pi1<Pi3的工件有1、2,按 Pi1值由小到大排在3的前面,1-2-3。 (3)满足pi1>pi3的工件是4,将4排在3的后面。 所以加工顺序为(1,2,3,4)。
i
1 2 3 4
三、m(m≥ 3)台机器排序问题的算法
一般采用启发式算法解决这类问题。
关键工件法
02
斜度指标法
04பைடு நூலகம்
CDS法
工件的斜度指标计算公式
λi= k=1,2,……m 式中,m机器数;Pik为工件i在Mk上的加工时间。 按照各工件λi不增的顺序排列工件,可得出令人满意 的顺序。
(一)Palmer(斜度指标法)
工件在加工过程中采取平行移动方式,即当上一道工序完工后,立即送下道工序加工。
不允许中断。当一个工件一旦开始加工,必须一直进行到完工,不得中途停止插入其它工件。
每道工序只在一台机器上完成。
工件数、机器数和加工时间已知,加工时间与加工顺序无关。
每台机器同时只能加工一个工件。
3
2
1
4
5
6
假设条件
排序常用的符号
Pi1 Pi2 Pi3
1 2 6 3 8 4 2 9 5 8 2
Pi
13 11 16 14
二、排序问题的分类和表示法
1、排序问题的分类: (1)根据机器数的多少 单台机器的排序问题 多台机器的排序问题 (2)根据加工路线的特征 单件作业排序(Job Shop):工件加工路线不同 流水作业排序(Flow Shop):所有工件加工路线完全相同 (3) 根据工件到达系统的情况 静态排序:进行排序时,所有工件都已到达,可以一次对他们排序 动态排序:工件陆续到达,要随时安排他们的加工顺序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、问题描述:
n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。
每个作业加工的顺序都是先在M1上加工,然后在M2上加工。
M1和M2加工作业i所需的时间分别为ai和bi。
流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
2、问题分析
直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
在一般情况下,机器M2上会有机器空闲和作业积压2种情况。
设全部作业的集合为N={1,2,…,n}。
S是N的作业子集。
在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其他作业,要等时间t后才可利用。
将这种情况下完成S中作业所需的最短时间记为T(S,t)。
流水作业调度问题的最优值为T(N,0)。
设π是所给n个流水作业的一个最优调度,它所需的加工时间为
aπ(1)+T’。
其中T’是在机器M2的等待时间为bπ(1)时,安排作业
π(2),…,π(n)所需的时间。
记S=N-{π(1)},则有T’=T(S,bπ(1))。
证明:事实上,由T的定义知T’>=T(S,bπ(1))。
若T’>T(S,bπ(1)),设π’是作业集S在机器M2的等待时间为bπ(1)情况下的一个最优调度。
则π(1),π'(2),…,π'(n)是N的一个调度,且该调度所需的时间为
aπ(1)+T(S,bπ(1))<aπ(1)+T’。
这与π是N的最优调度矛盾。
故
T’<=T(S,bπ(1))。
从而T’=T(S,bπ(1))。
这就证明了流水作业调度问题具有最优子结构的性质。
由流水作业调度问题的最优子结构性质可知:
从公式(1)可以看出,该问题类似一个排列问题,求N个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
将问题规模缩小。
公式(2)说明一般情况下,对作业集S进行调度,在M2机器上的等待时间,除了需要等该部件在M1机器上完成时间,还要冲抵一部分原来的等待时间,如果冲抵已成负值,自然仍需等待M1将作业做完,所以公式取max{t-ai,0}。
3、动态规划法求解思路
假设有一组作业需要在M1和M2 两台机器上进行流水作业,他们在M1和M2上的作业时间如下表:
问题是如何安排他们的加工顺序,使得,到最后一个作业在机器M2上加工完成所需要的时间最少。
也就是所有作业在两台机器全部加工完成所需的时间最少。
思路如下:考虑如果只有一个作业的情况,肯定所需时间就是它自身需要在M1和M2 上的加工时间总和;如果有两个作业就要考虑在两种不同的加工顺序下选取最优的一种作为候选,三个作业的时会出现三种组合情况(0,(1,2)); (1,(0,2)); (2,(0,1)),拿第一种为例,它表示先加工作业0,然后再按照作业1和作业2的优化顺序加工;将三种的作业时间计算出来,取最小值,即为三个作业的优化结果,同理可对更多的作业进行排序
优化。
具体做法是,用类似矩阵连乘的办法,自底向上将所有能的情况计算出来,并产生一个表,供后面的计算查用,减少重复计算的工作量。
对于j1 作业M2 的等待时间为b0,实际上在M2加工j0作业的同时,M1 并行加工j1,实际它需要等待b1-a0时间。
2+4+(5-4)+2=9
从J0和J1两个作业的加工顺序,可以看出,先加工J0后J1,所用时间最短为9,将其填入表中,依此类推,即可得出最优解。
a4+a0+a2+a1+a3+[(b4+b0+b1+b2)-(a0+a1+a2+a3)]+b3
=1+2+3+4+6+[(7+5+2+3)-(2+4+3+6)]+1
=16+[17-15]+1=19
选其中加工时间短的作为候选方案;在具体计算时非最优子集不必考虑,这样可以减少计算次数。
4、流水作业调度的Johnson法则
设兀是作业集S在机器M2的等待时间为t时的任一最优调度。
若在这个调度中,安排在最前面的两个作业分别是i 和j ,即
π(1)=I,π(2)=j。
则有动态规划递归式可得
其中
如果作业i和j满足min{bi,aj} ≥min{bj,ai},则称作业i和j满足Johnson 不等式。
如果作业i和j 不满足Johnson不等式,则交换作业i和j满足Johnson不等式。
证明:在作业集S中,对于机器M2 的等待时间为t的调度π,交换作业i和j 的加工顺序,得到作业集S 的另一个调度π’,它所需的加工时间为
当作业i和j 满足Johnson 不等式min{bi,aj} ≥min{bj,ai}时,有
从而
由此可得
因此,对任意t 有
从而,tij≤tji,由此可见,换句话说,当作业i 和j 不满足Johnson 不等式时,交换它们的加工顺序后,作业i和j满足Johnson 不等式,且不增加加工时间。
由此可知,对于流水作业调度
问题,必存在最优调度π,使得作业π(i)和π(i+1)满足Johnson 不等式:
这样的调度π称为满足Johnson 法则的调度。
进一步还可以证明,调度满足Johnson 法则当且仅当对任意i<j 有:
由此可知,任意两个满足Johnson 法则的调度具有相同的加工时间,从而所有满足Johnson 法则的调度均为最优调度。
5、流水作业调度问题Johnson
从上面的分析可知,流水作业调度问题一定存在满足Johnson法则的最优调度,且容易由下面的算法确定:
流水作业调度问题的Johnson算法:
(1)令N1={i|ai<bi},N2={i|ai>=bi};
(2)将N1中作业按ai的非减序排序;将N2中作业按bi的非增序排序;
(3)N1中作业接N2中作业构成满足Johnson法则的最优调度。
Johnson算法中分类及排序的作用(验证不等式)设数组c[]为排序后的作业排列,排序结果如下:
红线左侧满足a[c[i]]<=b[c[i]] 和a[c[i]]<=a[c[i+1]] 符合johnson
不等式,min(b[c[i]],a[c[i+1]])>=min(b[c[i+1]],a[c[i]])其调度顺序最优;
红线右侧满足b[c[i]]<=a[c[i]] 和b[c[i]]>=b[c[i+1]] 符合johnson
不等式,min(b[c[i]],a[c[i+1]])>=min(b[c[i+1]],a[c[i]])其调度顺序最优;
中间过渡部分横向比较,左侧a[c[i]]< b[c[i]] 右侧b[c[i+1]]<=a[c[i+1] ]满足min(b[c[i]],a[c[i+1]])>=min(b[c[i+1]],a[c[i]])其调度顺序也最优;
程序具体代码如下:
[cpp]
1.ey = a[i]>b[i]?b[i]:a[i];ob = a[i]<=b[i];ndex = i;
2. }
3.
4. BubbleSort(d,n);ob)
5. {
6. c[j++] = d[i].index;ndex;//属于N2的从后面进入,从而实现N1的非减序排
序,N2的非增序排序
7. }
8. }
9.
10. j = a[c[0]];
11. k = j+b[c[0]];
12.for(int i=1; i<n; i++)
13. {
14. j += a[c[i]];//M1在执行c[i]作业的同时,M2在执行c[i-1]号作业,最短执行时
间取决于M1与M2谁后执行完
15. k = j<k?k+b[c[i]]:j+b[c[i]];//计算最优加工时间
16. }
17.
18.delete d;
19.return k;
20.}
21.
22.//冒泡排序
23.void BubbleSort(Jobtype *d,int n)
24.{
25.int i,j,flag;
26. Jobtype temp;
27.
28.for(i=0;i<n;i++){
29. flag = 0;
30.for(j=n-1;j>i;j--){
31.//如果前一个数大于后一个数,则交换
32.if(d[j]<=d[j-1]){
33. temp = d[j];
34. d[j] = d[j-1];
35. d[j-1] = temp;
36. flag = 1;
37. }
38. }
39.//如果本次排序没有进行一次交换,则break,减少了执行之间。
40.if(flag == 0){
41.break;
42. }
43. }
44.}
运行结果如下:。