基于遗传算法求函数最大值
土豆学习小组
基于遗传算法求函数最大值
先给出实例:设函数为:f (x ) =cos(5x ) −sin(3x ) +10, x ∈[1, 7],取种群大小20,搜索精度0.0001,交叉概率0.6,变异概率0.1,遗传20代。下面根据这个例子来叙述如何通过遗传算法来计算最大值。
遗传算法的概念和相关知识可以去网上查看,这里主要介绍和程序相关的知
识。遗传算法的流程图如下:
遗传算法流程图
种群的产生一般由随机数产生固定长度的01序列,可以理解成染色体,例如:[***********]1000,这表示一个单独个体的染色体,那么结合这个例子就是产生20个这样的染色体。
种群适应度估计,因为是求最大值,所以适应度可以通过求函数值来确定,函数值越大,越适合生存。
选择,这是一个自然选择的过程,这里用轮盘赌选择法,
土豆学习小组
轮盘赌选择法
交叉用单点交叉:
单点交叉
变异的形式如下:
变异
当然变异的概率相对较低。
注意:选择和交叉方法还很多,也比这来的有效,只是这种方法较为简单,易于程序实现。
MATLAB 命令窗口:
>>[xv,fv]=GA(@fitness,1,7,20,20,0.6,0.1,0.0001)
xv =
3.6723
土豆学习小组
fv =
11.8830
函数图形
结果基本符合。
函数文件1:fitness.m
function F=fitness(x)
F=cos(5*x)-sin(3*x)+10;用于存放需要求的函数
函数文件2:GA.m 遗传算法文件
function[xv,fv]=GA(fitness,a,b,NP,NG,pc,pm,eps)%上限a
%下限b
%种群大小:NP
%遗传代数:NG
%交叉概率:pc
%变异概率:pm
%离散精度:eps
%第一步产生初始种群x ,产生之前需要根据离散精度确定串长L L=ceil(log2((b-a)/eps));
x=Initial(L,NP);
for i=1:NP
xdec(i)=dec(a,b,x(i,:),L);
end
%第二步选择交叉变异要循环好几代
for i=1:NG
%选择轮盘赌选择法
fx=fitness(xdec);%适应度
fxp=fx/sum(fx);%选择概率
fxa(1)=fxp(1);%累计概率
土豆学习小组
for j=2:NP
fxa(j)=fxa(j-1)+fxp(j);
end
%开始选择父体
sat=rand();
for k=1:NP
if sat
father=k;
break;
end
end
%随机选取母体
mother=ceil(rand()*NP);
nx=x;
%单点交叉
cutp=ceil(rand()*L);
r1=rand();
if r1
nx(i,1:cutp)=x(father,1:cutp);
nx(i,cutp+1:L)=x(mother,cutp+1:L);
r2=rand();%是否变异
if r2
cum=ceil(rand()*L);
nx(i,cum)=~nx(i,cum);
end
end
x=nx;
for i=1:NP
xdec(i)=dec(a,b,x(i,:),L);
end
%选择较好的子代
fv=-inf;
for i=1:NP
fitx=fitness(dec(a,b,x(i,:),L));
if fitx>fv
fv=fitx;
xv=dec(a,b,x(i,:),L);
end
end
end
土豆学习小组
%种群初始化函数
function t=Initial(L,NP)
t=zeros(NP,L);
for i=1:NP
for j=1:L
temp=rand();
t(i,j)=round(temp);
end
end
%解码函数转换成十进制
function d=dec(a,b,num,L)
i=L-1:-1:0;
dd=sum((2.^i).*num);
d=a+dd*(b-a)/(2^L-1);
其中:dec 函数将某个个体转换到【1,7】之间的数[1**********]0=1;
[1**********]1=7;