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

📄 improve_compete3.m

📁 多种群的链式智能体遗传算法
💻 M
字号:
function  newpop=improve_compete3(popsize,pop,fitvalue,fun_num,up_range,down_range,var_num)
%函数说明
%入口参数:pop         当前处理的种群,
%          popsize     种群大小,
%          fitvalue    当前代的适应度数组
%          fun_num     函数序列号,
%          up_range    自变量的相对上限,
%          down_range  自变量的相对下限
%出口参数:newpop      准子代
%功能说明:当前处理个体在其周围链式邻域的范围内竞争,
%          如果当前个体的适应度小于邻域的最大适应度值则必将死亡
%            策略1(rand<po) new=round(max_dna(j,1)+(-1)^round(rand)*rand*(max_dna(j,1)-pop(j,i)));
%            策略2(rand〉po)new = ma_dna(邻域中的最优个体)
%          下一个体的邻域为竞争过后的新种群

%%%链式邻域
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%调试用语句
% popsize=36;
% n=500;
% po=0.5;
% 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-250)./100;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% pop_con
% fitvalue=zeros(1,popsize);
% for i=1:popsize
%     
% fitvalue(1,i)=20-(pop_con(1,i)^2+pop_con(2,i)^2);
% 
% end
% fitvalue
% 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
po=0.5;

% range_down=0;
% range_up=100000;

% var_num = 10;

left_dna=zeros(var_num,1);
right_dna=zeros(var_num,1);
max_dna=zeros(var_num,1);
new_dna=zeros(var_num,1);
neighbor_fitvalue=zeros(1,2);
I=zeros(1,2);

fitvalue_tem=fitvalue;
newpop=pop;

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

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

if i==popsize
    right_dna=pop(:,1);                            %%最后一个个体的右邻域为第一个个体   其他为物理位置的右邻域
    neighbor_fitvalue(2)=fitvalue_tem(1);
    I(2)=1;
else
    right_dna=pop(:,i+1);
    neighbor_fitvalue(2)=fitvalue_tem(i+1);
    I(2)=i+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
[neighbor_max_fitvalue,J]=max(neighbor_fitvalue);          %%求出邻域中最大的一个并记录其在种群中的序列号
neighbor_max_cul=I(J);
max_dna=pop(:,neighbor_max_cul);

if fitvalue_tem(i)<neighbor_max_fitvalue                                      %%%当前个体与邻域中最大的适应值比较  如果大于则可以存活  如果小于则按照po概率必须被替换
    if rand<po                                                             %%% 小于po则按照拓宽搜索空间发作产生新个体替换   否则用最大的个体替换
        for j=1:var_num
            T=max_dna(j,1)+(-1)^round(rand)*rand*(max_dna(j,1)-pop(j,i));
            if T<down_range
                new_dna(j,1)=down_range;
            elseif  T>up_range
                new_dna(j,1)=up_range;
            else
                new_dna(j,1)=round(T);
            end  
        end
    else
        new_dna=max_dna;
    end
    
    newpop(:,i)=new_dna;
 
else
    newpop(:,i)=pop(:,i);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%将替换过的种群再算适应值 准备下一次的邻域计算
newpop_con(:,i)=newpop(:,i);
switch fun_num
    case 1
%         newpop_con(:,i)=(newpop(:,i)-10000)./100;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
%         fitvalue_tem(1,i)=-(newpop_con(1,i)^2+newpop_con(2,i)^2);
        for var_j = 1:var_num
            fitvalue_tem(1,i)=fitvalue_tem(1,i)-(newpop_con(var_j,i)^2);
        end

        
    case 2
%         newpop_con(:,i)=(newpop(:,i)-1000)./100;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
%         fitvalue_tem(1,i)=-(abs(newpop_con(1,i))+abs(newpop_con(2,i))+abs(newpop_con(1,i))*abs(newpop_con(2,i)));
        time = 1;
        and_value = 0;
        for var_j = 1:var_num
            and_value = and_value + abs(newpop_con(var_j,i));
            time = time * abs(newpop_con(var_j,i));
            
        end
        fitvalue_tem(1,i)=fitvalue_tem(1,i)-(and_value + time);
    case 3
%         newpop_con(:,i)=(newpop(:,i)-10000)./100;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
%         fitvalue_tem(1,i)=-(newpop_con(1,i)^2+(newpop_con(1,i)+newpop_con(2,i))^2);
        add_value = 0;
        for var_j = 1:var_num
            add_value = add_value + newpop_con(var_j,i);
            
        end
        fitvalue_tem(1,i) = fitvalue_tem(1,i) - add_value^2;
    case 4
%         newpop_con(:,i)=(newpop(:,i)-10000)./100;
%         fitvalue_tem(1,i)=-max(abs(newpop_con(1,i)),abs(newpop_con(2,i)));
        fitvalue_tem(1,i) = - max(abs(newpop_con(:,i)));
    case 5
