流水作业调度问题
4-流水作业调度
流水作业调度问题(不能直接使用动态规划法的例子)流水作业调度的定义:设有n个作业,每一个作业i均被分解为m项任务: T i1, T i2, ┅, T im(1≤i≤n,故共有n m个任务),要把这些任务安排到m台机器上进行加工。
如果任务的安排满足下列3个条件,则称该安排为流水作业调度:1. 每个作业i的第j项任务T ij (1≤i≤n, 1≤j≤m)只能安排在机器P j上进行加工;2. 作业i的第j项任务T ij(1≤i≤n, 2≤j≤m)的开始加工时间均安排在第j-1项任务T i,j-1加工完毕之后;(任何一个作业的任务必须依次完成,前一项任务完成之后才能开始着手下一项任务)3. 任何一台机器在任何一个时刻最多只能承担一项任务。
最优流水作业调度:设任务T ij在机器P j上进行加工需要的时间为t ij。
如果所有的t ij (1≤i≤n, 1≤j≤m)均已给出,要找出一种安排任务的方法,使得完成这n个作业的加工时间为最少。
这个安排称之为最优流水作业调度。
完成n个作业的加工时间:从安排的第一个任务开始加工,到最后一个任务加工完毕,其间所需要的时间。
优先调度:允许优先级较低的任务在执行过程中被中断,转而去执行优先级较高的任务。
非优先调度:任何任务一旦开始加工,就不允许被中断,直到该任务被完成。
流水作业调度一般均指的是非优先调度。
非优先调度可看成是特殊的优先调度:所有任务的优先级均相同。
7 5 8e.g. (t ij)= 2 2 60 7 4注意:t ij为0表示作业i无须在机器P j上进行加工、即该道工序可以省略。
已经证明,当机器数(或称工序数)m≥3时,流水作业调度问题是一个NP-hard问题(e.g分布式任务调度)。
(粗糙地说,即该问题至少在目前基本上没有可能找到多项式时间的精确最优算法。
)∴目前仅当m=2时,该问题可有多项式时间的算法。
为方便起见,记t i1为a i(作业i在P1上加工所需时间),t i2为b i(作业i在P2上加工所需时间)。
问题描述n个作业{1,2,…,n}要在由2台机器M1和M2组成的流
业集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))。即流水作业调度问题具有
最优子结构的性质。
3
流水作业调度
2. 递归结构
由流水作业调度问题的最优子结构性质可知:
T ( N ,0) min{a i T ( N {i}, bi )}
1 i n
T ( S , t ) min{ai T ( S {i}, bi max{ t ai ,0})}
iS
T(S,t)中的bi+max{t-ai,0}:
的最优值为m(i,j),即m(i,j)是背包容量为j,可选 择物品为i,i+1,…,n时0-1背包问题的最优值。由01背包问题的最优子结构性质,可以建立计算m(i,j)的 递归式如下:
j wn vn m(n, j ) 0 0 j wn
j wi max{m(i 1, j ),m(i 1, j wi ) vi } m(i, j ) 0 j wi m(i 1, j )
2
流水作业调度
1. 最优子结构性质
设是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)),设’是作
最优化方法实验课02流水车间(Flow Shop )调度问题
• optimum result:7038
思考
• 流水车间调度问题与单机调度问题的区别有哪些? • 你所建立的模型是针对测试用例的,还是针对问题模
型的? • 流水车间调度能否使用贪心策略去求解?是否适合? • 结合理论课上所学内容(包括之后要上的课程),思
考适合流水车间调度问题的求解方法。
下次实验课会就上述思考问题进行讨论和解答。请同学 们积极思考。
最优化方法
Optimization Approaches
问题背景
流水车间(Flow Shop )调度问题是很多实 际流水线生产调度问题的简化模型,也是一 个典型的NP-hard 问题,因此其研究具有重要 的理论意义和工程价值,也是目前研究最广 泛的一类典型调度问题。
实验问题-流水车间调度
• 已知:有n 个工件需要在m台机器上流水加工。
• The machines are numbered starting with 0.
• instance 1
Instance 1
+++++++++++++++++++++++++++++ 11x5 instance 11 5 0 375 1 12 2 142 3 245 4 412 0 632 1 452 2 758 3 278 4 398 0 12 1 876 2 124 3 534 4 765 0 460 1 542 2 523 3 120 4 499 0 528 1 101 2 789 3 124 4 999 0 796 1 245 2 632 3 375 4 123 0 532 1 230 2 543 3 896 4 452 0 14 1 124 2 214 3 543 4 785 0 257 1 527 2 753 3 210 4 463 0 896 1 896 2 214 3 258 4 259 0 532 1 302 2 501 3 765 4 988 +++++++++++++++++++++++++++++
流水作业调度
流水作业调度一、 可行性分析与项目开发计划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算法)
双机流⽔作业调度问题(Johnson算法)问题定义:双机流⽔作业调度:总共有n个作业,作业i分为两个内容,需要按顺序先后在机器A和机器B上完成,分别需要时间a i,b i来完成,⼀台机器只能同时进⾏⼀项作业,问完成所有作业所需的最⼩时间。
多机流⽔作业调度:⼀个作业需要在⼤于两台机器上先后完成,是NP-hard问题。
解法:问题就是求最佳作业序列。
设前i项作业所需的时间为C i,可以得出以下式⼦c i=a1+b1,i=1 max c i−1,∑i j=1a j+b i,2≤i≤n可以证明,对于相邻两项i和j,如果min(a i,b j)<min(a j,b i)则i项放前⾯更优。
将a i和b i的关系分为<,=,>三类,可以得到如下排列顺序:1.当a i<b i,a j<b j时,a i≤a j,应该按a升序排序2.当a i=b i,a j=b j时,随意排列。
3.当a i>b i,a j>b j时,b i≥b j,应该按b降序排序。
同样可以证明,a i<b i的项应该排在最前,然后是a i=b i的项,最后是a i>b i的项。
代码:{{}//P1248,给定n,ai,bi,求最⼩⽤时和对应序列#include <bits/stdc++.h>using namespace std;const int maxn=1e5+5;typedef long long ll;struct node{int a,b,d,id;bool operator<(const node &v)const {if(d!=v.d)return d<v.d;else if(d==-1){return a<v.a;}else{return b>v.b;}}}p[maxn];int main () {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&p[i].a);for(int i=1;i<=n;i++){scanf("%d",&p[i].b);p[i].id=i;int cha=p[i].a-p[i].b;if(cha==0)p[i].d=0;else p[i].d=cha<0?-1:1;}sort(p+1,p+1+n);ll ans=0,dt=0;for(int i=1;i<=n;i++){ans+=p[i].a;dt=max(0ll,dt-p[i].a);dt+=p[i].b;}ans+=dt;printf("%lld\n",ans);for(int i=1;i<=n;i++){if(i>1)printf(" ");printf("%d",p[i].id);}puts("");}Processing math: 100%。
精选最优流水作业调度问题:流水作业调度问题
最优流水作业调度问题摘要本文给出了双机流水作业调度的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算法。
作业调度问题
流水作业调度实例:
假设有一组作业需要在M1和M2 两台机器上进行流水作业, 他们在M1和M2上的作业时间如下表:
设是所给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))。这就证明了流水作 业调度问题具有最优子结构的性质。
T 'S,t ai aj T S {i, j},t ji
t ji bj bi a j ai max{ t, ai a j bj , a j}
当作业i和j 满足Johnson 不等式 min{bi,aj} ≥min{bj,ai}时,有
从而
max{ bi ,a j} max{ bj ,ai} 等价形式
min{ b (i) , a } (i1) min{ b (i1) , a (i)}, 1 i n 1
这样的调度π称为满足Johnson 法则的调度。 进一步还可以证明,调度满足Johnson 法则当且仅当对任意i<j 有
关于流水车间调度问题的综述
关于流水车间调度问题的综述关于流水车间调度问题的综述.曲媛-杨晓伟z摘要:流水车间调度问题,也被称为同序作业调度问题,是许多实际流水线生产调度问题的简化模型.它无论是在离散制造工业还是在流程工业中都具有广泛的应用.因此,对其进行研究具有重要的理论意义和工程价值.本文介绍了流水车间调度问题的研究现状和几种解决方法.关键词:流水车间;遗传算法;启发式算法引言自从Johnson1954年发表第一篇关于流水车间调度问题的文章以来.流水车间调度问题引起了许多学者的关注.流水车间调度问题一般可以描述为n个工件要在m台机器上加工.每个工件需要经过m道工序,每道工序要求不同的机器.n个工件在m台机器上的加工顺序相同.工件i在机器j上的加工时间是给定的,设为t(I.j).问题的目标是求n个工件在每台机器上最优的加工顺序,使最大流程时间达到最小.对该问题常常作如下假设.(1)每个工件在机器上的加工顺序是1,2.…,m;(2)每台机器同时只能加工一个工件;(3)一个工件不能同时在不同的机器上加工;(4)工序不能预定:(5)工序的准备时间与顺序无关,且包含在加工时间中;(6)工件在每台机器上的加工顺序相同,且是确定的.基本算法1.一种基于扩展采样空间的混合式遗传算法将邻域搜索与遗传算法相结合求解流水车间调度问题,提出了一种邻域结构.使之更适合求解流水车间问题;设计了一种基于扩展采样空间的混合式遗传并通过计算机模拟验证其有效性.其中,邻域搜索使用定义(由给定的染色体通过随机移动一个基因到一个随机的位置.得到的是染色体的集合)所描述的邻域.采样空间为父代P(t),改进的父代s(t),交叉的后代C(t),变异的后代M(t).交叉和变异的父代是种群的父代P(t),而不是改进的父代S(to具体的混合式算法框架BEGINt=0初始化P(t)WHILE不满足终止条件Do①下降搜索.应用多点最速下降法改进P(t),得到改进的父代S(t);24中小企业科技2007.07②用P(t)进行单点交叉生成C(t);③用P(t)进行移动变异生成M(t);④采样从P(t),S(t),C(t),M(t)中选出最好的不重复的下一代染色体:t=t+1END2.改进的DNA进化算法改进的DNA进化算法中引入了交换操作(交换操作就是在DNA单链中随意产生一个位置.然后将位置前的DNA链与位置后的DNA链相交换.组成一条新的链)以更好地搜索解空间,并采用黄金分割率控制变异个体的数目.同时为了进一步提高搜索性能.采用一种新颖的启发式规则.具体算法如下:对于每个工件都有3个时间指数:t为工件j在所有机器上的加工时间之和;t1i为工件j在第一台机器上的加工时间; t为工件j在最后一台机器上的加工时间;tj为工件j的加权加工时间.B,C是[0,1]之间的数.当随机生成一个A,再在[0,1一A]之间随机产生一个B便能确定tj的大小.然后每个工件按照Tj的降序排列.这样就会产生一个可行解.生成不同的A,就会得到不同的可行解.将启发式算法得到的可行解作为DNA进化算法的初始群体.具体算法如下:①计算每个工件tmi的及tlI;@)For(I=1,2.7.n)(n表示要产生的可行解的个数);A=random(0,1);B=random(0,1一A):tⅡ=At~j+Btlj+(1一A—B)tmj;End③根据每个工件计算出的t.进行降序排列.得到对应的工件排序,即可行解.通过仿真可以验证.加入启发式算法能够快速地接近最优解.提高算法的收敛速度.产生初始种群.3.一种基于遗传算法的求解方法一种基于遗传算法的求解方法.在由染色体转换成可行调度的过程中引入工件插入方法.同时设计了一种新的交叉算子(这里设计了一种新的交叉算子.从种群中按交叉概率随机选取两个个体作为父体.对于每个个体随机寻找两个不同的基因位置.选择这两个位置及其之间的基因作为交叉部分.两个交叉部分的长度可以不同.首先将两个交叉部分进行交换.然后按照父体中原来基因排列的顺序补齐交叉部分没有包含的基因.经过交叉之后产生的子代个体一部分基因保留了在一个父辈个体中的绝对位置,另部分基因则保留了在另一个父辈中的相对位置.该操作具有较好的遗传特性,同时也能够产生足够的搜索空间.计算表明该算子优于PMX交叉算子.)通过大量的数值计算表明.该算法优化质量大大优于传统的遗传算法和NEH启发式算法.4.一个无等待流水车间调度启发式算法采用一个经典的全局任务插入算法构造初始解,应用局部搜索方法对其进行改进.通过4000个不同规模实例将提出算法与目前求解该问题最好的几个算法从性能和计算时间方面进行全面比较.实验结果表明:提出算法的性能是目前最好的,多项式复杂度的计算时间适合实际生产需求.此启发式算法包括两个阶段:初始序列的产生阶段和改进阶段.(1】在初始序列的产生阶段.采用任务插入的方法,它类似于NEH[3]算法.(2)在初始序列的改进阶段,定义V=(X,Y)为序列s中的一对位置,其中:,Y∈{l,2….刀),≠Y.V的移动将S中第X个任务插入到第y个位置,位置对集合:Z={(J,)J,Y∈{l,2,…),Y壁{,—l}},其中包括(n一1)(n一1)个位置对.算法描述如下:①令k=1,计算所有任务ji(I=1,2…,n)的F2值.选择最小值对应的任务放入S中,将其余n一1个任务放入R 中;(K=K+1;③从R中任意取出一个任务j,将其插入到S的K个不同位置.产生K个不同的序列.计算这K个序列的F1值,选择最小值对应的序列作为一个候选序列,将任务j从R中移除;④如果R≠,返回第3步,否则转到第5步;⑤在产生的(n—K+I)个候选序列中,计算各自的F值.选择最小值对应的序列替换S.将序列S以外的所有任务存放到集合R中;⑥如果K=n,结束,S即为最终初始序列;否则回到第2步继续;⑦生成序列S的位置对集合并进行插入操作,产生(n一1)个新的任务序列,计算所有新产生序列的F1值,将最小值对应序列记为S;⑧如果F,(S)=F,(S),则S=S.返回第7步重新开始;否则转入第9步;⑨序列S即为最终任务序列.5.混合禁忌搜索算法(HTS)(1)混合禁忌搜索HTs算法的主要思路为:通过一个有效的启发式算法为TS算法提供一个较好初始解,并可加快TS 算法的收敛速度;采用禁忌搜索算法改进初始解以搜索到更好的近优解.初始解生成算法:①任意产生一个初始序列Q.;②利用双插入启发式算法[5](DIH)对序列Q进行改进获取一个序列S.DIH基于全局插入操作和局部插入操作的思想来产生局部种子序列并对当前调度进行改进.该算法具有较高效率的搜索能力.得到一个较好的近优解;③将序列S进行一次全局成对交换,得到初始序列P.(2)HTS算法描述:基于已得到的序列P作为初始解T0和以上禁忌搜索算法,关键参数的设置,下面给出HTS算法:①调用初始解生产算法产生初始解P并赋予To;②将初始解T作为当前解利用成对交换(Swap)产生的邻域结构得到多个邻域解;③将所有邻域解对应的目标函数值从小到大排序,然后选取前e个邻域解作为候选解;④从第1个候选解开始,如果满足藐视准则,则将此邻域解作为当前的序列T,;否则在候选解中选非禁忌的最佳状态序列作为当前序列T,;⑤保存每个当前序列T,及其目标函数值,并找出其中最优的目标函数值及对应的序列W,;⑥若满足终止条件,则比较最后得到的当前序列T,与序列w,所对应的目标函数值大小,选取目标函数值小的序列作为算法最终所得到的近优解,算法停止;若不满足终止条件则To=T,,则转向2.6.混合规划针对不确定条件下流水车间调度问题(Flowshopschedul—ing),研究了含有随机参数和灰色参数的混合机会约束规划模型的建立及求解方法.提出了灰色模拟的概念和方法,为含有灰色参数的机会约束规划提供了求解途径.通过理论推导及仿真实例,结合遗传算法,验证了基于随机模拟和灰色模拟的混合机会约束规划的调度模型及求解方法的有效性.结束语从目前来看,还没有一个求解流水车间问题最优解的简明算法.整数规划和分枝定界技术是寻求最优解的常用方法.然而对于一些大规模甚至中规模的问题,这两种方法仍然不是很有效.以遗传算法,模拟退火,禁忌搜索以及人工神经网络为代表的智能化优化技术迅速发展来解决流水车间调度问题,受到人们的普遍关注.其中,遗传算法以其优良的计算性能和显着的应用效果而特别引人注目,所以很多启发式混合方法都是在此基础上发展起来的.刁参考文献1梁黎明,汪国强.求解流水车间调度问题的一种混合式遗传算法[I].华南理工大学,2001;(t1):85~882俊林.薛云灿,邵惠鹤.求解混合流水车间调度问题的一种遗传算法[I].计算机工程与应用.2003;(35):186~1873牛群,顾幸生.基于启发式规则的新型进化算法在流水车间调度中的应用[I].华东理工大学,2006;(12):1472~1477(作者简介:1.华南理工大学数学科学学院硕士研究生.2.华南理工大学数学科学学院副教授,博士.)2007.07中小企业科技25。
流水线调度问题
流⽔线调度问题1.调换流⽔线⽆需时间: 加⼯⼀件物品,有n条流⽔线,每条流⽔线都有m个⼯序,不同流⽔线的相同⼯序处理功能相同,但处理时间可能不同,为t[i][j]。
若⼯序的进出站时间不计,流⽔线的调换时间也不计。
求加⼯⼀件物品最少需要多少时间。
状态:F[j]表⽰加⼯到第j个⼯序所需的最少时间 状态转换:F[j]=F[j-1]+min{t[1][j],t[2][j]...t[n][j]};2.调换流⽔线需时间: 加⼯⼀件物品,有n条流⽔线,每条流⽔线都有m个⼯序,第i条流⽔线的j到⼯序处理时间为t[i][j],第i条流⽔线调换到第j条流⽔线所需时间为p[i][j]。
求加⼯⼀件物品所需的最少时间:分析: 如果我们按上题⼀样,⽤F[j]来表⽰加⼯到第j到⼯序所需时间,那么在状态转移时我们发现,F[j]与F[j-1]并没有直接的关系。
假设F[j-1]出现在第i条流⽔线,它可能由于调换流⽔线的时间太长,导致F[j]选择了从时间稍微长⼀点的的K条流⽔线的第j-1出发。
所以我们发现,此时的最值与第⼏条流⽔线也相关,由此想到⽤⼀个⼆维数组来记录最值。
状态:F[i][j]表⽰加⼯到第i条流⽔线的第j道⼯序所需的最少时间 状态转移:F[i][j]=min{F[1][j-1]+p[1][i],F[2][j-1]+p[2][i],...,F[n][j-1]+p[n][i]} 最后处理:F[1][m],F[2][m],...,F[n][m]记录着到最后⼀步⼯序不同流⽔线所需时间。
在⽐较⼀轮选出最短时间的则为最终结果。
3.每⼀道⼯序调换流⽔线需不同时间: 加⼯⼀件物品,有n条流⽔线,每条流⽔线都有m个⼯序,第i条流⽔线的j到⼯序处理时间为t[i][j],第k(k<=m-1)道⼯序中第i条流⽔线调换到第j条流⽔线所需时间为p[k][i][j]。
求加⼯⼀件物品所需的最少时间:分析: 与上⼀种情况类似,不过是⽤3维数组来记录 状态:F[i][j]表⽰加⼯到第i条流⽔线的第j道⼯序所需的最少时间 状态转移:F[i][j]=min{F[1][j-1]+p[j-1][1][i],F[2][j-1]+p[j-1][2][i],...,F[n][j-1]+p[j-1][n][i]}4.有的题意很明显是流⽔线调度问题,有些需要稍稍转换⼀下,只是包装不⼀样⽽已,其实换汤不换药。
流水作业调度问题报告
题目二 流水作业调度2.1问题重述n 个作业},,2,1{n 要在由2台机器1M 和2M 组成的流水线上完成加工。
每个作业加工的顺序都是先在1M 上加工,然后在2M 上加工。
1M 和2M 加工作业i 所需的时间分别为i a 和i b ,n i ≤≤1。
流水作业调度问题要求确定这n 个作业的最优加工顺序,使得从第一个作业在机器1M 上开始加工,到最后一个作业在机器2M 上加工完成所需的时间最少。
2.2问题分析设全部作业的集合为},,2,1{n N =。
S 是N 的作业子集。
在一般情况下,机器1M 开始加工S 中作业时,机器2M 还在加工其他作业,要等时间t 后才可利用。
将这种情况下完成S 中作业所需的最短时间记为),(t S T 。
流水作业调度问题的最优值为)0,(N T 。
经过分析,流水作业调度问题具有最优子结构性质。
设π是所给n 个流水作业的一个最优调度,它所需的加工时间为')1(T a +π。
其中'T 是在机器2M 的等待时间为)1(πb 时,安排作业)(,),2(n ππ 所需的时间。
记)}1({π-=N S ,则有),()1('πb S T T =。
由流水作业调度问题的最优子结构性质可知:)}},{({min )0,(1i i n i b i N T a N T -+=≤≤ (1)一般形式:})}0,max{,},{({min ),(i i i Si a t b i S T a t S T --+=∈ (2) 从公式(1)可以看出,该问题类似一个排列问题,求N 个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
将问题规模缩小。
公式(2)说明一般情况下,对作业集S 进行调度,在2M 机器上的等待时间,除了需要等该部件在1M 机器上完成时间,还要冲抵一部分原来的等待时间,如果冲抵已成负值,自然仍需等待1M 将作业做完,所以公式取}0,max {i a t -。
流水作业调度问题
一、 问题描述给定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 情况下的一个最优调度。
动态规划——流水作业调度问题
动态规划——流⽔作业调度问题问题:n个作业 N={1,2,…,n}要在2台机器M1和M2组成的流⽔线上完成加⼯。
每个作业须先在M1上加⼯,然后在M2上加⼯。
M1和M2加⼯作业i 所需的时间分别为 ai 和bi,每台机器同⼀时间最多只能执⾏⼀个作业。
流⽔作业调度问题要求确定这n个作业的最优加⼯顺序,使得所有作业在两台机器上都加⼯完成所需最少时间。
最优调度应该是:1. 使M1上的加⼯是⽆间断的。
即M1上的加⼯时间是所有ai之和,但M2上不⼀定是bi之和。
2. 使作业在两台机器上的加⼯次序是完全相同的。
则得结论:仅需考虑在两台机上加⼯次序完全相同的调度。
为了得到最优⼦解结构(⽐较重要~~~~ ⽼师说期末考试会考到这个):—>机器M1开始加⼯S中作业时,机器M2还在加⼯其他作业,要等时间 t 后才可利⽤,则: 1. 则完成S中作业所需的最短时间记为T(S,t) 2. 完成所有作业所需的最短时间为T(N,0) 3. T(N,0)=min{ai + T(N-{i}, bi)}, i∈N。
ai:选⼀个作业i先加⼯,在M1的加⼯时间。
T(N-{i},bi}:剩下的作业要等bi时间后才能在M2上加⼯。
注意这⾥函数的定义,因为⼀开始⼯作i是随机取的,M1加⼯完了ai之后,要开始加⼯bi了,这⾥M1是空闲的可以开始加⼯剩下的N-i个作业了,但此时M2开始加⼯bi,所以要等bi时间之后才能重新利⽤,对应到上⾯函数T(s,t)的定义的话,这⾥就应该表⽰成T(N-{i},bi), 所以最优解可表⽰为T(N,0)=min{ai + T(N-{i}, bi)}, i∈N,即我们要枚举所有的⼯作i,使这个式⼦取到最⼩值。
这⾥顺便吐槽⼀句:算法中会利⽤很多数学知识,⼀定要搞清楚函数的意义以及每个数学符号所代表的含义,这样不⾄于各种懵⽐。
继续分析T(S,t)可得: T(S,t)={ai + T(S-{i}, bi+max{t-ai,0})}, i∈S 其中:T(S-{i}, bi+max{t-ai,0}):剩下的作业等bi+max{t-ai,0}才能在M2加⼯,⾄于这⾥是怎么推导出来的呢?见下⾯推导:最优⼦结构的证明(问题最优解包括⼦问题最优解):最优⼦结构:设π是N的⼀个最优调度,其加⼯顺序为π1,…, πn,其所需的加⼯时间为 aπ1+T’(即第⼀个作业π1在M1上加⼯的时间和其它的加⼯时间)。
作业车间调度问题的几种模型
作业车间调度问题是指如何合理地安排工件在不同工序间的加工顺序,以达到最优的生产效率和成本控制。
针对这一主题,我将从几种常见的模型出发,深入探讨作业车间调度问题,旨在为您提供一篇有价值的文章。
一、传统作业车间调度模型1.1 单机调度模型在单机调度模型中,工件依次经过一个加工机器的加工过程。
我们需要考虑如何安排加工顺序、加工时间等因素,以最大程度地减少工件的等待时间和加工时间,提高生产效率。
1.2 流水车间调度模型流水车间调度模型是指在多台加工机器之间,工件按照特定的加工顺序依次进行加工。
我们需要考虑如何合理安排工件的加工顺序,以减少生产中的瓶颈和待机时间,提高整个流水线的生产效率。
1.3 作业车间调度的经典排序问题这种模型主要关注如何将待加工的工件按照特定的规则进行排序,以便在加工过程中最大程度地降低总加工时间和成本。
以上是传统作业车间调度问题的一些经典模型,它们都是针对不同的生产场景和加工流程所提出的解决方案。
接下来,我将对每种模型进行更深入的探讨,以便更好地理解作业车间调度问题。
二、作业车间调度问题的多种解决方法2.1 基于启发式算法的调度方法启发式算法是一种基于经验和规则的算法,它能够快速、高效地求解作业车间调度问题。
常见的启发式算法包括遗传算法、模拟退火算法等,它们能够在短时间内找到较优的解,并且适用于各种不同规模和复杂度的生产场景。
2.2 基于数学规划的调度方法数学规划方法是指利用数学建模和优化理论,对作业车间调度问题进行严格的数学求解。
通过建立数学模型,我们可以利用线性规划、整数规划等方法,对作业车间调度问题进行最优化求解,得到最优的生产调度方案。
2.3 基于仿真的调度方法仿真方法是指利用计算机模拟生产场景,通过模拟实际的生产过程,找到最优的调度方案。
通过仿真,我们可以更加真实地模拟生产现场的情况,找到最优的生产调度策略,提高生产效率和降低成本。
以上是作业车间调度问题的多种解决方法,它们都能够根据不同的生产场景和需求,找到最优的调度方案。
流水作业调度
流水作业调度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不等式。
故障条件下柔性流水车间调度问题
故障条件下柔性流水车间调度问题故障条件下柔性流水车间调度问题1、相关定义1.1、遗传算法的基本概念遗传算法是一种直接搜索的优化算法,它产生的依据是生物进化论以及遗传学说。
因此,在该算法中会涉及到生物进化论与遗传学中的一些概念。
这些概念如下所示: (1) 基因:基因是一个DNA 片段,它是染色体的主要组成部分,控制着生物性状, 是遗传物质的基础。
(2) 染色体:染色体是基因的物质载体,它有基因型和表现型两种表示模式。
(3) 种群:种群就是个体的集合。
其中个体是带有染色体特征的实体。
(4) 种群大小:种群大小等于种群中的个体数。
(5) 适应度:适应度就是个体能够适应环境的程度。
适应度是衡量种群中个体优劣程度的一个数量值。
18 长安大学硕士学位论文(6) 选择:达尔文的―物竞天择、适者生存‖法则说明,在自然环境中,对周围的生存环境适应能力强的个体生存下来的机会比较大,同时把其优良的性状遗传到下一代的机会也比较大。
遗传算法中选择操作的目的就是选择优良的个体,让它们作为父代直接遗传到下一代或者经过交叉、变异操作遗传到下一代。
(7) 交叉:交叉操作的目的是为了产生新的个体,更适应周围的生存环境,它有利于种群的进化。
(8) 变异:任何物种的性状在自然进化过程中都不是一成不变的,它会随着生存环境的变化而变化。
变异操作就是效仿生物的变异而设计的,它是产生新个体的一种辅助方法,同时它也促使遗传算法拥有一定的搜索能力。
1.2、多目标优化的基本概念多目标优化问题(Multi-objective Optimization Problem)也可以称为是向量优化或多标准优化问题。
多目标的优化问题可表示为:在一个可行域的范围内,首先利用决策变量组成向量,使该变量能够满足所有的约束条件,从而得到多目标函数组成的最优化向量。
这些构成最优化向量的多个目标函数间往往是此消彼长的。
在一般情况下,多目标的优化问题是由决策变量、目标函数以及约束条件构成的, 而这三者是由函数关系联系起来的。
流水作业调度问题
流水作业调度问题描述: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小时。
图如下:从刚才的分析可知,主要考虑机器2的等待时间,越少越好!如何做到呢???仔细分析可知,在机器1上需要的时间越少的,应该越早开始进行,这样才能保证机器2尽早开始。
流水作业调度问题———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个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
C++程序 流水作业调度
其中, t ji t[ j,2] t[i,2] t[ j,1] t[i,1] max{t , t[i,1] t[ j,1] t[ j,2], t[ j,1]} 当作业 i 和 j 满足 Johnson 不等式 min{t[i,2], t[ j,1]} min{t[ j,2], t[i,1]} 时,我 们有 max{t[i,2],t[ j,1]} max{t[ j,2],t[i,1]} 从而, t[i,1] t[ j,1] max{t[i,2],t[i,1]} t[i,1] t[ j,1] max{t[ j,2],t[i,1]} 由此可得, max{t[i,1] t[ j,1] t[i,2], t[i,1]} max{t[i,1] t[ j,1] t[ j,2], t[i,1]} 因此任意 t 有
4. 算法的描述
从上面的分析可知,流水作业调度问题一定存在满足 Johnson 法则的最 优调度,且容易由下面的算法确定。 流水作业调度问题的 Johnson 算法: (1) 令 N1 {i | t[i,1] t[i,2]}, N2 {i | t[i,1] t[i,2]} ; (2) 将 N1 中作业依 t[i,1] 的非减序排列; 将 N 2 中作业依 t[i,2] 的非增序排列; (3) N1 作业接 N 2 种作业构成满足 Johnson 法则的最优调度。 具体的代码在文件夹《流水作业调度——动态规划法》文件夹中。 三、 时空效率分析 算法 FlowJob 的主要计算时间花在对作业集的排序上。在这里,我们 使用冒泡排序法(BubbleSort),因此,在最坏情况下算法 FlowJob 所需要 的计算时间为 O(n log n) 。所需要的空闲显然是 O(n) 。
流水作业调度问题 独立任务最优调度 石子合并问题
一、流水作业调度问题问题描述:n 个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。
每个作业加工的顺序都是先在M1上加工,后在M2上加工。
在两台机器上加工的时间分别为ai 和bi 。
目标:确定这n 个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。
分析:这是一个非常经典的问题,与前面的问题都不相同。
设T(S,t)表示如下的情况:当M1开始加工S 中的作业时,M2还在加工其他作业,还需要t 时刻后才能使用。
在这种情况下完成S 中作业所需要的最短时间为T(S,t)。
根据题意,所需要的最少时间为T(N,0)。
考虑到每一个作业都有可能作为第一种情况,此时,可以考虑类似全排列的思想,得到如下的递推式:当t=0时,有)}},{({min )0,(1i i ni b i N T a N T -+=≤≤ 当0≠t 时,})}0,max{},{({min ),(i i i Si a t b i S T a t N T -+-+=∈递归算法:#include <stdio.h>#define n 4int a[n]={5,12,4,8};int b[n]={6,2,14,7};int index[n]={0,1,2,3}; //用来控制全排列的下标,这个下标与数组对应起来int f(int i, int t){int tt;if(i==n-1){tt=(t-a[index[n-1]])>0?(t-a[index[n-1]]):0;return b[index[n-1]]+tt+a[index[n-1]];}tt=(t-a[index[i]])>0?(t-a[index[i]]):0;int minvalue=a[index[i]]+f(i+1,b[index[i]]+tt);for(int j=i+1;j<n;j++){int temp=index[i];index[i]=index[j];index[j]=temp;tt=(t-a[index[i]])>0?(t-a[index[i]]):0;int tempvalue=a[index[i]]+f(i+1,b[index[i]]+tt);if(tempvalue<minvalue)minvalue=tempvalue;temp=index[i];index[i]=index[j];index[j]=temp;}return minvalue;}int main(){printf("%d\n",f(0,0));return 0;}二、独立任务最优调度问题问题描述:用两台处理机A 和B 处理n 个作业。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
流水作业调度问题
描述:
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行,每行两个非负整数,分别表
示在第一台机器和第二台机器上加工时间。
输出:
每个用例用一行输出采用最优调度所用的总时间,即从第一台机器开始到第二台机器结束的时间。
样例输入:
1
4
5 6
12 2
4 14
8 7
样例输出:
33
假定直接按顺序进行完成,则机器1 可以不用考虑,因为作业1 完成后就可以完成作业
2,直到作业n,需要的时间为所有作业在机器1上的时间总和。
但是,机器2 上完成的时间呢?
机器2上完成的时间显示除了作业在机器2上完成的时间总和, 还要加上等待时间, 即要求先在机器1 上完成后,才能在机器2 上开始。
例如
5 6
12 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小时。
图如下:
5 12
12 5
从刚才的分析可知,主要考虑机器2的等待时间,越少越好!
如何做到呢???
仔细分析可知,在机器1上需要的时间越少的,应该越早开始进行,这样才能保证机器2尽早开始。
但真是这样吗?
如:
5 6
4 2
按顺序需要共13小时,等待5小时; 逆序需要共15小时,等待7小时。
那怎么办呢???
根据相关解题思路及教材上Johnson法则,在此采用的方法简述如下:
在机器1上需要时间比在机器2是需要时间少的先开始,且按时间从小到大开始进行; 在机器1上需要时间比在机器2上需要时间多的后开始,按按时间从大到小开始进行;
解题思路(简略版)
,index为作业号
对d依时间排序
得到顺序为2 03 1顺序,即先安排第3个工作,再安排第1个,再安排第4个,最后安排第2个。