⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 complete3_o_crossover_cell.m

📁 多种群的链式智能体遗传算法
💻 M
字号:
%交叉

%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop]=complete3_o_crossover_cell(popsize,pop,pc,fitvalue,fun_num,up_range,down_range,var_num)
%函数说明
%入口参数:pop         当前处理的种群,
%          popsize     种群大小,
%          pc          交叉概率
%          fitvalue    当前代的适应度数组
%          fun_num     函数序列号,
%          up_range    自变量的相对上限,
%          down_range  自变量的相对下限
%出口参数:newpop      准子代
%功能说明:链式邻域的正交交叉

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%调试用语句
% popsize=64;
% n=100000;
% pop1_init=randperm(n); %产生1到32的整数
% pop2_init=randperm(n);
% pop(1,:)=pop1_init(1:popsize);  %将前几个整数作为初始群体
% pop(2,:)=pop2_init(1:popsize);;  %将前几个整数作为初始群体
% pop
% 
% pop_con=(pop-50000)./100;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% 
% fitvalue=zeros(1,popsize);
% for i=1:popsize
% 
%  fitvalue(1,i)=1500+pop_con(1,i)*sin(sqrt(abs(pop_con(1,i))))+pop_con(2,i)*sin(sqrt(abs(pop_con(2,i))));
% end
% fitvalue
% pc=0.5;

% popsize=10;
% pop=[1023,980,2133,726,1946,657,1702,1224,1522,807,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825];
% %      ,2025,2565,1773,2340,2354,1144,2061,240,1573,825]
% chromlength=12;
% pc=0.96;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%% 设置参数
F=2;
% Q2=3;
Q2=4;
M2=4;
size=8;

% var_num = 10;

F=zeros(4,var_num);%用来装4个个体
F_fivalue=zeros(1,M2);
F_max=zeros(1,var_num);
left_dna=zeros(var_num,1);
right_dna=zeros(var_num,1);
max_dna=zeros(var_num,1);
neighbor_fitvalue=zeros(1,2);
I=zeros(1,2);

%%%%%%%%%%%% 设置完毕!
newpop=pop;

for i=1:popsize
    if rand<pc
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
       
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%           求其邻域

         if i==1                                            %% 第一个个体的左邻域为最后一个个体   其他按常规
            left_dna=pop(:,popsize);
            neighbor_fitvalue(1)=fitvalue(popsize);
            I(1)=popsize;
         else
            left_dna=pop(:,i-1);
            neighbor_fitvalue(1)=fitvalue(i-1);
            I(1)=i-1;
         end

         if i==popsize
            right_dna=pop(:,1);                            %%最后一个个体的右邻域为第一个个体   其他为物理位置的右邻域
            neighbor_fitvalue(2)=fitvalue(1);
            I(2)=1;
         else
            right_dna=pop(:,i+1);
            neighbor_fitvalue(2)=fitvalue(i+1);
            I(2)=i+1;
         end
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  求 个体L的邻域
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  完毕!(上下左右邻域)
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  下一步求邻域中最大的个体(作为交
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  叉的个体之一)
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  及其对应的位置号I(J)
    
       [neighbor_max_fitvalue,J]=max(neighbor_fitvalue);
       neighbor_max_cul=I(J);
       max_dna=pop(:,neighbor_max_cul);
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 得出交叉的两个父代个体  一个为当前个体pop(:,i)
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 另一个为其邻域中适应度值最大的个体max_dna
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步生成B(2*3)
        for b_i=1:var_num
            for b_j=1:Q2
                if b_j==1
                    B(b_i,b_j)=min(pop(b_i,i),max_dna(b_i,1));
                elseif b_j>1&b_j<Q2
                    B(b_i,b_j)=min(pop(b_i,i),max_dna(b_i,1))+(b_j-1)*abs(pop(b_i,i)-max_dna(b_i,1))/(Q2-1);
                elseif b_j==Q2
                    B(b_i,b_j)=max(pop(b_i,i),max_dna(b_i,1));
                end
            end
        end  
