实现运用遗传算法求取0到31的x的平方的最大值。
遗传算法是模拟生物在自然环境下的遗传和进化过程的一种自适应的全局优化搜索算法,通过借助遗传学的原理,经过自然选择、遗传、变异等作用机制进而筛选出具有适应性更高的个体(适者生存)。遗传算法从20世纪七八十年代的诞生到现在主要集中的适用范围为:NP问题(指存在多项式算法能够解决的非决定性问题)、非线性、多峰函数优化和多目标优化问题等等。同时在机器学习、模式识别和神经网络及社会科学中的应用也显得非常出色。
遗传算法的具体操作:
遗传操作:就包括优选适应性强的个体的“选择”;个体间交换基因产生新个体的“交叉”;个体间的基因突变而产生新个体的“变异”。其中遗传算法是运用遗传算子来进行遗传操作的。即:选择算子、变异算子、交叉算子。
1.选择算子:根据个体的适应度,按照一定的规则,从第n代群体中选择出一些具有优良性状的个体遗传到下一代(n+1)群体中。在这一选择过程中,个体适应度越大,则被选择到下一代的机会越大。某个体i的适应度fi,种群大小NP,则i被选择的概率公式为:
交叉算子:将群体P(n)中选中的各个个体随机搭配,对于每一个个体,以某一特定概率(交叉概率Pc(0.25-1.0取值))交换他们之间的部分染色体(编码位串的部分位置)。交叉算法是的,遗传算法的搜索能力得到更好的延伸。
2.1交叉操作的具体步骤可以表述为:1.在交配池中随机取出要交配的一对个体;2,根据编码位串长度L,对要交配的一对个体,随机选取[1,L-1]中的一个或者多个整数k作为交叉位置处,相互交换各自的部分基因,由此形成新的个体。
3.变异操作:对群体的每个个体,以某一个概率(变异概率Pm(0.01-0.1取值))将某一个或者某些基因座上的基因值改变为其他的等位基因值,根据个体的编码方式不同,可以将变异分为实值变异和二进制变异。
3.1变异的操作步骤为:首先,对种群中的所有个体按事先的设定的变异概率判断是否进行变异操作;然后 对判断需要变异的个体进行随机选择变异位进行变异。
clc
clear
close all
%%画出函数图
figure(1);
hold on;
lb=0;ub=31;%函数自变量范围【0,31】
ezplot('X^2',[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=X.^2;%计算目标函数值
while gen
FitnV=ranking(ObjV);%分配适应度值
SelCh=select('sus',Chrom,FitnV,GGAP);%选择
SelCh=recombin('xovsp',SelCh,px);%重组
SelCh=mut(SelCh,pm);%变异
X=bs2rv(SelCh,FieldD);%子代个体的十进制转换
ObjVSel=X.^2;%计算子代的目标函数值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重新插入子代到父代,得到新品种
X=bs2rv(Chrom,FieldD);
gen=gen+1; %代计算器增加
[Y,I]=max(ObjV);%获取每代的最优解及其序号,Y为最优解,I为个体的序号
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'])
最优解:
X=30.9852
Y=960.0801
图1:x^2的函数图像
图2:遗传代数的进化过程