C++程序流水作业调度Word下载.docx

上传人:b****4 文档编号:14352826 上传时间:2022-10-22 格式:DOCX 页数:15 大小:97.99KB
下载 相关 举报
C++程序流水作业调度Word下载.docx_第1页
第1页 / 共15页
C++程序流水作业调度Word下载.docx_第2页
第2页 / 共15页
C++程序流水作业调度Word下载.docx_第3页
第3页 / 共15页
C++程序流水作业调度Word下载.docx_第4页
第4页 / 共15页
C++程序流水作业调度Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

C++程序流水作业调度Word下载.docx

《C++程序流水作业调度Word下载.docx》由会员分享,可在线阅读,更多相关《C++程序流水作业调度Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

C++程序流水作业调度Word下载.docx

这与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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1