【SOC预测】改进的自适应遗传算法优化BP神经网络IGA-BP电池充电状态SOC预测(含前后对比)【含Matlab源码 3331期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、粒子滤波锂离子电池寿命预测简介

1 粒子滤波
粒子滤波算法是一种基于蒙特卡洛方法的状态估计算法,用于解决非线性、非高斯的状态估计问题。它通过在状态空间中随机采样一组粒子来近似表示概率分布,然后根据观测数据对粒子进行重要性权重更新,最后通过重采样来保留高权重的粒子,舍弃低权重的粒子,从而实现对状态的估计。粒子滤波算法的优点是可以处理非线性、非高斯的问题,并且不需要对系统进行线性化或假设高斯分布。它在机器人定位、SLAM等领域得到了广泛应用。

2 粒子滤波算法的步骤包括:
(1)粒子采样:从建议分布中抽取一组粒子。
(2)粒子加权:根据观测概率分布、重要性分布以及贝叶斯公式计算每个粒子的权值。
(3)重采样:为了应对粒子退化现象,采用重采样等策略舍弃权值较小的粒子,代之以权值较大的粒子。
(4)估计输出:输出系统状态的均值、协方差等。

3 自适应遗传算法
遗传算法是一种全局优化算法,在求解函数最优值时不容易陷入局部极小的陷阱而出现“死循环”现象,弥补了传统迭代法的不足。本文主要介绍自适应遗传算法的基本原理及实例验证。根据生物进化现象,其基本原理包括编码、解码、交配、变异、选择。其中最核心的,也是遗传算法独有的特征是交配和变异。自适应方法主要是将交配和变异概率改为随适应度函数值的变化而自动改变,即自适应遗传算法。
关键词:遗传算法;自适应遗传算法;函数极值

遗传算法最初由Holland提出,旨在通过通过自然系统的自适应行为来设计具有自适应功能的软件系统,该方法属于进化算法的一种。遗传算法通过对函数自变量范围进行基因编码、交配、基因变异、计算函数适应度值、选择较优值到下一代、种群繁殖后重复上述操作的方法,逐渐逼近最优值。自适应遗传算法通过改变不同适应度值下的交叉和变异几率,能提升计算效率并加快算法的收敛速度。
3.1 自适应遗传算法的实现步骤
(1)编码
编码是用一组有序数列来表征自变量,类似于基因来表征一个生物。只不过不同于自然界中的生物,自然界中大部分生物的基因是双链,而在算法计算中自变量的基因是单链,这样便于表征、杂交和变异。
编码按代码数制类型不同主要分为二进制编码和十进制编码,二进制编码格式整齐,易于理解;但十进制编码容易观察且不用数制转换,故本文采用十进制数编码。例如对于自变量x∈(a , b)(其中a , b为给定的自变量区间,且b > a),可将(b - a)分为( ≥2)份,每个数字用一个( ≥2)位数字序列表示,这个数字序列即为基因编码。
(2)解码
解码是运算过程中需要将基因反变换成自变量的实际大小进行处理而进行的编码还原,即基因乘以解码器即可将基因转化为实际数值。对于上例中的编码,解码器选择如下:
(3)交配(也叫交叉)
交配是基因之间以一定几率相互交叉而改变原来的序列。方法如下:
设初始种群中随机产生了两个基因分别为:
用轮盘法则随机确定一个1到之间的整数(1<<)作为交叉位数,然后交换该整数位以后的数字,交叉后的基因分别如下:

交配是遗传算法区别于其他算法的主要特征之一,交配效果也直接影响算法结果的有效性。交配概率太大会破坏种群现有结构,丢失优异个体;交配概率太小种群进化较慢,收敛速度慢,不易找到最优解。虽然传统的遗传算法根据大量实例给出一个经验值范围0.4-0.99,但显然任何一个固定的交配值都是不公平的。一个适应度大的个体应该尽可能地保留到下一代,而一个适应度小的个体应想法重复利用,否则在筛选中依然会被筛选掉,从而丢失一部分计算价值。所以基于此想法,研究人员提出了自适应交配方法,即根据适应度的大小自动调节交配几率,具体方法如下:
对于任意一代的种群中,优先算出该种群的平均适应度和最大适应度,通过-构建自适应指标。当判断任意个体时,计算该个体的适应度f后,通过公式

