40行代码实现多目标遗传算法优化结构设计|多输出问题优化

2024-11-21 08:00   北京  

点击上方蓝字关注我们


01

算法用途


最近有陆陆续续有挺多同学和老师问怎么解决最优结构设计问题,相比于机器学习预测寻找最优的拟合模型,他们的问题主要是能找到最优的特征设计值。比如物理材料设计、药物设计、有限元仿真之类的,数据通过实验或者仿真获取是比较难获取的,只能得到有限条数据,想通过有限条数据去寻找最优的结构特征组合,实际上特征组合是有非常多的不可能一条一条试。

了解到类似的问题很多都发表在SCI1区文章上,有类似应用场景的同志们可以应用起来了!

那么对于这类问题,很显然首先需要拟合最优特征和输出之间的关系,经常要考虑多个设计指标,因此变成了多输出问题,然后综合多个输出目标进行输入特征寻优,设计到多目标优化的问题,乍一看有点复杂,其实还挺简单的!

我给大家找到了一个最简单实现的方式,代码不超过40行就能实现,类似问题都能直接套用,这次还录制了详细的B站教程!


02

实例分析


      那么这次的提供大家两个案例,第一个案例是有14个设计特征指标,对应三个评价输出系数,有两个特征指标要求是整数,其他特征指标都可以离散,14个特征可以有非常多组合,那么哪种是最优的组合呢?


第2个案例是12个特征,2个输出,根据以上数据变换而来,主要展示不同数据怎么套用



03

案例的实现


首先我们直接需要构建14输出,3输出的一个多输入多输出模型,这也是优化目标,可以大致拟合出在不同输入的情况下,输出的变化情况。那么我们能肯定的是,这个拟合模型的效果一定是误差最小越好,因为这个决定了我们后续优化的目标函数。
那这个多输入多输出问题,直接用我们的MT工具箱就能实现了,只需要5步就能实现(真的太秀了!)
第1步导入数据


第2步问题描述多输入多输出


 同时因为我们有3个输出,把预测点数设置为3,默认最后3列是我们的输出


     第3步选择一个预测方法,可以从50多种方法里面选择,这里我们选择RF随机森林,以随机森林为例子


   第4步开启优化方法,可以在30种智能优化算法里面选择一种,设置进化数和迭代次数,要获得好的拟合模型,优化函数不可少


第5步点击开始训练,等几分钟就训练完成了~,然后我们可以生成代码进一步修改把拟合模型做成可调用的目标函数形式


优化超参数和三个输出拟合结果就出来了,这时我们还可以更新绘图样式,可视化看一下效果~


接下来就是基于保存的代码和数据文件做调用函数了,我们保存的数据把模型和标准化参数都已经保存在数据结构体里面了,因此只要替换下保存的数据,就能实现不同数据的调用,对于不同数据的多输出随机森林模型,只要把load的数据改变一下就能实现模型调用了,注意默认优化的时候是优化多个输出的最小值,如果需要优化最大值,注意在相应输出的地方加入负号就行
function y_out_put=calcalate_mutiobj(test_x_feature_label)
load('MT_19_Nov_2024_20_19_57.mat')
x_mu=G_out_data.x_mu_all;x_sig=G_out_data.x_sig_all;y_mu_all=G_out_data.y_mu_all; %展示了多输出的个数y_sig_all=G_out_data.y_sig_all;y_last_result=[];

for NUM_all=1:length(y_mu_all)
test_x_feature_label_norm = (test_x_feature_label - x_mu) ./ x_sig; % 训练数据标准化 Mdl_all=G_out_data.model_all; Mdl=Mdl_all{1,NUM_all}; y_test_predict_norm=predict(Mdl,test_x_feature_label_norm); y_last_result(:,NUM_all)=y_test_predict_norm.*y_sig_all(NUM_all)+y_mu_all(NUM_all);
end y_out_put=y_last_result; %输出 %默认求最小% y_out_put(2)=-y_out_put(2); %第二个目标求最大,其他目标求最小的情况
% y_out_put=-y_out_put; %全部目标求最大的情况end

   优化目标做完后就直接写主函数,采用matlab自动的多目标遗传算法工具箱,调用非常简便,还能做整数约束,以下例子只限制了特征8、14是整数约束,其他约束都可以自己添加调用简单

clc;clear;close all;%14个特征对于3个输出%然后反推3个输出对应的最优特征rng default % For reproducibility
fun = @calcalate_mutiobj; %设置的函数
intcon = [8,14]; %第8个和第14个特征是整数
%14个特征的上限和下限lb = [253.430 0.010 252.43 1.62 2.46 2.25 -2.3 1 -62.52 0.64 -107.15 902.78 0 1];ub = [266.72 0.92 348.88 18.07 15.6 12.16 100.41 6 77.68 274.07 10.04 915.38 0.25 12];
options = optimoptions("gamultiobj","PlotFcn","gaplotpareto",... "PopulationSize",20,'MaxGenerations',50); %对应的是种群数和迭代次数
nvars = length(lb);A = []; %不等约束b = []; %不等约束Aeq = []; %等式约束beq = []; %等式约束nonlcon = []; %非线性约束[x,fval] = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,intcon,options);%x就是帕托拉前沿%%figurescatter3(fval(:,1),fval(:,2),fval(:,3))xlabel('objective1')ylabel('objective2')zlabel('objective3')%最后得到7个帕托拉前沿,进一步可以对7个解进行评价或者之类的,找到其中一个或者都可以用

