您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 生产计划与控制实践大作业2
生产计划与控制实践大作业遗传算法求解车间作业调度问题课程名称:生产计划与控制实践报告题目:遗传算法求解车间作业调度问题指导老师:高杰组员姓名:王佳昀、姚泽坤、方正所在组号:第十二组二0一四年12月22日1、问题回顾车间作业调度问题(1)PPT中例子(如下图所示)的求解编写MATLAB遗传算法GA_JSP函数M文件代码(源代码较长)见附录之后在命令窗口调用GA_JSP函数求解的文件主程序编写如下:%%文件主体部分clc,clear%清除命令窗口,清除工作空间NIND=40;%种群所包含个体数目MAXGEN=50;%最大遗传代数GGAP=0.9;%代沟P_Cross=0.8;%交叉率P_Mutation=0.6;%变异率Jm={123;132;213};%工序机器矩阵T={332;153;323};%加工时间矩阵MakeSpan=GA_JSP(NIND,MAXGEN,GGAP,P_Cross,P_Mutation,Jm,T);fprintf('最小加工流程时间为:\n')disp(MakeSpan)程序运行结果如下:最小加工流程时间为11,比课件图中给出的两种方案用时少,此方案更优图中201表示第二个工件的第一道工序,其余类推(2)公邮中TXT文本FisherandThompson6x6instance的求解采用与(1)相同的方法,输入工序机器矩阵Jm和加工时间矩阵T即可求解其中:Jm={312465;235614;346125;213456;325614;246153};%工序机器矩阵T={136736;851010104;548917;555389;935431;3391041};%加工时间矩阵运行结果截图:附录1MATLAB遗传算法GA_JSP函数M文件的部分主要代码(由于代码较长,此处仅保留了主函数代码):functionMakeSpan=GA_JSP(NIND,MAXGEN,GGAP,P_Cross,P_Mutation,Jm,T)%%程序功能说明%基于遗传算法的作业车间调度问题的求解程序(GA_JSP)%====输入变量====%NIND:种群所包含个体的数目%MAXGEN:最大遗传代数%GGAP:代沟%P_Cross:交叉概率%P_Mutation:变异概率%Jm:各工序的可选机器集合,为m×n的元胞矩阵,m为机器数(工序),n为工件数%T:加工时间矩阵%====输出变量====%MakeSpan:最小的最大完工时间%%主函数程序部分gen=0;%迭代计数器JmNumber=Max_Cell(Jm);%调用Max_Cell子函数求机器的数量[PNumber,MNumber]=size(Jm);%PNumber为工件个数,MNumber为工序个数trace=zeros(2,MAXGEN);%寻优结果的初始值,一行存放各代的最优解,一行存放各代解的均值TotalOP_Number=PNumber*MNumber;%工序总个数%(1)初始化Number=zeros(1,PNumber);%Number存放每个工件的工序数,PNumber工件个数fori=1:PNumberNumber(i)=MNumber;%MNumber工序个数end%染色体个体编码:代码分为两层,第一层表示工序,第二层表示机器Chrom=zeros(NIND,2*TotalOP_Number);%染色体的长度为2*TotalOP_Numberforj=1:NIND%逐代寻优WPNumberTemp=Number;fori=1:TotalOP_Number%随机产生工序val=unidrnd(PNumber);whileWPNumberTemp(val)==0val=unidrnd(PNumber);end%第一层代码表示工序Chrom(j,i)=val;WPNumberTemp(val)=WPNumberTemp(val)-1;%第二层代码表示机器Temp=Jm{val,MNumber-WPNumberTemp(val)};SizeTemp=length(Temp);%随机产成工序机器Chrom(j,i+TotalOP_Number)=unidrnd(SizeTemp);endend%(2)计算目标函数值[PVal,ObjV,P,S]=cal(Chrom,JmNumber,T,Jm);%调用子函数程序cal求个体适应度值%(3)循环寻找最优解whilegenMAXGEN%分配适应度值FitnV=ranking(ObjV);%调用子函数程序ranking进行排序操作%选择操作SelCh=select('rws',Chrom,FitnV,GGAP);%调用子函数程序select进行选择操作,采用轮盘赌策略(rws)%交叉操作SelCh=across(SelCh,P_Cross,Jm,T);%调用子函数程序across进行交叉操作%变异操作SelCh=aberranceJm(SelCh,P_Mutation,Jm,T);%调用子函数程序aberranceJm进行变异操作%重新计算目标适应度值(个体)[PVal,ObjVSel,P,S]=cal(SelCh,JmNumber,T,Jm);%调用子函数程序cal求个体适应度值%重新插入新种群[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%调用子函数程序reins重新插入新种群%迭代计数器增加1gen=gen+1;%保存最优值trace(1,gen)=min(ObjV);trace(2,gen)=mean(ObjV);%记录最佳值ifgen==1Val1=PVal;Val2=P;MinVal=min(ObjV);%最小的最长流程加工时间STemp=S;end%记录最小的工序ifMinValtrace(1,gen)Val1=PVal;Val2=P;MinVal=trace(1,gen);STemp=S;endend%(4)当前最佳值PVal=Val1;%工序时间P=Val2;%工序S=STemp;%调度基因含机器基因%(5)描绘解的变化figure(1)%打开绘制解/均值随迭代次数的变化情况的图形窗口plot(trace(1,:),'b-');%最优解holdon;plot(trace(2,:),'r-.');%解的均值gridon;xlabel('迭代次数');ylabel('适应度值(时间单位)');legend('解的变化','种群均值的变化');title('解/均值随迭代次数的变化情况');MakeSpan=min(trace(1,:));%整批工件的完工时间(最长流程加工时间)的最小值%(6)显示最优解figure(2);%打开绘制工件加工排序甘特图的图形窗口MP=S(1,PNumber*MNumber+1:PNumber*MNumber*2);%调出机器排序fori=1:TotalOP_Numberval=P(1,i);a=(mod(val,100));%工序b=((val-a)/100);%工件Temp=Jm{b,a};mText=Temp(MP(1,i));x1=PVal(1,i);%工序的开工时间x2=PVal(2,i);%工序的完工时间y1=mText-0.5;%0.5为甘特图矩形条的宽度,该数字可以更改y2=mText;%用于绘制矩形条的高度PlotRec(x1,x2,mText);%调用PlotRec函数绘制甘特图函数holdon;fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/PNumber]);%填充矩形条text((x1+x2)/2,mText-0.25,num2str(P(i)));%用文本标识工序,标注位置为矩形条的中心end
本文标题:生产计划与控制实践大作业2
链接地址:https://www.777doc.com/doc-2203430 .html