本章案例是在第三章案例(遗传算法优化BP神经网络)的基础上进行的,相对较为简单。需要注意的是:问题导向是找到最小值对应的坐标点。与第三章中优化神经网络的权值阈值不同。
目标函数:y=x1.^2+x2.^2
寻优:y最小的情况下,找出(x1,x2)的坐标
从下图可以直观体现本案例寻优点:
一、主函数代码
clear;close;clc
%% bp神经网络初始化
%载入原始数据
load data1 input output
%训练集与测试集
k=randperm(length(input));
input_train=input(k(1:3900),:)';
output_train=output(k(1:3900),:)';
input_test=input(k(3901:end),:)';
output_test=output(k(3901:end),:)';
%归一化
[Input_train,inputps]=mapminmax(input_train);
[Output_train,outputps]=mapminmax(output_train);
%% 构建bp神经网络
%设置网络参数
net=newff(Input_train,Output_train,5);
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;
net.trainParam.epochs=100;
%训练网络
net=train(net,Input_train,Output_train);
%% 遗传算法
%参数初始化
maxgen=100; %迭代次数
sizepop=20; %种群数目
pcross=0.4; %交叉概率
pmutation=0.2; %突变概率
lenchrom=[1,1]; %染色体长度 2
bound=[-5 5;-5 5]; %染色体编码范围 -5~5
%种群信息初始化
individuals=struct('fitness',zeros(1,sizepop),'chrom',[]);
bestfitness=[]; %最优适应度(最小)
bestchrom=[]; %最优染色体(对应最小值的坐标)
%初代适应度与染色体编码
for i=1:sizepop
individuals.chrom(i,:)=Code(lenchrom,bound);%对20个种群依次进行染色体编码
x=individuals.chrom(i,:);%编码后的染色体
individuals.fitness(i)=fun(x);%求染色体的适应度(即bp神经网络的y预测值)
end
[bestfitness,bestindex]=min(individuals.fitness);%适应度最小即为最优适应度
bestchrom=individuals.chrom(bestindex,:);%对应的最优染色体
%% 迭代进化(都是对染色体进行操作)
for i=1:maxgen
%选择(适应度越好选中概率越大)
individuals=Select(individuals,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);
end
%找出这一代中 最优适应度及下标
[newbestfitness,newbestindex]=min(individuals.fitness);
[worsefitness,worseindex]=max(individuals.fitness);
%这一代最优适应度与初代最优适应度比较
%进行最优适应度与染色体更新
if newbestfitness<bestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
%将最差适应度的染色体淘汰(用最优的替代)
individuals.fitness(worseindex)=bestfitness;
individuals.chrom(worseindex,:)=bestchrom;
end
%迭代的结果(最小值的坐标)
x=bestchrom
round(x)