C++程序流水作业调度Word下载.docx
《C++程序流水作业调度Word下载.docx》由会员分享,可在线阅读,更多相关《C++程序流水作业调度Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
这与a是N的一个最优调度矛盾,所以。
从而。
这就是证明了流水作业调度问题具有最优子结构的性质。
2.建立递归式计算最优解
由流水作业调度问题的最优子结构的性质我们可以得到,。
推广到更一般的情形,我们便有:
。
其中,这一项是由于机器上,作业需在时间之后才能开工。
因此,在机器上完成作业之后,在机器上还需时间才能完成对作业的加工。
按照上面所叙述的递归式,可以设计出解决流水作业调度问题的动态规划算法。
通过对递归式的分析,算法可以得到进一步的改进。
3.流水调度问题的Johnson法则
设a是作业集S在机器的等待时间为t时的任意一个最优调度。
如果在调度中,安排在最前面的两个作业分别为i和j,即。
则由动态规划的递归式可以得到:
其中,
如果作业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不等式了,且不增加加工时间。
由此可得,对于流水作业调度问题,必存在一个最优的调度a,使得作业和满足Johnson不等式:
,称这样的调度a为满足Johnson法则的调度。
进一步可以证明,调度a满足Johnson法则当且仅当对任意的i和j都有i<
j时有。
由此可知,任意两个满足Johnson法则的调度均为最优调度。
至此,我们将流水调度问题转化为求满足Johnson法则的调度问题。
4.算法的描述
从上面的分析可知,流水作业调度问题一定存在满足Johnson法则的最优调度,且容易由下面的算法确定。
流水作业调度问题的Johnson算法:
(1)令;
(2)将中作业依的非减序排列;
将中作业依的非增序排列;
(3)作业接种作业构成满足Johnson法则的最优调度。
具体的代码在文件夹《流水作业调度——动态规划法》文件夹中。
三、时空效率分析
算法FlowJob的主要计算时间花在对作业集的排序上。
在这里,我们使用冒泡排序法(BubbleSort),因此,在最坏情况下算法FlowJob所需要的计算时间为。
所需要的空闲显然是。
//FlowOperation.h
#ifndefFLOWOPERATION_H
#defineFLOWOPERATION_H
classFlowOperation
{
public:
FlowOperation();
~FlowOperation();
voidrun();
//运行接口
private:
intnumber;
//流水作业个数
intnumberB;
//记录N1的个数
intnumberC;
int**a;
//存储流水作业时间
int**b;
//N1(Ai<
Bi)
int**c;
//N2(Ai>
=Bi)
boolinput();
//输入接口
boolsort();
//X=0orX=1快速排序目的是满足Johnson不等式min(Bi,Aj)≥min(Bj,Ai)任意j≥i
boolsortB(int**b,inti,intj,intX);
//X=0;
boolsortC(int**c,inti,intj,intX);
//X=1;
voidoutput();
//输出计算的最优调度所用的时间
};
#endif
//FlowOperation.cpp
#include<
iostream>
usingstd:
:
endl;
ios;
cout;
fstream>
fstream;
ifstream;
ofstream;
cstdlib>
//usingstd:
exit;
#include"
FlowOperation.h"
#defineN50//预定义有50个作业根据实际情况可作调整
ifstreaminputFile("
input.txt"
ios:
in);
ofstreamoutputFile("
output.txt"
out);
FlowOperation:
FlowOperation()//构造函数
number=0;
numberB=0;
numberC=0;
a=newint*[N];
b=newint*[N];
c=newint*[N];
for(inti=0;
i<
N;
i++)
{
a[i]=newint[2];
b[i]=newint[2];
c[i]=newint[2];
}
}
~FlowOperation()//析构函数
2;
delete[]a[i];
delete[]b[i];
delete[]c[i];
delete[]a;
delete[]b;
delete[]c;
boolFlowOperation:
input()//输入
inputFile>
>
number;
outputFile<
<
number<
cout<
for(intj=0;
j<
j++)//读取数据并导入到output.txt文件中
for(inti=0;
{
inputFile>
a[i][j];
outputFile<
a[i][j]<
"
"
;
cout<
}
outputFile<
cout<
i++)//分类判断ai与bi的关系即a[i][0]与a[i][1]的大小关系
if(a[i][0]<
a[i][1])
{//提取满足ai<
bi的时间事件在机器M1上的工作时间小于M2上的工作时间存储在数组b[]中
b[numberB][0]=a[i][0];
b[numberB][1]=a[i][1];
numberB++;
else
{//提取满足ai>
=bi的时间事件在机器M1上的工作时间小于M2上的工作时间存储在数组c[]中
c[numberC][0]=a[i][0];
c[numberC][1]=a[i][1];
numberC++;
numberB="
numberB<
for(intk=0;
k<
k++)
numberB;
b[i][k]<
numberC="
numberC<
for(k=0;
numberC;
c[i][k]<
if(a!
=NULL)
if((b!
=NULL)||(c!
=NULL))
returntrue;
returnfalse;
returnfalse;
sort()
if(sortB(b,0,numberB-1,0))//判断是否一对数组b[][]排好序
if(sortC(c,0,numberC-1,1))//判断是否一对数组c[][]排好序
returntrue;
sortB(int**b,inti,intj,intX)//升序排序
if(i<
j)
intleft=i;
intright=j;
j++;
//目的是使用--j
intpivot=b[i][X];
while(i<
while(i<
j)//从左边寻找第一个大于pivot的数不适用等号
{
if(b[++i][X]<
pivot)
{
continue;
}
break;
}
while(j>
i)//从右边寻找第一个小于pivot的数不适用等号
if(b[--j][X]>
if(i<
intt;
t=b[i][X];
b[i][X]=b[j][X];
b[j][X]=t;