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

📄 chain.m

📁 两种改进的遗传算法(自适应交叉概率的遗传算法
💻 M
字号:
%LAGA程序
%Name:chain.m
function [pop_best1_chain,error2,i2,bestfit_temp1_chain]=chain(M_red,M_white,pop)

tic;            %用于记录运行时间
%参数设置
[x_length,y_length]=size(M_red);
popsize=30;
%设置初始参数,群体大小
chromlength=y_length; %字符串长度(个体长度),染色体长度
pc=0.6; %设置交叉概率
pm=0.05; %设置变异概率
%参数设置结束

dai=200;
M1=M_red;
M2=M_white;
[xx,yy]=size(M1);
pop_best1_chain=zeros(1,yy);%给最佳染色体及其适应度值赋初值%
value_best1=0;   %到当前代数为止的最优适应值,初始化为0

error2=0;   %两代间最优适应值的差值
coun=0;     %最优适应值连续相同(没有增长)的代数
bestfit_temp1_chain=0; %保存每代最优个体适应值
near_temp1=zeros(1,3);
difference1=cal_difference1(M1,M2);  %计算两类间的方差和类内方差
fitvalue1=calfitvalue(pop,difference1,M1,M2); %计算群体中每个个体的适应度
[bestindividual1,bestfit1]=best(pop,fitvalue1);%求出上代pop群体中适应值最大的个体及其适应值
bestfit_old=bestfit1;

for i=1:dai  %200为迭代次数

    bestfit_temp1_chain(i)=bestfit1;
    newpop=selection(pop,fitvalue1); %复制
    newpop=crossover(newpop,pc); %交叉
    newpop=mutation(newpop,pm);%变异

    %add_self begin  求出下代newpop群体中适应值最小的个体及其适应值
    fitvalue1=calfitvalue(newpop,difference1,M1,M2);
    [badestindividual1,badestfit1]=badest(newpop,fitvalue1);
    counter=0;

    for j=1:popsize
        if fitvalue1(j)==badestfit1
            newpop(j,:)=bestindividual1;%用父代的最优个体代替子代的最差个体从而形成新的下代,
            counter=counter+1;
        end
    end


    %add_self end
    if bestfit1>value_best1   %保存数代遗传之后最好的种群
        value_best1=bestfit1;
        pop_best1_chain=bestindividual1;
        i
    end

    % % 如果两代之间的差异满足要球,终止遗传算法
    fitvalue1=calfitvalue(newpop,difference1,M1,M2);%此时的newpop是替换后的

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%对个体的适应值进行3邻域比较开始
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for ii=1:popsize

        if ii==1%%当扫描第一个个体时,它的前一个个体时最后一个个体,它的下一个个体是第二个个体

            near_temp1=[fitvalue1(popsize) fitvalue1(1) fitvalue1(2)];%%把相邻的三个个体存放在邻域寄存器中
            [max1 max_row1]=max(near_temp1);%求出相邻的三个个体中适应值最大的存放在max,最大适应值对应的个体存放在max_row里
            switch max_row1%如果最大的个体是邻域里的个体,则把当前个体与此邻域的个体比较,相同位则不变,不同位则随机生成一个2进制数
                %如果最大的个体是当前扫描的个体,则当前个体不变。
                case 1
                    for jj=1: chromlength
                        if newpop(popsize,jj)==newpop(1,jj)
                            newpop(1,jj)=newpop(1,jj);
                        else
                            newpop(1,jj)=round(rand);
                        end
                    end
                case 2
                    newpop(ii,:)=newpop(ii,:);
                case 3
                    for jj=1: chromlength
                        if newpop(1,jj)==newpop(2,jj)
                            newpop(1,jj)=newpop(1,jj);
                        else
                            newpop(1,jj)=round(rand);
                        end
                    end
            end


        elseif ii==popsize%%当扫描最后一个个体时,它的前一个个体是倒数第二个个体,它的下一个个体是第一个个体

            near_temp1=[fitvalue1(popsize-1) fitvalue1(popsize) fitvalue1(1)];
            [max1 max_row1]=max(near_temp1);
            switch max_row1
                case 1
                    for jj=1: chromlength
                        if newpop(popsize,jj)==newpop(popsize-1,jj)
                            newpop(popsize,jj)=newpop(popsize,jj);
                        else
                            newpop(popsize,jj)=round(rand);
                        end
                    end
                case 2
                    newpop(ii,:)=newpop(ii,:);
                case 3
                    for jj=1: chromlength
                        if newpop(1,jj)==newpop(popsize,jj)
                            newpop(popsize,jj)=newpop(popsize,jj);
                        else
                            newpop(popsize,jj)=round(rand);
                        end
                    end
            end


        else

            near_temp1=fitvalue1(ii-1:ii+1);
            [max1 max_row1]=max(near_temp1);
            switch max_row1
                case 1
                    for jj=1: chromlength
                        if newpop(ii,jj)==newpop(ii-1,jj)
                            newpop(ii,jj)=newpop(ii,jj);
                        else
                            newpop(ii,jj)=round(rand);
                        end
                    end
                case 2
                    newpop(ii,:)=newpop(ii,:);
                case 3
                    for jj=1: chromlength
                        if newpop(ii,jj)==newpop(ii+1,jj)
                            newpop(ii,jj)=newpop(ii,jj);
                        else
                            newpop(ii,jj)=round(rand);
                        end
                    end
            end


        end
    end



    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%对个体的适应值进行3邻域比较结束
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    fitvalue1=calfitvalue(newpop,difference1,M1,M2);%此时的newpop是替换后的
    [bestindividual1,bestfit1]=best(newpop,fitvalue1);%求出替换后的pop群体中适应值最大的个体及其适应值

    bestfit_next=bestfit1;
    error2(i)=bestfit_next-bestfit_old;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  判断连续coun次bestfit相同,就退出循环

    if error2(i)==0
        coun=coun+1;
    else
        coun=0;
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    if coun==10
        break;
    else
        pop=newpop;
        bestfit_old=bestfit_next;         %保存当代平均适应度,用于和下一代比较
    end
end
%         pop_best
value_best1       %输出最优适应值
pop_best1_chain   %输出最优个体
i2=i              %算法退出时的代数
toc;

⌨️ 快捷键说明

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