%         newpop_con(:,i)=(newpop(:,i)-30000)./1000;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
%         fitvalue_tem(1,i)=-(100*(newpop_con(2,i)-newpop_con(1,i)^2)^2+(newpop_con(1,i)-1)^2);
        for var_j = 1:var_num-1
            fitvalue_tem(1,i) = fitvalue_tem(1,i) - (100 * (newpop_con(var_j+1,i)-newpop_con(var_j,i)^2)^2 + (newpop_con(var_j,i)-1)^2);
        end
    case 6
%         newpop_con(:,i)=(newpop(:,i)-10000)./100;
%         fitvalue_tem(1,i)=-((newpop_con(1,i)+0.5)^2+(newpop_con(2,i)+0.5)^2);
        for var_j = 1:var_num
            fitvalue_tem(1,i) = fitvalue_tem(1,i) - ((newpop_con(var_j,i)+0.5)^2);
        end
    case 7
%         newpop_con(:,i)=(newpop(:,i)-12800)./10000;   %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
%         fitvalue_tem(1,i)=-(newpop_con(1,i)^4+rand+2*newpop_con(2,i)^4+rand);
        for var_j = 1:var_num
            fitvalue_tem(1,i) = fitvalue_tem(1,i) - (var_j * newpop_con(1,i)^4+rand);
        end
    case 8
%           newpop_con(:,i)=(newpop(:,i)-50000)./100;
%           fitvalue_tem(1,i)=-(-newpop_con(1,i)*sin(sqrt(abs(newpop_con(1,i))))-newpop_con(2,i)*sin(sqrt(abs(newpop_con(2,i)))));
        for var_j = 1:var_num
            fitvalue_tem(1,i)=fitvalue_tem(1,i)-(-newpop_con(var_j,i)*sin(sqrt(abs(newpop_con(var_j,i)))));
        end
    case 9
%           newpop_con(:,i)=(newpop(:,i)-51200)./10000;
%           fitvalue_tem(1,i)=-(newpop_con(1,i)^2-10*cos(2*pi*newpop_con(1,i))+10+newpop_con(2,i)^2-10*cos(2*pi*newpop_con(2,i))+10);
        for var_j = 1:var_num
            fitvalue_tem(1,i)=fitvalue_tem(1,i)-(newpop_con(var_j,i)^2-10*cos(2*pi*newpop_con(var_j,i))+10);
        end

    case 10
%           newpop_con(:,i)=(newpop(:,i)-32000)./1000;
%           fitvalue_tem(1,i)=-(-20*exp(-0.2*sqrt(0.5*(newpop_con(1,i)^2+newpop_con(2,i)^2)))-exp(0.5*(cos(2*pi*newpop_con(1,i))+cos(2*pi*newpop_con(2,i))))+20+exp(1));
          add_value = 0;
          add_cos = 0;
          for var_j = 1:var_num
              add_value = add_value + (1/var_num) * newpop_con(var_j,i)^2;
              add_cos = add_cos + (1/var_num) * cos(2 * pi * newpop_con(var_j,i));
          end
          fitvalue_tem(1,i) = -(-20 * exp(-0.2 * sqrt(add_value)) - exp(add_cos) + 20 + exp(1));

    case 11
%           newpop_con(:,i)=(newpop(:,i)-60000)./100;
%           fitvalue_tem(1,i)=-(0.00025*(newpop_con(1,i)^2+newpop_con(2,i)^2)-cos(newpop_con(1,i)/sqrt(1))*cos(newpop_con(2,i)/sqrt(2))+1);
        add_value = 0;
        time = 1;
        for var_j = 1:var_num
            add_value = add_value + newpop_con(var_j,i)^2;
            time = time * cos(newpop_con(var_j,i)/sqrt(var_j));
        end
        fitvalue_tem(1,i) = -(0.00025 * add_value - time + 1);
        
    case 12
%         newpop_con(:,i)=(newpop(:,i)-10000)./100;   
%         fitvalue_tem(1,i)=[0.5+[((sin(newpop_con(1,i)))^2+(sin(newpop_con(2,i)))^2)^0.5-0.5]/[1+0.001*(newpop_con(1,i)^2+newpop_con(2,i)^2)]^2];
         add_value = 0;
         for var_j = 1:var_num
             add_value = add_value + sin(newpop_con(var_j,i))^2;
         end
         fitvalue_tem(1,i) = -(0.5 + (add_value^0.5 -0.5)/(1 + 0.001 * add_value^2));

    case 13
%         newpop_con(:,i)=(newpop(:,i)-10000)./100;   
%         fitvalue_tem(1,i)=[0.5+[sin((newpop_con(1,i)^2+newpop_con(2,i)^2)^0.5)-0.5]/[1+0.001*(newpop_con(1,i)^2+newpop_con(2,i)^2)]^2];
          add_value = 0;
          for var_j = 1:var_num
              add_value = add_value + newpop_con(var_j,i)^2;
          end
          fitvalue_tem(1,i) = -(0.5 + (sin(add_value)^0.5 - 0.5)/(1 + 0.001 * add_value^2));
        
    otherwise
          break
  end
% newpop_con

end

⌨️ 快捷键说明

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