其中为该个体的自适应变异概率;一般令=1,即适应度小于平均值的个体直接交叉;初始时可取0.5,根据寻优结果另行调整。
其中为该个体的自适应交叉概率;一般令=1,即适应度小于平均值的个体直接交叉;初始时可取0.5,根据寻优结果另行调整。

(4)变异
变异类似于基因突变,即在个体交叉过程中或交叉后某个数字产生随机变化,这种变化类似于生物体的基因突变,因此叫变异。
变异性质跟交叉相似,是遗传算法另一个重要特征,而且对种群进化影响很大。变异概率太小时,种群多样性下降迅速,容易导致有效基因的迅速丢失且不易修补;当变异概率太大时,会增加种群多样性,但是对种群现有结构破坏较大。因此,选择合适的变异概率,可以增加遗传算法的有效性。

(5)选择
选择是遗传算法中的关键步骤,但不是遗传算法独有的,而是进化算法普遍都会用到的操作。其执行方式是将新一代种群和旧一代种群放在一起,根据适应度函数值的大小选择较优的那一半个体到下一代,旨在模拟自然界中适者生存的法则。
自适应遗传算法的程序框图如图1所示。
在这里插入图片描述

⛄二、部分源代码

%% 初始化
clear
close all
clc
warning off

%% 读取数据
input=xlsread(‘浙ADH2377-1053.xlsx’, ‘Sheet1’, ‘A2:F1053’);
output=xlsread(‘浙ADH2377-1053.xlsx’, ‘Sheet1’, ‘G2:H1053’);

%% 设置训练数据和预测数据
L=length(output); %总样本个数

%% 设置训练数据和预测数据
N=length(output); %总的样本数目
testNum=300; %设置测试样本个数
trainNum=N-testNum; %设置训练样本数目
disp([‘全体样本个数为:’,num2str(N)])
disp([‘训练样本个数为:’,num2str(trainNum)])
disp([‘测试样本个数为:’,num2str(testNum)])

%% 划分训练集、测试集
input_train = input(1:trainNum,:)‘;
output_train =output(1:trainNum,:)’;
input_test =input(trainNum+1:trainNum+testNum,:)‘;
output_test =output(trainNum+1:trainNum+testNum,:)’;

%输入输出数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
inputn_test=mapminmax(‘apply’,input_test,inputps);
[outputn,outputps]=mapminmax(output_train,0,1);
outputn_test=mapminmax(‘apply’,output_test,outputps);

