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

📄 chc.m

📁 本代码是我写论文用的代码,是一种优化算法CHC算法
💻 M
字号:
clc
clear all
nind=20;  %个体数目,为偶数
maxgen=2000;%最大遗传代数
preci=20; 
ggap=1;   %代沟
A=5;      %适应度系数
B=6; %适应度系数
C=0.9;%安全系数
%t=0.15;     

chrom=crtbp(nind,preci);%创建初始种群
gen=1;%代数初始化



while gen <maxgen+1
        gen=gen
        attr=chrom(:,1:4); %以下为计算chrom中的,k,m,po,l的值
        repu=chrom(:,5:8);
        dist=chrom(:,9:12);
        step=chrom(:,13:20);
        fieldd1=[4;5;10;1;0;1;1];
        variable1=bs2rv(attr,fieldd1);
        fieldd2=[4;5;15;1;0;1;1];
        variable2=bs2rv(repu,fieldd2);
        fieldd3=[4;0.3;0.5;1;0;1;1];
        variable3=bs2rv(dist,fieldd3);
        fieldd4=[8;0.009;0.02;1;0;1;1];
        variable4=bs2rv(step,fieldd4);
        ii=1;
        Kl=0;
        ak=0;
        am=0;
        aPo=0;
        al=0;
    while ii<nind+1
    k=variable1(ii);%计算引力需要的增益系数
    m=variable2(ii);%计算斥力的增益系数,
    Po=variable3(ii);%障碍物作用范围
    l=variable4(ii);%步长
    % objv=variable.*sin(10*pi*variable)+2.0;
    fitness1=-k^2+l;%路径长度的倒数
    fitness2=m^3+Po;
    objv(ii)=(A*fitness1+B*fitness2)*100+C*Po;%核心之一,计算适应度
    C=0.9;
%     Kl=K*l+Kl;%计算路径长度总合
%     ak=k+ak;%k值和
%     am=m+am;%m值和
%     aPo=Po+aPo;%Po值和
%     al=l+al;%l值和
     ii=ii+1;
    %text11=(A*fitness1+B*fitness2)*100;适应度测试
    end
    %objv
    %初始化矩阵给出,其适应度值已经产生,存入objv
    
    if gen == 1
         [column row] = max(objv);
         ranseti(gen) = column;
    else
        if ranseti(gen-1)<max(objv)
            [column row] = max(objv);
            ranseti(gen) = column;
        else
            ranseti(gen) = ranseti(gen-1);
        end
    end
   
    %储存每代参数均值
%     akm(gen)=ak/nind;
%     amm(gen)=am/nind;
%     aPom(gen)=aPo/nind;
%     alm(gen)=al/nind;
%     aKlm(gen)=Kl/nind;%计算路径长度平均值
    
  
    %x13=gen;
    %y13=Kl/nind;
    %plot(x13,y13,'*');
    %Xlabel('gen'),Ylabel('路径长度');
    %title('平均路径长度随种群代数的变化');
    %hold on
 


    %进行优选挑出适应度最小的两个,i为初始种群的序列号
    %计算目标累计概率  
    i1=1;
    sumobjv=zeros(1,nind);
    allsumobjv=0;
    while i1<nind+1%i1为循环序列号
    sumobjv(i1)=objv(i1)+allsumobjv;
    allsumobjv=objv(i1)+allsumobjv;
    i1=i1+1;
    end
    sumobjv;
    i2=1;
    while i2<nind+1
    sumpro(i2)=sumobjv(i2)/allsumobjv; %累计概率
    i2=i2+1;
    end
  
  
    %轮盘赌选择
    %couplei=fix(80*nind/100);百分之八十种群规模
    i1=1;
    while i1<nind+1
         bet=rand;%投掷筛子
         i3=1;
        while sumpro(i3)-bet<0
         i3=i3+1;
        end
      
        selpro(i1)=i3;%selpro为选中进行交配的个体
        i1=i1+1;
    end
%selpro
    %构造产生子矩阵的父矩阵
    i1=1;
    while i1<nind+1
    father(nind,preci)=0;
    father(i1,:)=chrom(selpro(i1),:);
    i1=i1+1;
    end
    oldfather=father;
    %选中个体进行染色体交叉
    i1=1;
    i2=nind/2+1;
    while i1<nind/2+1
    gene1=father(i1,1:4);
    gene2=father(i1,9:12);
    geneh1=father(i2,1:4);
    geneh2=father(i2,9:12);
    father(i1,1:4)=geneh1;
    father(i1,9:12)=geneh2;
    father(i2,1:4)=gene1;
    father(i2,9:12)=gene2;
    i1=i1+1;
    i2=i2+1;
    end

    %基因变异
    %father=mut(father);
    
    i1=1;
    while i1<fix(nind*0.35*preci*gen/maxgen)
    j4=3*rand(1)+1.3;
    j4=fix(j4);
    i4=(nind-1)*rand(1)+1.3;
    i4=fix(i4);
             
     father(i4,j4)=rand(1);   
             
     i1=i1+1;
      end
    
    
    %子代与父代组成新的家庭
    family=zeros(2*nind,preci);
    %计算家族适应度
    family(1:nind,:)=chrom;
    family(nind+1:2*nind,:)=father;
    attr=family(:,1:4); %以下为计算chrom中的,k,m,po,l的值
    repu=family(:,5:8);
    dist=family(:,9:12);
    step=family(:,13:20);
    fieldd1=[4;5;10;1;0;1;1];
    variable1=bs2rv(attr,fieldd1);
    fieldd2=[4;5;15;1;0;1;1];
    variable2=bs2rv(repu,fieldd2);
    fieldd3=[4;0.3;0.5;1;0;1;1];
    variable3=bs2rv(dist,fieldd3);
    fieldd4=[8;0.009;0.02;1;0;1;1];
    variable4=bs2rv(step,fieldd4);
    ii=1;
    while ii<2*nind+1
     k=variable1(ii);%计算引力需要的增益系数
     m=variable2(ii);%计算斥力的增益系数,
     Po=variable3(ii);%障碍物作用范围
     l=variable4(ii);%步长
    % objv=variable.*sin(10*pi*variable)+2.0;
%     apf00
%     jud=X(:,1);
% %     if max(jud)<9.5%末日审判,克服陷阱和震荡
% %     K=6000;
% %     C=0;
% %     end
    fitness1=-k^2+l;%路径长度的倒数
    fitness2=m^3+Po;
    objv(ii)=(A*fitness1+B*fitness2)*100+C*Po;%核心之一,计算适应度
    ii=ii+1;
    C=0.9;
    end
   % objv%初始化矩阵给出,其适应度值已经产生,存入objv
    [y1,bestchoice]=max(objv);%本代最优个体
    
    %跨代精英的序列号
    i1=1;
    while i1<nind+1
    [y,i]=max(objv);
    objv(i)=0;
    sonth(i1)=i;
    i1=i1+1;
    end

    %从家庭中选择下一代族群
    i1=1;
    while i1<nind+1
    son(nind,preci)=0;
    son(i1,:)=family(sonth(i1),:);
    i1=i1+1;
    end
    chrom=son;
gen=gen+1;
end
figure(1)
plot(ranseti);

⌨️ 快捷键说明

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