大连海事大学Matlab作业:案例及代码.docx
文本预览下载声明
编码思路遗传算法是解决NP难问题时的一种较常规的方法,逻辑思路、算法流程、代码编写都较为成熟,但普遍性的算法效果却未必俱佳。针对不同的问题,编写合适的代码极其关键。本文属于VRP的变异问题,在此作者对影响算法效果的三个关键子函数详细阐述。染色体设计染色体是遗传迭代的基础,反映的是问题模型的解,编写满足解约束的染色体是关键。本文的决策变量较多,针对路径优化问题,由于本文中单点可被两条路径覆盖,不同于常规VRP编码。在此本文编码:for j=1:Kpop(i,(j-1)*J+1:(j-1)*J+J)=round(rand(1,J));end为了提高解的可行性,作者对上述编码进行修正,要求每个配送中心至少被覆盖一次。whilepop(i,j)+pop(i,J+j)+pop(i,2*J+j)+pop(i,3*J+j)+pop(i,4*J+j)==0pop(i,21:25)=round(rand(1,J));end针对供应点的取货问题,由于只有路径上供应点才能有取货量,且要保证取货量有一定限制,作者如下编码:for j=1:chromlengthif pop(i,j)==1p(i,j)=round(rand*(Q/2-1))+1; endend同时在计算染色体适应度时,由于对路径上货量和供应点提供量的约束较为严格,作者在算法中分别计算了两者货量h_sum和z_sum,编码如下:for i=1:popsizefor j=1:Jh_sum(i,j)=sum(p(i,J*(j-1)+1:J*(j-1)+J));%%路径上总运量h_sumendfor j=1:Jz_sum(i,j)=p(i,j)+p(i,J+j)+p(i,2*J+j)+p(i,3*J+j)+p(i,4*J+j);%%供应商总运量z_sumendend交叉操作:交叉操作紧接着是染色体选择操作,选择使得适应度较高的解进入子代,经过此步骤往往解集中在局部优化,而交叉操作有助于破除局部限制。由于RDC中心同时规划多条路径,所以多条路径方案交叉互换,有一定概率取得更优化解,作者编码如下:交叉次数取决于种群规模和交叉概率,amount1=round(popsize*pc)。接下来需要随机出种群中两个交叉染色体序号num2,num3,采用while语句保证num2与num3不等。 num2=round(rand*(popsize-1))+1; num3=round(rand*(popsize-1))+1;while num2==num3 num3=round(rand*(popsize-1))+1;end交叉前也需要确定路径段中交叉的区段,num4=round(rand*(J-2))+1。同时交叉路径选择方案和供应点取货量方案,交叉操作编码如下:temp1=pop2(num2,(num4-1)*J+1:(num4-1)*J+J); pop2(num2,(num4-1)*J+1:(num4-1)*J+J)=pop2(num3,(num4-1)*J+1:(num4-1)*J+J);pop2(num3,(num4-1)*J+1:(num4-1)*J+J)=temp1;%%路径交叉temp2=p2(num2,(num4-1)*J+1:(num4-1)*J+J); p2(num2,(num4-1)*J+1:(num4-1)*J+J)=p2(num3,(num4-1)*J+1:(num4-1)*J+J);p2(num3,(num4-1)*J+1:(num4-1)*J+J)=temp2;%%取货量交叉变异操作即使经过上述交叉操作,染色体解仍有陷入局部优化的可能,因为上述操作都是在已生成解的基础上,而变异操作不同。其选中种群中某条染色体,进行随机的基因突变,所以有一定概率产生全新的解,是遗传算法寻找全局最满意解的有利保障。首先确定变异次数,amount2=round(popsize*pm)。接着随机出种群中变异染色体序号num5,变异基因位置序号num6。 num5=round(rand*(popsize-1))+1; num6=round(rand*(chromlength-1))+1;由于编码采用0-1形式,变异时只需要0-1对调,同时需要保障解的可行性,编码如下if pop3(num5,num6)==0pop3(num5,num6)=1;p3(num5,num6)=round(rand*(Q/2-1))+1; endif pop3(num5,num6)==1pop3(num5,num6)=0;p3(num5,num6)=0;end实例验证某地区有一个RDC,从周围5个供应点循环取货。该中心有5辆载重卡车,载重限额12t,车辆的装
显示全部