遗传算法

作者:桂。

时间: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(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])

posted @ 2017-08-13 14:07  LeeLIn。  阅读(1045)  评论(0编辑  收藏  举报