最后求解到7个帕累托前沿解集合



那么第2个案例的实现就非常简单了~,目标函数换了一个名字,只把load('MT_19_Nov_2024_21_48_50.mat') 数据修改了,这个是把另一个数据案例用工具箱训练完导出代码保存的数据导入就行

我们也可以总结得到,只要导入工具箱保存的数据,对于任何多输入多输出的调用函数都能写成以下形式,只需要修改导入数据即可

function y_out_put=calcalate_mutiobj1(test_x_feature_label)
load('MT_19_Nov_2024_21_48_50.mat')
x_mu=G_out_data.x_mu_all;x_sig=G_out_data.x_sig_all;y_mu_all=G_out_data.y_mu_all; %展示了多输出的个数y_sig_all=G_out_data.y_sig_all;y_last_result=[];

for NUM_all=1:length(y_mu_all)
test_x_feature_label_norm = (test_x_feature_label - x_mu) ./ x_sig; % 训练数据标准化 Mdl_all=G_out_data.model_all; Mdl=Mdl_all{1,NUM_all}; y_test_predict_norm=predict(Mdl,test_x_feature_label_norm); y_last_result(:,NUM_all)=y_test_predict_norm.*y_sig_all(NUM_all)+y_mu_all(NUM_all);
end y_out_put=y_last_result; %输出 %默认求最小y_out_put(2)=-y_out_put(2); %第二个目标求最大,其他目标求最小的情况
% y_out_put=-y_out_put; %全部目标求最大的情况end
相应主函数修改模型上下限即可
clc;clear;close all;%12个特征对于2个输出%然后反推2个输出对应的最优特征rng default % For reproducibility
fun = @calcalate_mutiobj1; %设置的函数
intcon = [8]; %第8个和第14个特征是整数
%14个特征的上限和下限lb = [253.430 0.010 252.43 1.62 2.46 2.25 -2.3 1 -62.52 0.64 -107.15 902.78];ub = [266.72 0.92 348.88 18.07 15.6 12.16 100.41 6 77.68 274.07 10.04 915.38 ];
options = optimoptions("gamultiobj","PlotFcn","gaplotpareto",... "PopulationSize",20,'MaxGenerations',50); %对应的是种群数和迭代次数
nvars = length(lb);A = [];b = [];Aeq = [];beq = [];nonlcon = [];[x,fval] = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,intcon,options);%x就是帕托拉前沿%%figurescatter(fval(:,1),-fval(:,2))xlabel('objective1')ylabel('objective2')% zlabel('objective3')%最后得到7个帕托拉前沿,进一步可以对7个解进行评价或者之类的,找到其中一个或者都可以用

最后也能得到相应的帕累托前沿解集合



获取方式


AUGUST WEATHER

AUGUST WEATHER

  【数据源码获取】公众号后台回复【多目标优化】获取

B站视频教程】(不要忘记一键三连~)

【多目标遗传优化算法反推最优特征组合|改进粒子群算法优化多输出随机森林】 https://www.bilibili.com/video/BV14DSFYkEh8/?share_source=copy_web&vd_source=c15f0efc7ec302ed5ca56d22c46dffc7




    如果想要快速实现机器学习方法,强烈推荐我们的工具箱,一次购买永久使用免费更新,均价几十真的很划算,算法功能加倍,支持一键导出代码,已经有超多用户使用获奖、发论文






点击历史推文全面了解


 器工具箱重磅更新!百万算法一键搞定|轻松解决评价、降维、聚类、回归、分类、时序预测、多输入多输出、概率区间预测问题

Figure_youwant 2.0版本重磅发布!超强开源绘图工具箱,速来领取

     上万人使用的机器学习工具箱是什么样子的?最新版工具箱功能定版!


      评价、降维、聚类、回归、分类、单时序预测、多元时序预测、多输出多输出、回归概率预测、时序概率预测、都有多种优质方法,且都支持一键导出代码

评价工具箱pingjia


聚类降维工具箱DrCluster


分类回归概率预测工具箱RCpredict


单、多元时序/多输入多输出工具箱MTpredict


四个工具打包获取,一码通用只需要激活一次,所有工具箱都可以一键导出代码


【视频讲解】B站录制了使用详细的视频,可以扫码观看或者点击链接 https://www.bilibili.com/video/BV1a94y147Qf/

可以观看视频的1~26节

获取方式】扫码获取或者点击链接

https://mbd.pub/o/bread/mbd-ZJabmJ9q


更多开源资料可以看公众号主栏引导



END


长按二维码识别关注




更多竞赛、保研、科研学习资料领取或其他需求咨询可以联系我们~


往期精彩回顾

推荐 | Figure_youwant 2.0版本重磅发布!超强开源绘图工具箱,速来领取
推荐 | 神器工具箱重磅更新!百万算法一键搞定|轻松解决评价、降维、聚类、回归、分类、时序预测、多输入多输出、概率区间预测问题
推荐 | 一年发7篇SCI/EI论文的秘诀?  
推荐 |  单时序预测工具箱又又又更新了!
推荐 |  上万人使用的机器学习工具箱是什么样子的?最新版工具箱功能定版!
END

CAMPING

点个在看你最好看



Lvy的口袋
Lvy的学习记录和生活分享 主营MATLAB科研干货 公众号好玩的MATLAB的小号
 最新文章