1、这与a是N的一个最优调度矛盾,所以。从而。这就是证明了流水作业调度问题具有最优子结构的性质。2. 建立递归式计算最优解由流水作业调度问题的最优子结构的性质我们可以得到,。推广到更一般的情形,我们便有:。其中,这一项是由于机器上,作业需在时间之后才能开工。因此,在机器上完成作业之后,在机器上还需时间才能完成对作业的加工。按照上面所叙述的递归式,可以设计出解决流水作业调度问题的动态规划算法。通过对递归式的分析,算法可以得到进一步的改进。3. 流水调度问题的Johnson法则 设a是作业集S在机器的等待时间为t时的任意一个最优调度。如果在调度中,安排在最前面的两个作业分别为i和j,即。则由动态规划的
2、递归式可以得到:其中, 如果作业i和j满足,则称作业i和j满足Johnson不等式。如果作业i和j不满足Johnson不等式,则交换作业i和j的加工次序后,作业i和j满足Johnson不等式。 在作业集S当机器的等待时间为t时的调度a中,交换作业i和作业j的加工次序,得到的作业集S的另一个调度a,它所需要的加工时间为 。其中, 当作业i和j满足Johnson不等式时,我们有从而,由此可得,因此任意t有从而,。由此可见。 换句话说,当作业i和作业j不满足Johnson不等式时,交换它们的加工顺序后,作业i和作业j就满足Johnson不等式了,且不增加加工时间。由此可得,对于流水作业调度问题,必存
3、在一个最优的调度a,使得作业和满足Johnson不等式:,称这样的调度a为满足Johnson法则的调度。 进一步可以证明,调度a满足Johnson法则当且仅当对任意的i和j都有ij时有。由此可知,任意两个满足Johnson法则的调度均为最优调度。至此,我们将流水调度问题转化为求满足Johnson法则的调度问题。4. 算法的描述从上面的分析可知,流水作业调度问题一定存在满足Johnson法则的最优调度,且容易由下面的算法确定。流水作业调度问题的Johnson算法:(1) 令;(2) 将中作业依的非减序排列;将中作业依的非增序排列;(3) 作业接种作业构成满足Johnson法则的最优调度。具体的代
4、码在文件夹流水作业调度动态规划法文件夹中。三、 时空效率分析 算法FlowJob的主要计算时间花在对作业集的排序上。在这里,我们使用冒泡排序法(BubbleSort),因此,在最坏情况下算法FlowJob所需要的计算时间为。所需要的空闲显然是。/ FlowOperation.h#ifndef FLOWOPERATION_H#define FLOWOPERATION_Hclass FlowOperationpublic: FlowOperation(); FlowOperation(); void run(); / 运行接口private: int number; / 流水作业个数 int nu
5、mberB; / 记录N1的个数 int numberC; int *a; / 存储流水作业时间 int *b; / N1(Ai=Bi) bool input(); / 输入接口 bool sort(); / X=0 or X=1 快速排序 目的是满足Johnson 不等式 min(Bi,Aj)min(Bj,Ai) 任意 ji bool sortB(int *b,int i,int j,int X); / X=0; bool sortC(int *c,int i,int j,int X); / X=1; void output(); / 输出计算的最优调度所用的时间;#endif/ FlowO
6、peration.cpp#include using std:endl;ios;cout;fstreamfstream;ifstream;ofstream;cstdlib/using std:exit;#include FlowOperation.h#define N 50 / 预定义有50个作业 根据实际情况可作调整ifstream inputFile(input.txt,ios:in);ofstream outputFile(output.txtout);FlowOperation:FlowOperation() / 构造函数 number=0; numberB=0; numberC=0;
7、 a=new int *N; b=new int *N; c=new int *N; for (int i=0;inumber; outputFilenumber cout for (int j=0;jaij; outputFileaij ; cout outputFile couti+) / 分类 判断 ai 与 bi 的关系 即 ai0 与 ai1的大小关系 if (ai0ai1) / 提取满足ai=bi的时间事件 在机器M1上的工作时间 小于M2上的工作时间 存储在数组c中 cnumberC0=ai0; cnumberC1=ai1; numberC+;numberB=numberB fo
8、r (int k=0;kk+)numberB;biknumberC=numberC for ( k=0;numberC;cik if (a!=NULL) if (b!=NULL) | (c!=NULL) return true; return false; return false;sort() if (sortB(b,0,numberB-1,0) / 判断是否一对数组b 排好序 if (sortC(c,0,numberC-1,1) / 判断是否一对数组c 排好序 return true;sortB(int *b,int i,int j,int X) / 升序排序 if (ij) int left=i; int right=j; j+;/ 目的是使用 -j int pivot=biX; while (i while(ij) / 从左边寻找第一个大于 pivot 的数 不适用等号 if (b+iXi) / 从右边寻找第一个小于 pivot 的数 不适用等号 if (b-jX if (i int t; t=biX; biX=bjX; bjX=t;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1