%         B
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(2*3)生成完毕!!!
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步按照矩阵 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [B(1,1) B(2,1);
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(1,1) B(2,2);
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(1,2) B(2,1);
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(1,2) B(2,2);]生成F(4*2)
%          F(1,1)=B(1,1);F(1,2)=B(2,1);
%          F(2,1)=B(1,1);F(2,2)=B(2,2);
%          F(3,1)=B(1,2);F(3,2)=B(2,1);
%          F(4,1)=B(1,2);F(4,2)=B(2,2);
         
          for Fb_i = 1:4
              for Fb_j = 1:var_num
                  F(Fb_i,Fb_j) = B(Fb_j,Fb_i);
              end
              
          end 
         
%          F
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F矩阵生成完毕, 产生了4个二维的多智能体 下一步计算这四个智能体的适应度函数 选出最大的一个来代替pop(:,i) 
        F_con=F; 
        switch fun_num
              case 1
%                   F_con=(F-10000)./100;
                 for f_i=1:M2
%                      F_fitvalue(f_i)=-(F_con(f_i,1)^2+F_con(f_i,2)^2);
                        for f_j = 1:var_num
                            F_fivalue(f_i) = F_fivalue(f_i) -(F_con(f_i,f_j)^2);
                        end
                 end
                 
              case 2
%                   F_con=(F-1000)./100;
                 for f_i=1:M2
                     
%                      F_fitvalue(f_i)=-(abs(F_con(f_i,1))+abs(F_con(f_i,2))+abs(F_con(f_i,1))*abs(F_con(f_i,2)));
                        time = 1;
                        and_value = 0;
                        for f_j = 1:var_num
                            and_value = and_value + abs(F_con(f_i,f_j));
                            time = time * abs(F_con(f_i,f_j));
                           
                        end
                         F_fivalue(f_i) = F_fivalue(f_i) -(and_value + time);
                 end

              case 3
%                   F_con=(F-10000)./100;
                 for f_i=1:M2
%                      F_fitvalue(f_i)=-(F_con(f_i,1)^2+(F_con(f_i,1)+F_con(f_i,2))^2);
                    for var_j = 1:var_num
                        add_value  = 0;
                        for add_j = 1:var_j
                            add_value = add_value + F_con(f_i,add_j);
                        end
                        F_fitvalue(f_i) = fitvalue(1,f_i) - add_value^2;
                    end


                 end
  
             case 4
%                  F_con=(F-10000)./100;
                  for f_i=1:M2
%                      F_fivalue(f_i)=-max(abs(F_con(f_i,1)),abs(F_con(f_i,2)));
                       F_fivalue(f_i) = -max(abs(F_con(f_i,:)));
                  end
                  
              case 5
%                   F_con=(F-30000)./1000;
                 for f_i=1:M2
%                      F_fitvalue(f_i)=-(100*(F_con(f_i,2)-F_con(f_i,1)^2)^2+(F_con(f_i,1)-1)^2);
                      for f_j = 1:var_num-1
                          F_fivalue(f_i) = F_fivalue(f_i) - (100 * (F_con(f_i,f_j+1) -F_con(f_i,f_j)^2)^2 + (F_con(f_i,f_j)-1)^2);
                      end

                 end

              case 6
%                  F_con=(F-10000)./100;
                 for f_i=i:M2
%                     F_fivalue(f_i)=-((F_con(f_i,1)+0.5)^2+(F_con(f_i,2)+0.5)^2);
                      for f_j = 1:var_num
                          F_fivalue(f_i) = F_fivalue(f_i) - ((F_con(f_i,f_j)+0.5)^2);
                      end
                 end
        
              case 7
%                   F_con=(F-12800)./10000;
                 for f_i=1:M2
%                      F_fitvalue(f_i)=-(F_con(f_i,1)^4+rand+2*F_con(f_i,2)^4+rand);
                      for f_j = 1:var_num
                          F_fivalue(f_i) = F_fivalue(f_i) - (f_j * F_con(f_i,f_j)^4 + rand);
                      end
                 end
  
              case 8
%                  F_con=(F-50000)/100;
                 for f_i=1:M2
