zoukankan      html  css  js  c++  java
  • 遗传算法

    作者:桂。

    时间:2017-08-13  13:49:55

    链接:http://www.cnblogs.com/xingshansi/p/7353340.html 


    前言

      用到了遗传算法,简单记录思路。遗传算法(GA)对于学习任何一门学问都有帮助,它是一种普适的学习方法。

    一、遗传算法简介

      遗传算法(Genetic algorithm,GA)是仿生算法的一种,基本思想是:优胜劣汰+染色体组合(编码、交叉、变异)。主要用来求解优化问题,例如一元函数、多元函数、非线性规划、神经网络的参数组等等,本质都是参数的优化求解。

    二、遗传算法步骤

      简要划分为6个步骤:

    1)编码:例如求解x,给定x范围,希望参数误差小于1e-4,这个数据→xmin+(xmax-xmin)/分辨率 进行编码时,例如采用二进制编码,编码长度便可以计算出来。

    2)初始群体生成:即初始化参数,并指定个体数目(无限大就相当于遍历求解)。

    3)适应度评估:相当于准则函数(以最小化为例),如果准则函数越小,则适应度越大,后期越可能存活下来(下一步骤:选择 需要借助适应度);

    4)选择:这一步体现了:适者生存的哲学,从当前个体中选择优良个体,适应度大的选择概率更大(这就对应了轮盘算法,概率大的中奖几率大嘛,有的还将最优结果直接保留,而不参与到概率选择中。);

    5)交叉:交叉的方式很多,最基本的就是选定一个编码片区,不同的个体进行交换,这一步保证了个体尽量不重复。较差概率通常较大,如0.8。

    6)变异:当进化到后期,个体非常相似,交叉可能得到相同的结果,因此变异创造了更多可能,变异因为具有随机性,因此变异概率较小,如0.01。

    指定遗传的代数N,或者设定适应度门限,完成进化。大概流程:

    三、工具包

      谢菲尔德(Sheffield)大学的MATLAB遗传工具箱。网上教程很多,工具箱也自带使用说明。

      应用举例:

    clc
    clear all
    close all
    addpath(genpath('./gatbx/'));
    
    figure(1);
    hold on;
    lb=1;ub=2; 
    ezplot('sin(10*pi*X)/X',[lb,ub]);   
    xlabel('自变量/X')
    ylabel('函数值/Y')
    
    NIND=40;        
    MAXGEN=20;      
    PRECI=20;       
    GGAP=0.95;      
    px=0.7;         
    pm=0.01;        
    trace=zeros(2,MAXGEN);                        
    FieldD=[PRECI;lb;ub;1;0;1;1];                      
    Chrom=crtbp(NIND,PRECI);                      
    
    gen=0;                                  
    X=bs2rv(Chrom,FieldD);                 
    ObjV=sin(10*pi*X)./X;        
    while gen<MAXGEN
       FitnV=ranking(ObjV);                               
       SelCh=select('sus',Chrom,FitnV,GGAP);              
       SelCh=recombin('xovsp',SelCh,px);                  
       SelCh=mut(SelCh,pm);                               
       X=bs2rv(SelCh,FieldD);               
       ObjVSel=sin(10*pi*X)./X;             
       [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); 
       X=bs2rv(Chrom,FieldD);
       gen=gen+1;                                             
       
       [Y,I]=min(ObjV);
       trace(1,gen)=X(I);                            
       trace(2,gen)=Y;                               
    end
    plot(trace(1,:),trace(2,:),'bo');                            
    grid on;
    plot(X,ObjV,'b*');   
    hold off
    
    figure(2);
    plot(1:MAXGEN,trace(2,:));
    grid on
    xlabel('遗传代数')
    ylabel('解的变化')
    title('进化过程')
    bestY=trace(2,end);
    bestX=trace(1,end);
    fprintf(['最优解:
    X=',num2str(bestX),'
    Y=',num2str(bestY),'
    '])

  • 相关阅读:
    数据类型的总结
    typeof加括号和不加括号的区别
    排序
    数据类型分为哪两类
    css中需要更小的字体如何实现
    一些细节注意点
    数值转换题
    如何用分支结构计算年份
    Scout YYF I
    D. AND, OR and square sum
  • 原文地址:https://www.cnblogs.com/xingshansi/p/7353340.html
Copyright © 2011-2022 走看看