用遗传算法求解非线性问题是常见的求解算法之一,求解的过程就是随机生成解,计算适应度,然后选择,交叉,变异,更新种群,不断迭代,这样,每个个体都会向每代中最佳的个体学习并靠拢,这是局部最优解;而变异操作是为了在靠近当前最优解的同时还有机会变异出更佳的基因,从而跳出局部最优解而达到全局最优解。
而有时候,面对一个很复杂的非线性函数,或者是根本无法用确定的表达式描述的离散非线性函数,在计算适应度时就会产生很大的问题,比如计算时间过长,解出式子需要半个小时;比如无法计算,只有贴近的离散点。这样,传统的遗传算法无法达到我们期望的速度和要求,我们就需要引入其他辅助遗传算法的内容。
这里,我们引入了BP神经网络:有导师学习的误差前馈神经网络。BP神经网络随机初始化权值与阈值,并通过已有的训练数据和训练期望,将计算出来的误差前馈给神经网络,也就是归结为权值和阈值的“过错”。这样,权值和阈值不断得到修改,最终形成逼近训练数据和期望的模型。
所以,我们在遗传算法的主过程中,先迭代一部分的次数,得到一部分种群个体和适应度值,用来训练BP神经网络。接下来的迭代中,将一部分的种群个体的适应度直接用BP模型求出来,而另一部分的种群个体适应度仍然用原函数求出(或者原来的预测曲线),将这一部分的种群个体和适应度再次带入BP神经网络中训练网络,使网络越来越精准。神经网络的求值是很快的,最后时间复杂度将会大大降低。
在下面的例子中,有一个很简单的例子:。这是一个很简单的非线性函数,我们用上面的思路来模拟一遍解法,最后得出最优解和一个逼近此函数的BP网络模型。
首先,遗传算法的基本函数如下
1.选择函数,以每个个体的适应度为概率选择优秀个体,更新种群select.m
function ret=select(individuals,sizepop)
% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异
% individuals input : 种群信息
% sizepop input : 种群规模
% opts input : 选择方法的选择
% ret output : 经过选择后的种群
individuals.fitness= 1./(individuals.fitness);
sumfitness=sum(individuals.fitness);
sumf=individuals.fitness./sumfitness;
index=[];
for i=1:sizepop %转sizepop次轮盘
pick=rand;
while pick==0
pick=rand;
end
for j=1:sizepop
pick=pick-sumf(j);
if pick<0
index=[index j];
break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体
end
end
end
individuals.chrom=individuals.chrom(index,:);
individuals.fitness=individuals.fitness(index);
ret=individuals
2.交叉函数:Cross.m
function ret=Cros