%                     F_fivalue(f_i)=-(-F_con(f_i,1)*sin(sqrt(abs(F_con(f_i,1))))-F_con(f_i,2)*sin(sqrt(abs(F_con(f_i,2)))));
                        for f_j = 1:var_num
                            F_fivalue(f_i) = F_fivalue(f_i) -(-F_con(f_i,f_j)*sin(sqrt(abs(F_con(f_i,f_j)))));
                        end
                 end
              
             case 9
%                  F_con=(F-51200)/10000;
                 for f_i=1:M2
%                     F_fitvalue(f_i)=-(F_con(f_i,1)^2-10*cos(2*pi*F_con(f_i,1))+10+F_con(f_i,2)^2-10*cos(2*pi*F_con(f_i,2))+10);
                        for f_j = 1:var_num
                            F_fivalue(f_i) = F_fivalue(f_i) -(F_con(f_i,f_j)^2-10*cos(2*pi*F_con(f_i,f_j))+10);
                        end
                 end
             
             case 10
%                  F_con=(F-32000)./1000; 
                 for f_i=1:M2
%                     F_fitvalue(f_i)=-(-20*exp(-0.2*sqrt(0.5*(F_con(f_i,1)^2+F_con(f_i,2)^2)))-exp(0.5*(cos(2*pi*F_con(f_i,1))+cos(2*pi*F_con(f_i,2))))+20+exp(1));
                      add_value = 0;
                      add_cos = 0;
                      for f_j = 1:var_num
                          add_value = add_value + (1/var_num) * F_con(f_i,f_j)^2;
                          add_cos = add_cos + (1/var_num) * cos(2 * pi * F_con(f_i,f_j));
                      end
                      F_fitvalue(f_i) = -(-20 * exp(-0.2 * sqrt(add_value)) - exp(add_cos) + 20 + exp(1));

                 end
     
              case 11
%                  F_con=(F-60000)/100;
                 for f_i=1:M2
%                     F_fivalue(f_i)=-(0.00025*(F_con(f_i,1)^2+F_con(f_i,2)^2)-cos(F_con(f_i,1)/sqrt(1))*cos(F_con(f_i,2)/sqrt(2))+1);
                      add_value = 0;
                      time = 1;
                      for f_j = 1:var_num
                          add_value = add_value + F_con(f_i,f_j)^2;
                          time = time * cos(F_con(f_i,f_j)/sqrt(f_j));
                      end
                      F_fitvalue(f_i) = -(0.00025 * add_value - time + 1);

                 end
                 
             case 12
%                  F_con=(F-10000)/100;
                 for f_i=1:M2
%                     F_fivalue(f_i)=[0.5+[((sin(F_con(f_i,1)))^2+(sin(F_con(f_i,2)))^2)^0.5-0.5]/[1+0.001*(F_con(f_i,1)^2+F_con(f_i,2)^2)]^2];
                        and_value = 0;
                        for f_j = 1:var_num
                            and_value = and_value + sin(F_con(f_i,f_j))^2;
                        end
                        F_fivalue(f_i) = -(0.5 + (and_value^0.5 -0.5)/(1 + 0.001 * and_value^2));

                 end
                 
             case 13    
%                  F_con=(F-10000)/100;
                 for f_i=1:M2
%                      F_fivalue(f_i)=[0.5+[sin((F_con(f_i,1)^2+F_con(f_i,2)^2)^0.5)-0.5]/[1+0.001*(F_con(f_i,1)^2+F_con(f_i,2)^2)]^2];
                        and_value = 0;
                        for f_j = 1:var_num
                            and_value = and_value + F_con(f_i,f_j)^2;
                        end
                        F_fivalue(f_i) = -(0.5 + (sin(and_value^0.5) -0.5)/(1 + 0.001 * and_value^2));

                 end
       
           otherwise
                  break
          end
         
         [max_F_fitvalue,max_F_J]=max(F_fivalue);
         F_max=F(max_F_J);
         
         newpop(:,i)=F_max';
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  正交交叉完毕
         
    end
    
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  超界保护
    for ii=1:var_num
        if newpop(ii,i)>up_range(ii)
            newpop(ii,i)=up_range(ii);
        elseif newpop(ii,i)<down_range(ii)
            newpop(ii,i)=down_range(ii);
        end
    end
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -