zoukankan      html  css  js  c++  java
  • 简单遗传算法代码

    1.

    遗传算子简介 
    1 选择算子 
    把当前群体中的个体按与适应值成比例的概率
    复制到新的群体中,遗传算法中最
    常用的选择方式是轮盘赌选择方式。轮盘赌选择步骤如下: 
    (1)求群体中所有个体的适应值总和S; 
    (2)产生一个0到S之间的随机数M; 
    (3)从群体中编号为1的个体开始,将其适应值与后续个体的适应值相加,直到累加和大于等于M,则停止。其中,那个最后加进去的个体即为新选择的个体。 
    选择算子作用的效果是提高了群体的平均适应值及最差的适应值,低适应值的个体趋于被淘汰,高适应值的个体趋于被复制,但是是以损失群体的多样性为代价,选择算子并没有产生新的个体,当然群体中最好个体的适应值不会改进。
    .
    2 交叉算子 
    交叉算子(又称杂交算子)每次作用在种群随机选取的两个个体上产生两个不同的子个体,它们一般与父个体不同,但又包含父个体的遗传物质,交叉运算是遗传算法区别于其它进化算法的重要特征。 
    交叉规则内容包括两个方面:
    (1)从种群中对个体随即配对,并按预定的交叉概率来决定是否进行交叉操作。
    (2)设定个体的交叉点,并对这些点前后的配对个体的基因相互交换。 
    例如:首先产生一个1到h(其中h为染色体分量的个数)的随机数i(称为交叉点),然后配对的两个个体相互交换从(i+1)到h的位子,如对以下两个数进行交叉且交叉点选择在2,即i=2,则  
    对种群要确定交叉概率。随机选择N×个个体进行交叉,其余不变。 
    显然,利用选择、交叉算子可以产生具有更高平均适应值和更好个体的群体。但仅仅如此,容易导致局部最优解。
    3 变异算子 
    变异算子能使个体发生突然变异,导入新的遗传信息,使寻优有可能指向未探知区域,是提高全局最优搜索能力的有效步骤,也是保持群体差异,防止过早出现收敛现象的重要手段。以一个很小的变异概率,随机的改变染色体上的某个基因(),具有增加群体多
    样性的效果。例如:
     

    遗传算法求解步骤

    遗传算法求解步骤
     
    (1) 选择问题解的一个编码,给出一个有N个染色体的初始群体pop(1),t=1。
    (2) 对群体中的每一个染色体,计算它的适应函数值
    (3)  若停止规则满足,则算法停止,否则计算概率,并以此概率分布,从pop(t)中随机选取N个染色体构成一个新的种群newpop(t)。
    (4)   通过交叉(交叉概率为),得到N个染色体的crosspop(t+1)。
    (5)   以较小的变异概率使得某染色体的一个基因发生变异,形成新的群体mutpop(t+1)。  令t=t+1,pop(t)=mutpop(t),重复第(2)步。流程如图一所示。
                                                 
    遗传算法特点    
    遗传算法的优越性:
    (1)作为数值求解方法具有普适性,对目标函数几乎没有要求,总能以极大概率找到全局最优解。
    (2)遗传算法在求解很多组合优化问题时,不需要很高的技巧和对问题有非常深入的了解,在给问题的决策变量编码后,其计算过程比较简单。
    (3)与其他启发式算法有较好的兼容性,易于别的技术相结合,形成更优的问题解决方法。
     遗传算法的欺骗性问题:
    (1)在遗传进化的初期,通常会产生一些超常个体,按比例选择,这些个体竞争力太强而控制了选择过程,影响算法的全局优化性能。(2)在遗传进化的后期,即算法接近收敛时,由于种群中个体适应度差异较小,继续优化的潜能降低,可能获
     
     
     
     

    一、

    一个y对应一个x的案例代码

        

    % Optimizing a function using Simple Genetic Algorithm with elitist preserved 
    %Max f(x1,x2)=100*(x1*x1-x2).^2+(1-x1).^2; -2.0480<=x1,x2<=2.0480
    %函数的最大值为3905.9262,此时两个参数的值是-2.0480,2.0480
    % Author: Wang Yonglin (wylin77@126.com) 
    clc;
    clear all; 
    format long;%设定数据显示格式 
    %初始化参数 
    T=20;%仿真代数 
    N=80;% 群体规模 
    
    pc=0.6;%交叉概率
    pm=0.001;%变异概率 
    umax=10;umin=0;%参数取值范围 
    L=10;%单个参数字串长度,总编码长度2L 
    bval=round(rand(N,2*L));%初始种群 
    bestv=-inf;%最优适应度初值 
    %迭代开始 
    for ii=1:T 
    %解码,计算适应度:为了优化后的评价 
    % for i=1:N 
    % y1=0;y2=0; 
    % for j=1:1:L 
    % y1=y1+bval(i,L-j+1)*2^(j-1); 
    % end 
    % x1=(umax-umin)*y1/(2^L-1)+umin; 
    % for j=1:1:L 
    % y2=y2+bval(i,2*L-j+1)*2^(j-1); 
    % end 
    % x2=(umax-umin)*y2/(2^L-1)+umin; 
    %obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; %目标函数 
    for i=1:N
        y=0;
        for j=1:1:L
            y=y+bval(i,L-j+1)*2^(j-1);
        end
        x =(umax-umin)*y /(2^L-1)+umin;
    % obj(i)=x+10*sin(5*x)+7*cos(4*x);
    obj(i)=x*x-1;
    % xx(i,:)=[x1,x2]; 
    xx(i,:)=[x];
    end 
    func=obj;%目标函数转换为适应度函数 
    p=func./sum(func); 
    q=cumsum(p);%累加 
    [fmax,indmax]=max(func);%求当代最佳个体 
    if fmax>=bestv 
    bestv=fmax;%到目前为止最优适应度值 
    bvalxx=bval(indmax,:);%到目前为止最佳位串 
    optxx=xx(indmax,:);%到目前为止最优参数 
    end 
    Bfit1(ii)=bestv; % 存储每代的最优适应度 
    %%%%遗传操作开始 
    %算法实现时采用随机数方法,先将每个染色体的适应度除以所有染色体适应度的和,
    %再累加,使他们根据适应度的大小分布于0-1之间,适应度大的占的区域大,
    %然后随机生成一个0-1之间的随机数,随机数落到哪个区域,对应的染色体就被选中。
    %重复操作,选出群体规模规定数目的染色体。这个操作就是“优胜劣汰,适者生存”,但没有产生新个体。
    %-----------------------------轮盘赌选择--------------------------------- 
    for i=1:(N-1) 
    r=rand; 
    tmp=find(r<=q); 
    newbval(i,:)=bval(tmp(1),:); 
    end 
    newbval(N,:)=bvalxx;%最优保留 
    bval=newbval; 
    %-----------------------------单点交叉------------------------------------ 
    %参与交叉的染色体是轮盘赌选出来的个体,并且还要根据选择概率来确定是否进行交叉
    %(生成0-1之间随机数,看随机数是否小于规定的交叉概率),否则直接进入变异操作
    for i=1:2:(N-1) 
    cc=rand; 
    if cc<pc 
    point=ceil(rand*(2*L-1));%取得一个1到2L-1的整数 
    ch=bval(i,:); 
    bval(i,point+1:2*L)=bval(i+1,point+1:2*L); 
    bval(i+1,point+1:2*L)=ch(1,point+1:2*L); 
    end 
    end 
    bval(N,:)=bvalxx;%最优保留 
    %----------------------------位点变异 -----------------------------------
    %对于二进制位串,0变为1,1变为0就是变异。采用概率确定变异位,对每一位生成一个0-1之间的随机数,
    %看是否小于规定的变异概率,小于的变异,否则保持原状。
    %这个操作能够使个体不同于父辈而具有自己独立的特征基因,主要用于跳出局部极值
    mm=rand(N,2*L)<pm;%N行 
    mm(N,:)=zeros(1,2*L);%最后一行不变异,强制赋0 
    bval(mm)=1-bval(mm); 
    end
    %输出 
    plot(Bfit1);% 绘制最优适应度进化曲线 
    bestv %输出最优适应度值 
    optxx %输出最优参数

    二、有两个变量一个式子的代码

    实例
    求函数-100*(x(1)^2-x(2))^2-(1-x(1))^2的最小值,两个变量的取值范围是from [-2.048;-2.048] to [2.048;2.048].
    1)使用ga工具箱
    X = ga(@(x) -100*(x(1)^2-x(2))^2-(1-x(1))^2,2,[],[],[],[],[-2.048;-2.048],[2.048;2.048])
    2)未使用ga工具箱

    %//Generic Algorithm for function f(x1,x2) optimum
    clear all;
    close all;
    
    %//Parameters
    Size=80;
    G=100;
    CodeL=10;
    
    umax=2.048;
    umin=-2.048;
    
    E=round(rand(Size,2*CodeL));    %//Initial Code 产生初始群体
    
    %//Main Program
    for k=1:1:G
        time(k)=k;
    
        %//选择 %//计算目标函数    
        for s=1:1:Size %//对每一行
            m=E(s,:);
            y1=0;y2=0;
    
            %//Uncoding
            m1=m(1:1:CodeL);
            for i=1:1:CodeL
                y1=y1+m1(i)*2^(i-1);
            end
            x1=(umax-umin)*y1/1023+umin; %//计算参数1
    
            m2=m(CodeL+1:1:2*CodeL);
            for i=1:1:CodeL
                y2=y2+m2(i)*2^(i-1);
            end
            x2=(umax-umin)*y2/1023+umin; %//计算参数2
    
            F(s)=100*(x1^2-x2)^2+(1-x1)^2; %//计算目标函数 ,F是向量
        end
    
        Ji=1./F;
        %//****** Step 1 : Evaluate BestJ ******
        BestJ(k)=min(Ji); %//找到F中最大的一项,保存到向量BestJ
    
        fi=F;                          %//Fitness Function
        [Oderfi,Indexfi]=sort(fi);     %//Arranging fi small to bigger
        Bestfi=Oderfi(Size);           %//Let Bestfi=max(fi)
        BestS=E(Indexfi(Size),:);      %//Let BestS=E(m), m is the Indexfi belong to max(fi)
        bfi(k)=Bestfi;
    
        %//****** Step 2 : Select and Reproduct Operation******选择F较大的fi项
        fi_sum=sum(fi);
        fi_Size=(Oderfi/fi_sum)*Size;
    
        fi_S=floor(fi_Size);       %//Selecting Bigger fi value ,fi_S为80项的向量,每一项为0或1,1表示该项被选择
    
        kk=1;
        for i=1:1:Size
            for j=1:1:fi_S(i)        %//Select and Reproduce
                TempE(kk,:)=E(Indexfi(i),:);
                kk=kk+1;              %//kk is used to reproduce
            end
        end %//选择完毕
        fprintf('size TempE %//d
    ',size(TempE))
        
        %//************ Step 3 : Crossover Operation ************交换
        pc=0.60;
        n=ceil(20*rand);
        for i=1:2:(Size-1)
            temp=rand;
            if pc>temp                  %//Crossover Condition
                for j=n:1:20
                    TempE(i,j)=E(i+1,j);
                    TempE(i+1,j)=E(i,j);
                end
            end
        end
        TempE(Size,:)=BestS;
        E=TempE;
        fprintf('size E %//d
    ',size(E))
    %//    pause
        %//************ Step 4: Mutation Operation **************
        %//pm=0.001;
        %//pm=0.001-[1:1:Size]*(0.001)/Size; %//Bigger fi, smaller Pm
        %//pm=0.0;    %//No mutation
        pm=0.1;     %//Big mutation
    
        for i=1:1:Size
            for j=1:1:2*CodeL
                temp=rand;
                if pm>temp                %//Mutation Condition
                    if TempE(i,j)==0
                        TempE(i,j)=1;
                    else
                        TempE(i,j)=0;
                    end
                end
            end
        end
    
        %//Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
        TempE(Size,:)=BestS;
        E=TempE;
    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');
  • 相关阅读:
    第五次作业
    第四次作业
    第三次
    request.getAttribute()和 request.getParameter()有何区别
    .Servlet API中forward()与redirect()的区别
    jsp和servlet的区别、共同点、各自应用的范围
    Servlet的生命周期
    如何从CDN加载jQuery
    window.onload()函数和jQuery中的document.ready()的区别
    jquery中$.get()提交和$.post()提交的区别
  • 原文地址:https://www.cnblogs.com/sunli0205/p/5884132.html
Copyright © 2011-2022 走看看