qq_42744868 2020-03-16 09:23
浏览 380

MATLAB遗传算法,麻烦注释一下代码,搞不懂啥意思?

一段找来解决带时间窗的VRP问题的MATLAB遗传算法代码
但是搞不清哪些变量是时间约束、距离约束什么的。。。

clc;clf;clear all;
tic;
D=0;Q=0;T=0;dz=0;uz=0;sumz=inf;average=0;
m=input('请输入初始群数:');
MAXGEN=input('最大遗传代数:');
b=zeros(m,30); 
z=zeros(1,61);
for i=1:m
    b(i,:)=[randperm(30)+1];
end
b ;                 
sumd=zeros(m,1);u=ones(m,1);sumd2=zeros(m,1);u2=ones(m,1);o=zeros(m,30);oo=zeros(m,1);
load('matlab.mat');
A=zeros(m,61);
for i=1:m
    a=ones(1,61);
   for j=1:30
       index1=a(j+u(i)-1);index2=b(i,j);
       D=D+d(index1,index2)+d(index2,1);
       Q=Q+q(index2);
       if (D<=200) &&( Q<=90 )&&...
         ( ( ( ae(index2,1)<=T+t(index1,index2) )&&( (T+t(index1,index2)+s(index2))<=al(index2,1) ) )||(( ae(index2,2)<=T+t(index1,index2) )&&( (T+t(index1,index2)+s(index2))<=al(index2,2) ) ));
              D=D-d(index2,1);sumd(i)=sumd(i)+d(index1,index2);
              a(j+u(i))=b(i,j);T=T+t(index1,index2)+s(index2);
       else D=0;Q=0;T=0;u(i)=u(i)+1;a(j+u(i))=b(i,j);sumd(i)=sumd(i)+d(a(j+u(i)-2),1)+d(1,b(i,j));D=d(1,b(i,j));Q=Q+q(b(i,j));T=T+t(1,b(i,j))+s(b(i,j));
       end
    end
    D=0;Q=0;T=0;
    sumd(i)=sumd(i)+d(b(i,j),1);
    A(i,:)=a;
end
A;                                                           
gen=0;
objv=zeros(m,1);
trace=zeros(1,MAXGEN);                                       
for i=1:m
    objv(i)=50*u(i)+20*sumd(i);
end
objv;                                                       
while gen<MAXGEN
    sum=0;h2=0;h1=0;
    sumd=zeros(m,1);u=ones(m,1);
     objv1=2*max(objv)-objv;

   for i=1:m
       sum=sum+objv1(i);
   end

   fitv1=objv1/sum;                              
   for i=1:m-1
       for j=i+1:m
           if fitv1(i)==fitv1(j)
              fitv1(i)=fitv1(i)+fitv1(j);
              fitv1(j)=0;
           end
       end
   end
fitv1;
   fitv=cumsum(fitv1);
   r=rand(1,m);
   o=b;oo=objv;
   for i=1:m
       j=1;                 
          while fitv(j)<r(i)
                j=j+1;
          end
       b(i,:)=o(j,:);objv1(i)=oo(j);
   end
   b ;                                              
 objv1;                                              

for i=1:m
       h1=h1+objv1(i);
end
h1;
average=h1/m;
temp1=zeros(30);
for i=1:m-1
    for j=i+1:m
        if b(i,:)==b(j,:)
           temp1=b(i+1,:);
           b(i+1,:)=b(j,:);
           b(j,:)=temp1;
        end
    end
end
b;
c=zeros(m,30);o=zeros(m,30);
x1=0;m1=0;m2=0;
if rem(m,2)~=0
      m1=fix(m/2);m2=round(m/2)+1;
      c(m1+1,:)=b(m1+1,:);
else m1=m/2;m2=m/2+1;
end
   n1=zeros(m1,1);n2=zeros(m1,1);
for i=1:m1
    c1=randperm(8)+1;
    if c1(1)<c1(2)
       n1(i)=c1(1);n2(i)=c1(2);
    else n1(i)=c1(2);n2(i)=c1(1);
    end
        c(i,n1(i):n2(i))=b(m+1-i,n1(i):n2(i));

        for j=1:(n1(i)-1)
            x=find(c(i,:)==b(i,j));
            if x~=0
               while find(c(i,:)==b(i,x))~=0
                     x=find(c(i,:)==b(i,x));
               end
               c(i,j)=b(i,x);
            else c(i,j)=b(i,j);
            end
        end     
        for j=n2(i)+1:30
            x=find(c(i,:)==b(i,j));
            if x~=0
               while find(c(i,:)==b(i,x))~=0
                     x=find(c(i,:)==b(i,x));
               end
               c(i,j)=b(i,x);
            else c(i,j)=b(i,j);
            end
       end
