CPO-BP+MOPSO,冠豪猪优化BP神经网络+多目标粒子群算法!(Matlab源码)
目录
- 效果一览
- 基本介绍
- 程序设计
- 参考资料
效果一览
基本介绍
1.CPO-BP+NSGA,冠豪猪优化BP神经网络+粒子群算法!(Matlab完整源码和数据),冠豪猪算法优化BP神经网络的权值和阈值,运行环境Matlab2020b及以上。
多目标优化是指在优化问题中同时考虑多个目标的优化过程。在多目标优化中,通常存在多个冲突的目标,即改善一个目标可能会导致另一个目标的恶化。因此,多目标优化的目标是找到一组解,这组解在多个目标下都是最优的,而不是仅仅优化单一目标。冠豪猪优化算法(Crested Porcupine Optimizer, CPO)是一种新型的元启发式算法,由Abdel-Basset等人于2024年提出。该算法模拟了冠豪猪的防御行为,包括视觉、声音、气味和物理攻击四种策略,用于解决复杂的优化问题。
2.先通过CPO-BP封装因变量(稳态下的效率、压缩机经济成本 )与自变量(转速、余隙容积全关、用户排气量、冷却水流量)代理模型,再通过MOPSO寻找极值(稳态下的效率极大;压缩机经济成本极小),并给出对应的转速、余隙容积全关、用户排气量、冷却水流量Pareto解集。
3.data为数据集,4个输入特征,2个输出变量,NSGA算法寻极值,求出极值时(max y1; min y2)的自变量x1,x2,x3,x4。
4.main1.m为CPO-BP神经网络主程序文件、main2.m为MOPSO多目标优化算法主程序文件,依次运行即可,其余为函数文件,无需运行。
5.命令窗口输出MAE、MAPE、MSE、RMSE等评价指标,输出预测对比图、误差分析图、多目标优化算法求解Pareto解集图,可在下载区获取数据和程序内容。
6.适合工艺参数优化、工程设计优化等最优特征组合领域。
代码功能概述
main1_CPOBPvBP.m
核心功能
使用冠豪猪优化算法(CPO)优化BP神经网络的初始权值和阈值。
训练优化后的CPO-BP神经网络,并与传统BP网络对比预测性能。
预测压缩机性能指标(效率、成本)并可视化结果。
算法步骤
a. 数据预处理
读取数据集(数据集.xlsx),划分训练集(300样本)和测试集。
输入特征(4列)和输出目标(2列)归一化到[0,1]区间。
b. BP网络构建
结构:输入层(4节点)、隐层(2*4+1=9节点,logsig)、输出层(2节点,purelin)。
训练算法:Levenberg-Marquardt(trainlm)。
c. CPO优化BP参数
优化目标:最小化网络预测误差。
优化变量:所有权值+阈值(维度=65)。
d. 训练与预测
用CPO优化后的参数初始化网络,训练100次。
预测测试集并反归一化得到实际值。
e. 对比实验
训练传统BP网络(相同结构),对比预测误差。
f. 结果分析
绘制真实值、预测值及误差对比图。
计算MAE、MSE、RMSE、MAPE等误差指标。
关键参数
CPO:种群大小=10,迭代次数=10,变量范围=[-3,3]。
BP:最大训练次数=1000,学习率=0.1,目标误差=0.00001。
模型原理
CPO算法:模拟冠豪猪防御行为(翻滚、逃离、跟随)的启发式算法,通过种群协作搜索全局最优解。
BP神经网络:前馈网络通过误差反向传播调整权值,CPO优化解决其易陷入局部最优的问题。
main2_MOPSO.m
核心功能
使用多目标粒子群算法(MOPSO)优化压缩机设计参数。
寻找同时最大化效率和最小化成本的帕累托最优解集。
算法步骤
a. 目标函数定义
效率目标:XL = CPOBP_slover_XL(x1,x2,x3,x4)(最大化,取负)。
成本目标:CB = CPOBP_slover_CB(x1,x2,x3,x4)(最小化)。
b. MOPSO参数设置
变量:转速、余隙容积、排气量、水流量(4维)。
范围:转速∈[510,720],余隙容积∈[0.125,1]等。
c. MOPSO运行
初始化粒子群(10个粒子),迭代50次。
更新粒子位置/速度,维护外部存档(100个帕累托解)。
d. 结果分析
绘制帕累托前沿(效率vs成本)。
计算Spacing指标评估解集分布均匀性。
输出最优解参数(如转速、余隙容积)。
关键参数
种群大小=10,存档大小=100,迭代次数=50。
变量范围:见步骤2b。
模型原理
粒子位置更新:v_i = wv_i + c1r1*(pbest_i - x_i) + c2r2(gbest - x_i)。
非支配排序筛选帕累托解,存档机制保留最优解集。
MOPSO算法:扩展粒子群算法(PSO)至多目标优化:
目标函数模型:基于main1训练的CPO-BP网络预测压缩机性能。
两段代码的联系
依赖关系
main2中的目标函数CPOBP_slover_XL/CB调用main1训练的CPO-BP模型预测压缩机性能。
main1提供优化后的神经网络,main2将其用于多目标优化。
整体流程
数据集
程序设计
- 完整程序和数据获取方式:私信博主回复CPO-BP+MOPSO,冠豪猪优化BP神经网络+多目标粒子群算法!(Matlab完整源码和数据)。
.rtcContent { padding: 30px; } .lineNode {font-size: 10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }
nVar = 4; % 优化变量个数(4个设计变量)
VarMin = [510,0.125,0.0118,2.7]; % 变量下限:[转速, 余隙容积, 用户排气量, 水流量]
VarMax = [720,1,0.044,3.9]; % 变量上限
name = 'MOPSO多目标寻优'; % 问题名称(用于结果展示)
dynamic = 0; % 动态优化标志(0表示静态优化)
numOfObj = 2; % 目标函数个数(2个目标:效率、成本)
%% 配置多目标问题结构体
MultiObj.nVar = nVar; % 变量维度
MultiObj.var_min = VarMin; % 变量下限
MultiObj.var_max = VarMax; % 变量上限
MultiObj.fun = CostFunction; % 目标函数句柄
MultiObj.dynamic = dynamic; % 动态优化标志
MultiObj.numOfObj = numOfObj; % 目标函数个数
MultiObj.name = name; % 问题名称
MultiObjFnc = MultiObj.name; % 用于标题显示的字符串
%% MOPSO算法参数设置
params.Np = 10; % 种群大小(粒子数量)
params.Nr = 100; % 外部存档大小(存储帕累托最优解的最大数量)
params.maxgen = 50; % 最大迭代次数(代数较少,实际应用需增加)
%% 运行MOPSO算法
[REP, POS_fit] = MOPSO(params, MultiObj); % 调用MOPSO函数,返回存档解集和粒子适应度params.C1 = 2; % 个体学习因子:粒子向自身历史最优位置移动的权重params.C2 = 2; % 社会学习因子:粒子向群体最优位置移动的权重params.ngrid = 20; % 网格划分数量:用于存档解集的空间划分params.maxvel = 5; % 最大速度百分比:速度限制为变量范围的5%params.u_mut = 0.5; % 均匀变异比例:种群中部分粒子进行随机重置的比例%% 提取参数和问题定义Np = params.Np; % 种群大小(粒子数量)Nr = params.Nr; % 外部存档最大容量(帕累托解数量)maxgen = params.maxgen; % 最大迭代次数W = params.W; % 惯性权重C1 = params.C1; % 个体学习因子C2 = params.C2; % 社会学习因子ngrid = params.ngrid; % 网格划分数maxvel = params.maxvel; % 最大速度限制(百分比)u_mut = params.u_mut; % 均匀变异比例fun = MultiObj.fun; % 目标函数句柄(需最小化)nVar = MultiObj.nVar; % 变量维度(设计变量数量)var_min = MultiObj.var_min(:); % 变量下限(列向量)var_max = MultiObj.var_max(:); % 变量上限(列向量)%% --------------------- 种群初始化 ---------------------% 生成初始粒子位置:在变量范围内随机分布POS = repmat((var_max-var_min)', Np, 1) .* rand(Np, nVar) + repmat(var_min', Np, 1);VEL = zeros(Np, nVar); % 初始速度设为0% 计算初始种群的适应度(目标函数值)for i = 1:NpPOS_fit(i,:) = fun(POS(i,:)); % 每个粒子的目标函数值存储为行向量end% 检查目标函数返回值是否与粒子数量一致(避免函数编写错误)if size(POS,1) ~= size(POS_fit,1)warning('目标函数返回的适应度数量与粒子数不匹配,请检查函数实现');end%% --------------------- 存档和个体历史最优初始化 ---------------------PBEST = POS; % 个体历史最优位置初始化为当前位置PBEST_fit = POS_fit; % 个体历史最优适应度% 检查支配关系:标记被其他粒子支配的个体(1表示被支配,0表示非支配)DOMINATED = checkDomination(POS_fit);REP.pos = POS(~DOMINATED,:); % 初始存档:存储所有非支配解REP.pos_fit = POS_fit(~DOMINATED,:); % 存档对应的适应度REP = updateGrid(REP, ngrid); % 初始化网格划分(用于存档管理)% 计算实际最大速度:将百分比转换为变量范围的绝对数值maxvel = (var_max - var_min) .* maxvel ./ 100;gen = 1;%% --------------------- 可视化初始化 ---------------------h_fig = figure; % 创建图形窗口h_par = plot(POS_fit(:,1), POS_fit(:,2), 'or'); % 红色圆圈表示当前种群hold on;h_rep = plot(REP.pos_fit(:,1), REP.pos_fit(:,2), 'ok'); % 黑色圆圈表示存档解xlabel('f1'); ylabel('f2'); % 坐标轴标签(目标函数名称)title('MOPSO迭代过程');display(['初始代数 #0 - 存档大小: ' num2str(size(REP.pos,1))]);%% --------------------- 主循环 ---------------------stopCondition = false; % 终止条件标志while ~stopCondition%% 选择领导者:基于网格的轮盘赌选择h = selectLeader(REP); % 从存档中选择一个领导者索引%% 更新粒子速度和位置VEL = W .* VEL + ... % 惯性项C1 * rand(Np, nVar) .* (PBEST - POS) + ... % 个体历史最优引导C2 * rand(Np, nVar) .* (repmat(REP.pos(h,:), Np, 1) - POS); % 群体最优引导POS = POS + VEL; % 更新位置%% 变异操作:增加多样性POS = mutation(POS, gen, maxgen, Np, var_max, var_min, nVar, u_mut);%% 边界检查:确保位置和速度在允许范围内[POS, VEL] = checkBoundaries(POS, VEL, maxvel, var_max, var_min);%% 计算新种群的适应度for i = 1:NpPOS_fit(i,:) = fun(POS(i,:));end%% 更新存档REP = updateRepository(REP, POS, POS_fit, ngrid); % 合并新非支配解if size(REP.pos,1) > NrREP = deleteFromRepository(REP, size(REP.pos,1)-Nr, ngrid); % 删除多余解end%% 更新个体历史最优% 比较新位置与历史最优的支配关系pos_best = dominates(POS_fit, PBEST_fit); % 新位置是否优于历史最优best_pos = ~dominates(PBEST_fit, POS_fit); % 历史最优是否不支配新位置best_pos(rand(Np,1) >= 0.5) = 0; % 随机保留部分历史最优(增加多样性)% 更新被新位置支配的历史最优if sum(pos_best) > 1PBEST_fit(pos_best,:) = POS_fit(pos_best,:);PBEST(pos_best,:) = POS(pos_best,:);end% 更新未被历史最优支配的新位置if sum(best_pos) > 1PBEST_fit(best_pos,:) = POS_fit(best_pos,:);PBEST(best_pos,:) = POS(best_pos,:);end%% --------------------- 可视化更新 ---------------------% 2D目标空间绘图if size(POS_fit,2) == 2figure(h_fig);delete(h_par); delete(h_rep); % 清除旧图形h_par = plot(POS_fit(:,1), POS_fit(:,2), 'or'); % 红色:当前种群hold on;h_rep = plot(REP.pos_fit(:,1), REP.pos_fit(:,2), 'ok'); % 黑色:存档解try % 调整坐标轴以匹配网格划分set(gca, 'xtick', REP.hypercube_limits(:,1)', 'ytick', REP.hypercube_limits(:,2)');axis([min(REP.hypercube_limits(:,1)), max(REP.hypercube_limits(:,1)), ...min(REP.hypercube_limits(:,2)), max(REP.hypercube_limits(:,2))]);endgrid on; drawnow; axis square;end% 3D目标空间绘图(若目标数为3)if size(POS_fit,2) == 3figure(h_fig);delete(h_par); delete(h_rep);h_par = plot3(POS_fit(:,1), POS_fit(:,2), POS_fit(:,3), 'or');hold on;h_rep = plot3(REP.pos_fit(:,1), REP.pos_fit(:,2), REP.pos_fit(:,3), 'ok');% 调整3D坐标轴tryset(gca, 'xtick', REP.hypercube_limits(:,1)', 'ytick', REP.hypercube_limits(:,2)', ...'ztick', REP.hypercube_limits(:,3)');axis([min(REP.hypercube_limits(:,1)), max(REP.hypercube_limits(:,1)), ...min(REP.hypercube_limits(:,2)), max(REP.hypercube_limits(:,2)), ...min(REP.hypercube_limits(:,3)), max(REP.hypercube_limits(:,3))]);endgrid on; xlabel('f1'); ylabel('f2'); zlabel('f3');drawnow; axis square;end%% 显示迭代信息display(['代数 #' num2str(gen) ' - 存档大小: ' num2str(size(REP.pos,1))]);%% 终止条件检查gen = gen + 1;if gen > maxgenstopCondition = true; % 达到最大迭代次数,终止循环endendhold off;
参考资料
GRU门控循环单元+NSGAII多目标优化算法,深度学习工艺参数优化+酷炫相关性气泡图!(Matlab完整源码和数据)
LSTM+NSGAII多目标优化算法,酷炫相关性气泡图!(Matlab完整源码和数据)
NRBO-CNN+NSGAII+熵权TOPSIS,附相关气泡图,Matlab代码!
深度学习工艺参数优化+酷炫相关性气泡图!CNN卷积神经网络+NSGAII多目标优化算法(Matlab完整源码)
工艺参数优化、工程设计优化!GRNN神经网络+NSGAII多目标优化算法(Matlab)
工艺参数优化、工程设计优化陪您跨年!RBF神经网络+NSGAII多目标优化算法(Matlab)
工艺参数优化、工程设计优化来袭!BP神经网络+NSGAII多目标优化算法(Matlab)
北大核心工艺参数优化!SAO-BP雪融算法优化BP神经网络+NSGAII多目标优化算法(Matlab)
工艺参数优化、工程设计优化上新!Elman循环神经网络+NSGAII多目标优化算法(Matlab)
强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!