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

📄 complete3_o_adaptivepc_crossover.m

📁 多种群的链式智能体遗传算法
💻 M
字号:
%交叉
% 交叉(crossover),群体中的每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置
% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:
% x1=0100110
% x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:
% y1=0100001
% y2=1010110
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。
% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。
%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop]=complete3_o_adaptivePC_crossover(popsize,pop,fitvalue,fun_num)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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;
M2=4;
size=8;

F=zeros(4,2);
F_fivalue=zeros(1,M2);
F_max=zeros(1,2);
left_dna=zeros(2,1);
right_dna=zeros(2,1);
max_dna=zeros(2,1);
neighbor_fitvalue=zeros(1,2);
I=zeros(1,2);

%%%%%%%%%%%% 设置完毕!
max_fitness=max(fitvalue);
mean_fitness=mean(fitvalue);

newpop=pop;

for i=1:popsize
    
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%           求其邻域

         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
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步求PC
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  求PC
     if fitvalue(i)<=neighbor_max_fitvalue
        better_fitvalue=neighbor_max_fitvalue;
     else
        better_fitvalue=fitvalue(i);
     end

     if better_fitvalue>=mean_fitness
        pc=(max_fitness-better_fitvalue)/(max_fitness-mean_fitness);
     else
        pc=1.0;
     end

    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    
    if rand<pc
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
       
       
       
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步生成B(2*3)
        for b_i=1:2
            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);
         
%          F
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F矩阵生成完毕, 产生了4个二维的多智能体 下一步计算这四个智能体的适应度函数 选出最大的一个来代替pop(:,i) 
%          F_con=(F-50000)/10000;
%          for f_i=1:M2
% %             F_fivalue(f_i)=1500+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))));
%             F_fitvalue(1,i)=120-(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);
%          end
%          
          switch fun_num
              case 2
                  F_con=(F-1000)./100;
                 for f_i=1:M2
                     F_fitvalue(f_i)=121-(abs(F_con(f_i,1))+abs(F_con(f_i,2))+abs(F_con(f_i,1))*abs(F_con(f_i,2)));
                 end

              case 8
                 F_con=(F-50000)/100;
                 for f_i=1:M2
                    F_fivalue(f_i)=1500+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))));
                 end
              
             case 9
                 F_con=(F-51200)/10000;
                 for f_i=1:M2
                    F_fitvalue(f_i)=120-(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);
                 end
             
             case 10
                 F_con=(F-32000)./1000; 
                 for f_i=1:M2
                    F_fitvalue(f_i)=30-(-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));
                 end
     
             otherwise
                  break
          end




         [max_F_fitvalue,max_F_J]=max(F_fivalue);
         F_max=F(max_F_J);
         
         newpop(:,i)=F_max';
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  正交交叉完毕
         
    end
end











% 
%  pop1=pop(1,:);                %将种群矩阵拆分
%  pop1;
%  pop2=pop(2,:);
%  pop2;
%  
%  pop1=dec2bin(pop1,chromlength);  %%各自转为二进制
%  pop1;
%  pop2=dec2bin(pop2,chromlength);
%  pop2;
% 
% for i=1:2:popsize-1;       %第1行和第2行,也就是说第1个个体和第2个个体进行交叉,依次类推
% if(rand<pc)
% cpoint=round(rand*chromlength);
% % cpoint
% 
% if cpoint==0
%     cpoint=1;
% end
% 
% 
% newpop1(i,:)=[pop1(i,1:cpoint) pop1(i+1,cpoint+1:chromlength)];
% newpop1(i+1,:)=[pop1(i+1,1:cpoint) pop1(i,cpoint+1:chromlength)];
% else
% newpop1(i,:)=pop1(i,:);
% newpop1(i+1,:)=pop1(i+1,:);
% end
% 
% if(rand<pc)
% cpoint=round(rand*chromlength);
% % cpoint
% 
% if cpoint==0
%     cpoint=1;
% end
% 
% newpop2(i,:)=[pop2(i,1:cpoint) pop2(i+1,cpoint+1:chromlength)];
% newpop2(i+1,:)=[pop2(i+1,1:cpoint) pop2(i,cpoint+1:chromlength)];
% else
% newpop2(i,:)=pop2(i,:);
% newpop2(i+1,:)=pop2(i+1,:);
% end
% 
% newpop1;
% newpop2;
% end
% 
% newpop1=bin2dec(newpop1);
% newpop2=bin2dec(newpop2);
% newpop(1,:)=newpop1';
% newpop(2,:)=newpop2';
% 
% newpop;

⌨️ 快捷键说明

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