end
n1;
n2;
for i=m:-1:m2
    x1=m+1-i;
    c(i,n1(x1):n2(x1))=b(x1,n1(x1):n2(x1));
        for j=1:(n1(x1)-1)
            x=find(c(i,:)==b(i,j));
            if x~=0
               while find(c(i,:)==b(i,x))~=0
                     x=find(c(i,:)==b(i,x));
               end
               c(i,j)=b(i,x);
            else c(i,j)=b(i,j);
            end
        end
        for j=n2(x1)+1:30
            x=find(c(i,:)==b(i,j));
           if x~=0
               while find(c(i,:)==b(i,x))~=0
                     x=find(c(i,:)==b(i,x));
               end
               c(i,j)=b(i,x);
            else c(i,j)=b(i,j);
           end
        end

end
c ;                                                     
o=c;
A=zeros(m,61);sumd=zeros(m,1);u=ones(m,1);
for i=1:m
    a=ones(1,61);
   for j=1:30
       index1=a(j+u(i)-1);index2=c(i,j);
       D=D+d(index1,index2)+d(index2,1);
       Q=Q+q(index2);
       if (D<=200) &&( Q<=90 )&&...
         ( ( ( ae(index2,1)<=T+t(index1,index2) )&&( (T+t(index1,index2)+s(index2))<=al(index2,1) ) )||(( ae(index2,2)<=T+t(index1,index2) )&&( (T+t(index1,index2)+s(index2))<=al(index2,2) ) ));
              D=D-d(index2,1);sumd(i)=sumd(i)+d(index1,index2);
              a(j+u(i))=c(i,j);T=T+t(index1,index2)+s(index2);
       else D=0;Q=0;T=0;u(i)=u(i)+1;a(j+u(i))=c(i,j);sumd(i)=sumd(i)+d(a(j+u(i)-2),1)+d(1,c(i,j));D=d(1,c(i,j));Q=Q+q(c(i,j));T=T+t(1,c(i,j))+s(c(i,j));
       end
    end
    D=0;Q=0;T=0;
    sumd(i)=sumd(i)+d(c(i,j),1);
    A(i,:)=a;
end
A;
sumd2=sumd; 
u2=u;
objv2=zeros(m,1);

for i=1:m
    objv2(i)=50*u(i)+20*sumd(i);
end
objv2 ;                                                   
   for i=1:m
       h2=h2+objv2(i);
   end
h2;
if h2>h1
    for i=1:m
        n1=1;i1=0;temp=0;
        while (objv2(i)>average)&&(n1<=30)
              temp=objv2(i)-average;
              c(i,:)=o(i,:);
              c5(1,:)=randperm(30)+1;
              c6=c5(1,1:2);
              v1=find(c(i,:)==c6(1,1));
              v2=find(c(i,:)==c6(1,2));
              c(i,v1)=c6(1,2);
              c(i,v2)=c6(1,1);
              a=ones(1,61);sumd(i)=0;u(i)=1;
              D=0;Q=0;T=0;
   for j=1:30
       index1=a(j+u(i)-1);index2=c(i,j);
       D=D+d(index1,index2)+d(index2,1);
       Q=Q+q(index2);
       if (D<=200) &&( Q<=90 )&&...
         ( ( ( ae(index2,1)<=T+t(index1,index2) )&&( (T+t(index1,index2)+s(index2))<=al(index2,1) ) )||(( ae(index2,2)<=T+t(index1,index2) )&&( (T+t(index1,index2)+s(index2))<=al(index2,2) ) ));
              D=D-d(index2,1);sumd(i)=sumd(i)+d(index1,index2);
              a(j+u(i))=c(i,j);T=T+t(index1,index2)+s(index2);
       else D=0;Q=0;T=0;u(i)=u(i)+1;a(j+u(i))=c(i,j);sumd(i)=sumd(i)+d(a(j+u(i)-2),1)+d(1,c(i,j));D=d(1,c(i,j));Q=Q+q(c(i,j));T=T+t(1,c(i,j))+s(c(i,j));
       end
   end
           sumd(i)=sumd(i)+d(c(i,j),1);
           objv2(i)=50*u(i)+20*sumd(i);
           A(i,:)=a; 
           n1=n1+1;
        end
       if n1==11&&(objv2(i)>average)
          [sum,i1]=min(objv2);
          A(i,:)=A(i1,:);
          c(i,:)=c(i1,:);
          objv2(i)=sum;
          sumd(i)=sumd2(i1);
          u(i)=u2(i1);
       end
       h2=h2-temp-(average-objv2(i));
       if h2<h1
           break;
       end
    end
end   
objv2;
b=c ;                                               
[sum,i]=min(objv2);
if sum<sumz
   sumz=sum;
   z(1,:)=A(i,:);
   dz=sumd(i);
   uz=u(i);
end
objv=objv2;
gen=gen+1;                                              
trace(1,gen)=sumz;                                  

end
plot(1:gen,trace(1,:),'b-');
hold on, grid;
xlabel('进化代数');
ylabel('最优解变化');
title('SGA进化过程');
z(1,1:30+uz+1)
dz
uz
sumz
toc
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 聚类分析或者python进行数据分析
    • ¥15 逻辑谓词和消解原理的运用
    • ¥15 三菱伺服电机按启动按钮有使能但不动作
    • ¥15 js,页面2返回页面1时定位进入的设备
    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号