遗传算法
作者:桂。
时间: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'])