1、 二、需求分析1、用户可以根据自己的需要输入想要进入流水线的作业数。2、用户可以输入这几个作业在机器M1和M2上的加工时间。3、由主函数调用流水作业调度的Johnson算法来实现对流水作业的安排。4、输出经过Johnson算法安排后的作业序列,这就是最终的一个最优调度。三、概要设计总体设计:假定这n个作业在机器M1上加工时间为,在机器M2上加工时间为=n.由流水作业调度问题具有最优子结构性质可知, 1j.key) t=i; i=j; j=t; /*执行Johnson算法确定最优调度*/int Flowshop(int n,int a,int b,int c) int i; Sjob d; fo
2、r(i=0;ibibi:ai; i.job=ai=bi; i.index=i; sort(d,n); int j=0,k=n-1; ifi.job) cj+=i.index; else ck-=i.index; j=ac0; k=j+bc0; for(i=1; j+=aci; k=jk?k+bci:j+bci; return k;函数调用关系:六、编码#include #define MAXSIZE 1000void main() int n,i; int aMAXSIZE,bMAXSIZE,cMAXSIZE; printf(流水线中的作业个数是:); scanf(%d,&n);第一个的加工时
3、间是:%d,ai);第二个的加工时间是: for(i=0;bi);int m=Flowshop(n,a,b,c);+i) printf(%d ,ci);nprintf(最短加工完成时间是%dn,m);七、测试在运行dos窗口下输入命令,这次测试输入4个作业,得出了如下结果:进行一组测试,得出了如下结果:若按照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算法中调用的排序算法是简单的选择排序,其时间的复杂度是,是一个比较高的数量级了,所以可以考虑采用其他的排序算法以提高其执行效率,如采用快速排序算法其时间复杂度明显减少,在此算法中执行效率是比较高的。