遗传算法(Genetic Algorithm, GA)和反向传播(Back Propagation, BP)神经网络是两种强大的算法,分别用于优化和机器学习。将遗传算法与BP神经网络结合,可以利用遗传算法的全局搜索能力来优化BP神经网络的初始权重和偏置,从而避免BP神经网络陷入局部最优,并提高网络的训练速度和精度。
以下是遗传算法优化BP神经网络的基本步骤和流程:
1.编码:首先,需要将BP神经网络的权重和偏置编码为遗传算法的基因。这通常通过将权重和偏置值以实数的编码来实现。
2.初始化种群:随机生成一组初始解(即一组权重和偏置的编码),每个解代表一个个体,多个个体组成一个种群。种群的大小(即个体的数量)可以根据问题的复杂性和计算资源来确定。
3.适应度函数设计:设计一个适应度函数来评估每个个体的优劣。采用BP神经网络的训练误差。误差越小,个体的适应度就越高。
4.选择操作:根据适应度函数的结果,选择优秀的个体进入下一代。这可以通过轮盘赌选择、锦标赛选择等方法来实现。
5.交叉操作:随机选择种群中的两个个体,以一定的概率进行交叉操作,生成新的个体。交叉操作的方式可以是单点交叉、多点交叉、均匀交叉等。
6.变异操作:以一定的概率对种群中的个体进行变异操作,以增加种群的多样性。变异可以是位反转、位交换、实数变异等方式。
7.迭代进化:重复步骤4-6,直到满足终止条件(如达到预设的进化代数、适应度达到预设阈值等)。
8.解码与BP神经网络训练:将遗传算法得到的最佳个体解码为BP神经网络的初始权重和偏置,然后使用标准的BP算法进行训练。
9.测试与评估:使用测试数据集评估训练好的BP神经网络的性能。
MATLAB主程序如下:
完整代码见:https://download.csdn.net/download/corn1949/89156937
%% 遗传算法 优化BP
clc;close all;clear all;%清除变量
rand('seed',1000);
randn('seed',1000);
format long g;
addpath(genpath('mytoolbox'));global inputnumber hiddenumber outputnumber input_train output_train input_test P1 P2 T1 T2 inputps outputps indexM N;X=rand(200,3);
Y=sum(X,2);Inputdata=X';
Outputdata=Y';snumber=size(Outputdata,2);
% index200=1:snumber;%顺序样本
index200=randperm(snumber);%随机样本
numberTest=50;%用于测试的样本个数indextrain=index200(1:end-numberTest);
indextest=index200(end-numberTest+1:end);% 定义训练集
P1=Inputdata(:,indextrain);
T1=Outputdata(:,indextrain);
% 定义测试集
P2=Inputdata(:,indextest);
T2=Outputdata(:,indextest);
%设置训练集和测试集%% (2)训练数据归一化
[input_train,inputps]=mapminmax(P1);
[output_train,outputps]=mapminmax(T1);
%测试数据归一化
input_test=mapminmax('apply',P2,inputps);
output_test=mapminmax('apply',T2,outputps);[k11,k12]=size(input_train);%计算维数
inputnumber=k11;%输入维数
hiddenumber=8;%隐含神经元数
outputnumber=size(output_train,1);%输出维数;%输出维数
S=[hiddenumber*inputnumber,outputnumber*hiddenumber,hiddenumber*1,outputnumber*1];
indexM=S2indexMfun(S);
N=sum(S);% 编码长度tic;
[x0,ybptest]=myfun2();
bptime=toc;% 遗传算法参数
popsize=50;%遗传算法种群数
maxgen=100;%遗传算法迭代次数
PM=0.1;%变异概率
PC=0.8;%交叉概率lb=-3*ones(1,N);
ub=3*ones(1,N);%% 遗传算法主程序
%性能跟踪
tic;
tracematga=zeros(maxgen,2);
gen=0;
Chrom=genChrome(popsize,N,lb,ub,x0);% 建立种群
Value = decodingFun(Chrom,popsize);% 解码染色体
[vmin,indexmin]=min(Value);
bestValue=vmin;% 记录函数的最优值
bestChrom=Chrom(indexmin,:);% 记录函数的最优染色体%% 遗传算法优化
%进度条
wait_hand = waitbar(0,'running...', 'tag', 'TMWWaitbar');
while gen<maxgen%% 遗传算子FitnV=ranking(Value);% 分配适应度值Chrom=select('rws',Chrom,FitnV,1);% 选择Chrom=mutationGA(Chrom,popsize,PM,N,lb,ub);% 种群变异,单点变异Chrom=crossGA(Chrom,popsize,PC,N);% 种群交叉,2点交叉Value = decodingFun(Chrom,popsize);% 解码染色体%% 计算最优[vmin,indexmin]=min(Value);gen=gen+1;%% 记录最优if bestValue>vminbestValue=vmin;% 记录函数的最优值bestChrom=Chrom(indexmin,:);% 记录最优染色体endtracematga(gen,1)=bestValue;% 保留最优tracematga(gen,2)=mean(Value);waitbar(gen/maxgen,wait_hand);% 每循环一次更新一次进步条
end
delete(wait_hand);% 执行完后删除该进度条
gabptime=toc;% 运行时间% 显示结果
disp('遗传算法优化得到的最优目标函数');
bestValue
% disp('遗传算法优化得到的最优染色体');
% bestChromfigure;
plot(tracematga(:,1),'r-','linewidth',1);
legend({'种群最优值'},'fontname','宋体');
xlabel('迭代次数','fontname','宋体');
ylabel('目标函数','fontname','宋体');
title('遗传算法优化BP神经网络收敛曲线','fontname','宋体');%% 以优化得到的权值阀值寻bp神经网络
x=bestChrom;
[y,y_ga_bp_test,net]=myfun(x);
程序结果如下:
遗传算法优化得到的最优目标函数
bestValue =
0.646362974919631
GA-BP运行时间(s)
gabptime =
59.1725145
GA-BP预测结果的各项指标
bp运行时间(s)
bptime =
6.2069057
BP预测结果的各项指标
outcell =
'算法' 'R2' 'MSE' 'RMSE' 'MAPE' 'MAD'
'GA-BP' [0.878515453615733] [0.0382909950102112] [0.195680849881155] [9.65913565222882] [0.151800353400859]
'BP' [0.832942552008874] [0.0724079520899815] [0.269087257390575] [ 15.68516966661] [0.213997501340996]
>>
完整代码见:https://download.csdn.net/download/corn1949/89156937