%节点个数
inputnum=size(input_train,1);
outputnum=size(output_train,1);
disp(’ ‘)
disp(‘神经网络结构:’)
disp([‘输入层节点个数为:’,num2str(inputnum)])
disp([‘输出层节点个数为:’,num2str(outputnum)])
disp(’ ')
disp(‘隐含层节点的确定过程…’)

%确定隐含层节点个数
MSE=1e+5; %初始化最小误差
bound = [3:16];
mse0 = [];
i = 1;
for hiddennum=bound
rand(‘seed’, 1)
%构建网络
net=newff(inputn,outputn,hiddennum);
% 网络参数
net.trainParam.epochs=1000; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=0.000001; % 训练目标最小误差
net.trainParam.showWindow = 0;
% 网络训练
net=train(net,inputn,outputn);
an0=sim(net,inputn); %仿真结果
mse0(i)=norm(outputn-an0); %仿真的均方误差
disp([‘隐含层节点数为’,num2str(hiddennum),‘时,训练集的均方误差为:’,num2str(mse0(i))])

%更新最佳的隐含层节点
if mse0(i)<MSE
    MSE=mse0(i);
    hiddennum_best=hiddennum;
end
i = i + 1;

end
disp([‘最佳的隐含层节点数为:’,num2str(hiddennum_best),‘,相应的均方误差为:’,num2str(MSE)])
figure
plot(bound, mse0, ‘ks-’, ‘LineWidth’, 1.0)
xlabel(‘隐含层节点数目’)
ylabel(‘训练集均方误差’)
title(‘训练集均方误差和隐含层节点数目的关系’)

%% 构建最佳隐含层节点的BP神经网络
rng(‘default’)
rng(‘shuffle’)
net0=newff(inputn,outputn,hiddennum_best,{‘tansig’,‘purelin’},‘trainlm’);% 建立模型

%网络参数配置
net0.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net0.trainParam.lr=0.01; % 学习速率,这里设置为0.01
net0.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25; % 显示频率,这里设置为每训练25次显示一次
net0.trainParam.mc=0.01; % 动量因子
net0.trainParam.min_grad=1e-6; % 最小性能梯度
net0.trainParam.max_fail=6; % 最高失败次数

%开始训练
[net0, tr0]=train(net0,inputn,outputn);
load bp.mat
figure
h = plotperform(tr0);
set(h, ‘name’, ‘BP’)

an0=sim(net0,inputn); %用训练好的模型进行仿真
train_simu0=mapminmax(‘reverse’,an0,outputps); %把仿真得到的数据还原为原始的数量级
%预测
an0=sim(net0,inputn_test); %用训练好的模型进行仿真

%预测结果反归一化与误差计算
test_simu0=mapminmax(‘reverse’,an0,outputps); %把仿真得到的数据还原为原始的数量级

%% 优化算法的参数统一设定
%构建待优化的BP神经网络
net=newff(inputn,outputn,hiddennum_best,{‘tansig’,‘purelin’},‘trainlm’);% 建立模型
%网络参数配置
net.trainParam.epochs=50; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=0.001; % 训练目标最小误差
net.divideFcn = ‘’;
net.trainParam.showWindow=0; %隐藏仿真界面
maxgen=30; %最大迭代次数
popsize=10; %种群数量
dim=inputnumhiddennum_best+hiddennum_best+hiddennum_bestoutputnum+outputnum; %变量维度
lb=-3; %变量下界
ub=3; %变量上界
fobj=@(x)fitness(x,net,inputnum,hiddennum_best,outputnum,inputn,outputn,output_train,outputps);
global initpop
lb=lb.*ones(1,dim);
ub=ub.*ones(1,dim);
for i = 1 : popsize
initpop(i,:) = Code(dim,[lb;ub]');
end

%% 遗传算法寻最优权值阈值
disp(’ ')
[net1,tr1, best_score1,best_pos1,Convergence_curve1]=GAForBPREGRESSION(popsize,maxgen,lb,ub,dim,fobj,net,inputnum,hiddennum_best,outputnum,inputn,outputn);
load gabp.mat
figure
h = plotperform(tr1);
set(h, ‘name’, ‘GA-BP’)

%% 优化后的神经网络测试
an0=sim(net1,inputn); %用训练好的模型进行仿真
train_simu1=mapminmax(‘reverse’,an0,outputps); %把仿真得到的数据还原为原始的数量级
an1=sim(net1,inputn_test);
test_simu1=mapminmax(‘reverse’,an1,outputps); %把仿真得到的数据还原为原始的数量级

%% 标准的自适应遗传算法寻最优权值阈值
disp(’ ')
[net2, tr2, best_score2,best_pos2,Convergence_curve2]=AGAForBPREGRESSION(popsize,maxgen,lb,ub,dim,fobj,net,inputnum,hiddennum_best,outputnum,inputn,outputn);
load agabp.mat
figure
h = plotperform(tr2);
set(h, ‘name’, ‘AGA-BP’)

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]罗悦. 基于粒子滤波的锂离子电池剩余寿命预测方法研究[D]. 哈尔滨工业大学, 2012.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值