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

📄 rosenbrokemin.m

📁 rosenbroken算法
💻 M
字号:
%genetic algorithm for function f(x1,x2) optimum(Rosenbroke)
clear all;
close all;
%参数
Size=80;        %80个个体
G=100;          %遗传100代
Codel=10;      %编码长10位
umax=10;
umin=-10;    %参数取值范围(十进制)
E=round(rand(Size,2*Codel));          %初始编码(0,1),随机产生80*20,round取整四舍五入

%*********************************主程序************************************
for k=1:1:G        %循环100代
    time(k)=k;
    for s=1:1:Size  %对80个个体进行编码
        m=E(s,:);   %m取每个个体,即E的每一行
        y1=0;       %y1,y2对应二进制编码的十进制数
        y2=0;
        %编码
        m1=m(1:1:Codel);
        for i=1:1:Codel
            y1=y1+m1(i)*2^(i-1);
        end
        x1=(umax-umin)*y1/1023+umin;   %x1,x2分别对应取值范围内的十进制数
        
        m2=m(Codel+1:1:2*Codel);
        for i=1:1:Codel
            y2=y2+m2(i)*2^(i-1);
        end
        x2=(umax-umin)*y1/1023+umin;
        
        F(s)=100*(x1^2-x2)^2+(1-x1)^2;        %求80个个体的rosenbroke函数值,以进行适应度的比较
    end
    Ji=1.-F;        %求倒数值,作为目标函数
    %***************** step1 选出最佳目标函数值****************************
    BestJ(k)=max(Ji);                        %求rosenbroke函数的极大值,就是求目标函数的极小值。
                                             %返回目标函数的极小值
    fi=Ji;                                    %适应度函数
    [Oderfi,Indexfi]=sort(fi);               %将适应度的值安从小到大排序
    Bestfi=Oderfi(Size);                     %令Bestfi=max(fi)
    BestS=E(Indexfi(Size),:);                %令BestS=E(m),m为max(fi)所在的行
    bfi(k)=Bestfi;
    %***************** step2 选择,复制操作*********************************
    fi_sum=sum(fi);                          %适应度求和
    fi_Size=(Oderfi/fi_sum)*Size;            %各适应度的值除以适应度的平均值
    fi_S=floor(fi_Size);                     %floor向负无穷取整,得到各个体的复制值
    kk=1;
    for i=1:1:Size
        for j=1:1:fi_S(i)                    %根据各个体复制值的大小进行选择复制
            TempE(kk,:)=E(Indexfi(i),:);
            kk=kk+1;                         %kk用于记录
        end
    end
    %**************** step3 交叉操作*****************************************
    pc=0.6;                                  %交叉的概率为0.6
    n=ceil(20*rand);                         %向正无穷取整得到(1--20)之间的随机整数,作为交叉点n
    for i=1:2:(Size-1)
        temp=rand;                           %产生(0--1)之间的随机数
        if pc>temp                           %交叉条件
           for j=n:1:20
               TempE(i,j)=E(i+1,j);
               TempE(i+1,j)=E(i,j);          %将复制之前和之后的两个种群进行交叉,放到种群2(TempE)
           end 
        end 
    end
    TempE(Size,:)=BestS;                    %保留最好的个体
    E=TempE;                                %覆盖种群1(E)
    %*************** step4 变异操作****************************************
    %pm=0.001;                              %变异概率一般取0.001
    %p=0.001-[1:1:Size]*(0.001)/Size;       %大的适应度,小的变异概率
    %pm=0.0;                                %不变异
    pm=0.1;                                 %大的变异概率
    for i=1:1:Size
        for j=1:1:2*Codel
            temp=rand;                      %产生(0--1)之间的随机数
            if pm>temp                      %变异条件
                if TempE(i,j)==0;
                    TempE(i,j)=1;
                else
                    TempE(i,j)=0;
                end
            end
        end
    end
    
    TempE(Size,:)=BestS;                    %保留最好的个体
    E=TempE;                                %覆盖种群1(E)
end

%*********************画图**********************************
Max_Value=Bestfi                            %最大适应度值
BestS                                       %最佳参数值
x1                                          %最佳参数值对应到取值范围内的值
x2
figure(1);
plot(time,BestJ);                            
xlabel('Times');ylabel('Best J');           %每代的最佳目标函数值
figure(2);
plot(time,bfi);                            
xlabel('Times');ylabel('Best F');           %每代的最佳适应度函数值  

⌨️ 快捷键说明

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