4.1 案例背景
\[y = {x_1}^2 + {x_2}^2\]
4.2 模型建立

神经网络训练拟合根据寻优函数的特点构建合适的BP神经网络,用非线性函数的输入输出数据训练BP神经网络,训练后的BP神经网络就可以预测函数输出。遗传算法极值寻优把训练后的 BP 神经网络预测结果作为个体适应度值,通过选择、交叉和变异操作寻找函数的全局最优值及对应输入值。
网络结构:2-5-1
训练数据:3900,测试数据:100
4.3 编程实现
%% 基于神经网络遗传算法的系统极值寻优 %% 清空环境变量 clc clear input=2*randn(2,2000); output=sum(input.*input); [inputn,inputps]=mapminmax(input); [outputn,outputps]=mapminmax(output); %% BP网络训练 % %初始化网络结构 net=newff(inputn,outputn,[10,5]); % 配置网络参数(迭代次数,学习率,目标) net.trainParam.epochs=500; net.trainParam.lr=0.1; net.trainParam.goal=0.000004; %网络训练 net=train(net,inputn,outputn);
%% 初始化遗传算法参数
%初始化参数
maxgen=200; %进化代数,即迭代次数
sizepop=20; %种群规模
pcross=[0.4]; %交叉概率选择,0和1之间
pmutation=[0.2]; %变异概率选择,0和1之间
lenchrom=[1 1]; %每个变量的字串长度,如果是浮点变量,则长度都为1
bound=[-5 5;-5 5]; %数据范围
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体
avgfitness=[]; %每一代种群的平均适应度
bestfitness=[]; %每一代种群的最佳适应度
bestchrom=[]; %适应度最好的染色体
%% 初始化种群计算适应度值
% 初始化种群
for i=1:sizepop
%随机产生一个种群
individuals.chrom(i,:)=Code(lenchrom,bound);
x=individuals.chrom(i,:);
%计算适应度
individuals.fitness(i)=fun(x,inputps,outputps,net); %染色体的适应度
end
%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness];
%% 迭代寻优
% 进化开始
for i=1:maxgen
if(mod(i,10)==0)
i
end
% 选择
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
% 变异
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
% 计算适应度
for j=1:sizepop
x=individuals.chrom(j,:); %解码
individuals.fitness(j)=fun(x,inputps,outputps,net);
end
%找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
% 代替上一次进化中最好的染色体
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
function fitness = fun(x,inputps,outputps,net)
% 函数功能:计算该个体对应适应度值
% x input 个体
% fitness output 个体适应度值
%数据归一化
x=x';
inputn_test=mapminmax('apply',x,inputps);
%网络预测输出
an=sim(net,inputn_test);
%网络输出反归一化
fitness=mapminmax('reverse',an,outputps);
%% 结果分析
[r,c]=size(trace);
plot(trace(:,2),'r-');
title('适应度曲线','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
axis([0,200,0,1])

x=bestchrom; disp([bestfitness x]);

fun([0,0],inputps,outputps,net)
ans =
0.0507
在遗传算法中没有$y = {x_1}^2 + {x_2}^2$函数的原型,由于神经网络的误差,最后的计算值离真实值有一定偏差。
若将fun函数改为fitness=sum(x.*x);,则可以看到遗传算法取得良好效果,因此能用函数原型就一定要用,如果要用神经网络一定要有充足的训练数据,并指定足够小的误差。


