遗传算法+BP神经网络组合求解非线性函数

本文探讨了使用遗传算法解决非线性函数时遇到的问题,如计算时间过长或无法准确计算适应度。为解决这些问题,文章提出结合BP神经网络进行优化。在遗传算法的主过程中,部分个体的适应度通过BP网络快速计算,以降低时间复杂度。通过实例展示了这种方法的应用,得出最优解和近似函数的BP模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用遗传算法求解非线性问题是常见的求解算法之一,求解的过程就是随机生成解,计算适应度,然后选择,交叉,变异,更新种群,不断迭代,这样,每个个体都会向每代中最佳的个体学习并靠拢,这是局部最优解;而变异操作是为了在靠近当前最优解的同时还有机会变异出更佳的基因,从而跳出局部最优解而达到全局最优解。

而有时候,面对一个很复杂的非线性函数,或者是根本无法用确定的表达式描述的离散非线性函数,在计算适应度时就会产生很大的问题,比如计算时间过长,解出式子需要半个小时;比如无法计算,只有贴近的离散点。这样,传统的遗传算法无法达到我们期望的速度和要求,我们就需要引入其他辅助遗传算法的内容。

这里,我们引入了BP神经网络:有导师学习的误差前馈神经网络。BP神经网络随机初始化权值与阈值,并通过已有的训练数据和训练期望,将计算出来的误差前馈给神经网络,也就是归结为权值和阈值的“过错”。这样,权值和阈值不断得到修改,最终形成逼近训练数据和期望的模型。

所以,我们在遗传算法的主过程中,先迭代一部分的次数,得到一部分种群个体和适应度值,用来训练BP神经网络。接下来的迭代中,将一部分的种群个体的适应度直接用BP模型求出来,而另一部分的种群个体适应度仍然用原函数求出(或者原来的预测曲线),将这一部分的种群个体和适应度再次带入BP神经网络中训练网络,使网络越来越精准。神经网络的求值是很快的,最后时间复杂度将会大大降低。

在下面的例子中,有一个很简单的例子:y=-5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-sin(5*x(1))*sin(5*x(2))*sin(5*x(3))*sin(5*x(4))*sin(5*x(5))+8;这是一个很简单的非线性函数,我们用上面的思路来模拟一遍解法,最后得出最优解和一个逼近此函数的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
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值