1、流水作业调度流水作业调度(总8页)流水作业调度一、可行性分析与项目开发计划个作业要在由2台机器M1和M2组成的流水线上完成加工。每个作业的顺序都是现在M1上加工,然后再M2上加工。M1和M2加工作业i所需的时间分别是和,1=i=n.流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需要的时间最少。直观上,一个最优调度应该使得机器M1没有空闲时间,而且机器M2的空闲时间最少,在一般情况下,机器M2上会出现机器空闲和作业积压两种情况。设全部作业的集合为N=1,2,n。是N的作业子集,在一般情况下,机器M1开始加工作业S中作业
2、时,机器M2还在加工其他作业,要等时间t后才可以利用。将这种情况下完成S中作业所需要的最短时间记做T(S,t),则流水作业调度问题的最优值就是T(N,0).我们通过分析可以知道流水作业调度问题具有最优子结构的性质,因此考虑用动态规划算法自后向前来解决其最优问题。这就需要通过建模来得出最优子结构的递归式子,从而设计算法求解最优值。 二、需求分析1、用户可以根据自己的需要输入想要进入流水线的作业数。2、用户可以输入这几个作业在机器M1和M2上的加工时间。3、由主函数调用流水作业调度的Johnson算法来实现对流水作业的安排。4、输出经过Johnson算法安排后的作业序列,这就是最终的一个最优调度。
3、三、概要设计总体设计:假定这n个作业在机器M1上加工时间为,在机器M2上加工时间为,1=i=n.由流水作业调度问题具有最优子结构性质可知, 1=ij.key) t=i; i=j; j=t; /*执行Johnson算法确定最优调度*/int Flowshop(int n,int a,int b,int c) int i; Sjob d; for(i=0;ibibi:ai; i.job=ai=bi; i.index=i; sort(d,n); int j=0,k=n-1; for(i=0;in;i+) ifi.job) cj+=i.index; else ck-=i.index; j=ac0; k
4、=j+bc0; for(i=1;in;i+) j+=aci; k=jj.key) t=i; i=j; j=t; int Flowshop(int n,int a,int b,int c) int i; Sjob d; for(i=0;ibibi:ai; i.job=ai=bi; i.index=i; sort(d,n); int j=0,k=n-1; for(i=0;in;i+) ifi.job) cj+=i.index; else ck-=i.index; j=ac0; k=j+bc0; for(i=1;in;i+) j+=aci; k=jk?k+bci:j+bci; return k;vo
5、id main() int n,i; int aMAXSIZE,bMAXSIZE,cMAXSIZE; printf(流水线中的作业个数是:); scanf(%d,&n); printf(第一个的加工时间是:); for(i=0;in;i+) scanf(%d,&ai); printf(第二个的加工时间是:); for(i=0;in;i+) scanf(%d,&bi);int m=Flowshop(n,a,b,c); for(i=0;in;+i) printf(%d ,ci); printf(n);printf(最短加工完成时间是%dn,m); 七、测试在运行dos窗口下输入命令,这次测试输入4
6、个作业,得出了如下结果:进行一组测试,得出了如下结果:若按照Johnson算法手工做题,可知知道N1=0,2,3,N2=1;最优调度是0,2,3,1计算的最优调度时间是38再次进行一组测试,这次再次测试4个作业的情况,在N1和N2中各有两个作业的情况。得到了如下结果:如按照手工计算,可知N1=1,3,N2=0,2,排序后的最优调度是3,1,2,0,和程序结果一致,而且最优调度时间也是45再次进行一次较为合理的测试:若出现两个作业的加工时间一样,这次作业的个数是6个,作业1和作业5在两个机器上的加工时间是一样的得到如下的结果:最终的作业安排是4 0 2 3 5 1,作业5安排在了作业1的前面,这可能是由于排序算法的问题,最短加工处理时间是57测试结果也是正确的。八、维护 由于在Johnson算法中调用的排序算法是简单的选择排序,其时间的复杂度是,是一个比较高的数量级了,所以可以考虑采用其他的排序算法以提高其执行效率,如采用快速排序算法其时间复杂度明显减少,在此算法中执行效率是比较高的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1