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

浙公网安备 33010602011771号