✅作者简介热爱科研的Matlab仿真开发者擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 往期回顾关注个人主页Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条格物致知,完整Matlab代码获取及仿真咨询内容私信。 内容介绍一、背景一机器鱼研究的意义与发展机器鱼作为仿生机器人领域的重要研究对象具有广泛的应用前景。在海洋探测方面机器鱼能够模仿鱼类的游动方式灵活穿梭于复杂的海洋环境中执行水质监测、海洋生物观测等任务。在水下救援场景里它可以凭借良好的机动性快速到达目标地点为救援工作提供支持。然而机器鱼在运行过程中面临着能量供应有限的问题。由于水下环境的特殊性频繁更换电池或补充能源并不现实因此如何降低机器鱼的能量消耗延长其工作时间成为机器鱼研究领域的关键问题。二机器鱼运动相位与能量消耗的关系机器鱼的运动主要依靠身体的摆动或鳍的运动这些运动存在一定的相位关系。不同的运动相位组合会导致机器鱼产生不同的推进效率和能量消耗。例如合适的尾鳍摆动相位与身体波动相位配合可以使机器鱼在水中获得更大的推进力同时减少不必要的能量损耗。而不合理的相位设置可能导致机器鱼在游动过程中产生额外的阻力降低推进效率从而消耗更多的能量。因此寻找最优的机器鱼运动相位对于提高其能量利用效率至关重要。三传统优化方法的局限性传统的寻找机器鱼最优运动相位的方法如基于物理模型的数值计算和实验测试等存在一定的局限性。基于物理模型的数值计算方法需要对机器鱼的流体动力学特性进行精确建模但实际的机器鱼在水中的运动受到多种复杂因素的影响如水流的不确定性、鱼体变形等使得精确建模变得困难计算结果与实际情况可能存在较大偏差。实验测试方法虽然能够直接获取机器鱼在不同运动相位下的能量消耗数据但需要进行大量的实验耗时费力且难以全面覆盖所有可能的相位组合容易遗漏最优解。因此需要一种更高效、智能的方法来寻找最节省能量的机器鱼运动相位。二、原理一Q - Learning 算法基础强化学习框架Q - Learning 算法属于强化学习的范畴。强化学习旨在通过智能体与环境进行交互根据环境反馈的奖励信号不断调整自身的行为策略以最大化累积奖励。在这个过程中智能体通过尝试不同的动作观察环境状态的变化以及获得的奖励逐步学习到最优的行为策略。Q 值与 Q 表Q - Learning 算法引入了 Q 值的概念Q 值表示在某个状态下采取某个动作所能获得的长期累积奖励的期望。智能体通过维护一个 Q 表来存储不同状态 - 动作对的 Q 值。Q 表的行代表不同的状态列代表不同的动作表中的元素即为对应的 Q 值。在初始阶段Q 表中的 Q 值通常被初始化为一个较小的随机值或零。二基于 Q - Learning 算法寻找最优运动相位的实现状态定义将机器鱼的运动状态进行量化定义为 Q - Learning 算法中的状态。例如可以将机器鱼的当前位置、速度、身体姿态以及已经消耗的能量等信息组合成一个状态向量。不同的运动相位组合会使机器鱼处于不同的状态通过对状态的准确描述算法能够区分不同运动相位下机器鱼的运行情况。动作定义把机器鱼可能采取的不同运动相位组合定义为算法中的动作。这些动作会改变机器鱼的运动状态进而影响其能量消耗和推进效果。例如改变尾鳍摆动的频率、幅度以及与身体摆动的相位差等都可以作为不同的动作。奖励设计设计合理的奖励函数是 Q - Learning 算法的关键。对于寻找最节省能量的机器鱼运动相位问题奖励函数应与机器鱼的能量消耗和推进效果相关。例如当机器鱼在某个运动相位下消耗较少能量且能够保持或提高推进速度时给予较高的奖励反之若能量消耗过大或推进速度下降则给予较低的奖励。通过这样的奖励机制引导算法朝着寻找最节省能量的运动相位方向进行学习。三算法学习过程探索与利用在算法的学习初期智能体即机器鱼的运动相位选择模型需要通过探索不同的动作来了解环境机器鱼的运动状态与能量消耗关系。这意味着它会随机选择一些动作来尝试即使这些动作可能不是当前看起来最优的。随着学习的进行智能体逐渐开始利用已经学习到的知识更多地选择那些具有较高 Q 值的动作即更有可能节省能量的运动相位组合。这个过程通过一个探索率参数如 ε - greedy 策略中的 ε来控制ε 在学习过程中逐渐减小使得智能体从以探索为主逐渐转变为以利用为主。Q 值更新每当智能体执行一个动作并观察到新的状态和奖励后会根据 Q - Learning 算法的更新公式来更新 Q 表中的 Q 值。更新公式为Q(s,a)←Q(s,a)α[R(s,a)γmaxa′Q(s′,a′)−Q(s,a)]其中Q(s,a)是当前状态s下执行动作a的 Q 值α是学习率控制每次更新的步长R(s,a)是在状态s下执行动作a获得的奖励γ是折扣因子反映了对未来奖励的重视程度s′是执行动作a后进入的新状态maxa′Q(s′,a′)是新状态s′下所有可能动作中的最大 Q 值。通过不断地执行动作、观察奖励并更新 Q 值Q 表逐渐收敛使得智能体能够找到最优的运动相位策略即最节省能量的机器鱼运动相位组合。文章逻辑梳理先阐述机器鱼研究意义及能量消耗问题点明运动相位与能量消耗的关系指出传统优化⛳️ 运行结果 部分代码%% Format Presetclose allclcclear%set(0,DefaultTextFontName,Times New Roman);set(0,defaultlinelinewidth,2)set(0,defaultaxeslinewidth,2);set(0,defaultaxesfontsize,16);set(0,defaulttextfontsize,16);set(0,DefaultLineMarkerSize,7);set(0,defaulttextinterpreter,latex)%% Load Data% load(Q_learn_Results.mat);% RL_Data Data.All_Cost;% load(Radom_Results.mat)% Random_Data Data.All_Cost;%%%%%%%%% 10 Envieronment %%%%%%%load(Q_learn_Results_10Evn.mat);RL_Data Data.All_Cost;RL_Follower_Phase [Data.Phase_Follower(end,:),Data.Phase_Follower(end,end)];RL_Phase_Leader [Data.Phase_Leader,Data.Phase_Leader(end)];load(Radom_Results_10Evn.mat)Random_Data Data.All_Cost;Random_Follower_Phase [Data.Phase_Follower(end,:),Data.Phase_Follower(end,end)];Random_Phase_Leader [Data.Phase_Leader,Data.Phase_Leader(end)];%% 绘制图CouzinColor[235 45 46;241 161 43;0 170 79;0 174 239;35 31 32]/255;TV 20; %字体12LW 2 ; % Linewidthnf 1; %%%%设定figure的值% PlotValue figure(Name,MaxPowerCost,NumberTitle,off);hf(nf) figure(nf);set(hf(nf),Name,RL—Results,NumberTitle,off); %%%%设定值Col 1; %%%%设定值几列图片Row 2; %%%%设定值几行图片figure_num Col*Row; %作图个数space_bottom0.1; % 底部间距 %%%%设定值space_top0.04;%顶部间距 %%%%设定值space_left0.15;%左间距 %%%%设定值space_right0.05;%右间距 %%%%设定值space_UD0.05;%图片上下间距 %%%%设定值space_LR 0.09; % 图片左右间距 %%%%设定值space_legend0 ; %图和标注之间的距离设置 %%%%设定值FigHigh(1-space_top-space_bottom-(Row-1)*space_UD)/Row; %%%%设定值FigWidth(1-space_left-space_right-space_legend-space_LR*(Col-1))/Col; %设置图片的 %%%%设定值WidthSubFig 6 ; % 子图宽度为5 %%%%设定值HighSubFig 0.9*WidthSubFig; %%%%设定值set(hf(nf),Units, centimeters,Position,[55.4872 6.2653 18.8172 18.4563], WindowStyle,normal )% set(hf(nf),Units, centimeters,Position,[2064 67 924 916])StrLS{^,s,d,p}; % 设定绘制曲线的symbolsStrLegend {Power Cost of Left Robotic Fish, ...Power Cost of Right Robotic Fish, ...Swimming Speed of Schooling fish,...Swimming Speed of alone fish}; % 设定 Legend 的字符% LocaLegend [0.58 0.926453690834256 0.197974905237045 0.053981279662739;% 0.58 0.703780922617089 0.220472053772767 0.053981279662739;% 0.58 0.487181041873621 0.289088356806719 0.053981279662739;% 0.58 0.260459671344211 0.289088356806719 0.053981279662739];% TextPosition [ 2.35,4.0;% 4.7, 0.036;% 2.35,9;% 4.7,0.36;% 2.35,9;% 4.75,0.36;% 2.35,9;% 4.7,0.36];f 1 ;% 绘制s(f) subplot(Position,[space_left(FigWidthspace_LR)*(rem(f-1,Col)),space_bottom(Row-ceil(f/Col))*(FigHighspace_UD),FigWidth,FigHigh]);% shadedErrorBar(PD,MeanPowerLeft,StdPowerLeft,{linewidth,1.2,Color,CouzinColor(1,:)},1)plot (RL_Data,linewidth,LW,Color,CouzinColor(1,:))% hold on% shadedErrorBar(PD,MeanPowerRight,StdPowerRight,{linewidth,1.2,Color,CouzinColor(3,:)},1)% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);set(gca,XTickLabel,{},FontSize,TV);box off;ylabel(Average energy cost [W],FontSize,TV,Rotation,90);legend(Fin sensory feedback)legend boxofff 2;s(f) subplot(Position,[space_left(FigWidthspace_LR)*(rem(f-1,Col)),space_bottom(Row-ceil(f/Col))*(FigHighspace_UD),FigWidth,FigHigh]);plot(Random_Data,linewidth,LW,Color,CouzinColor(2,:))% shadedErrorBar(PD,MeanSpeed, StdSpeed,{linewidth,LW,Color,CouzinColor(4,:)},1);% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);% shadedErrorBar(iPD,iMeanSpeed, iStdSpeed,{linewidth,1.2,Color,CouzinColor(1,:)},1);% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);% set(gca,XTickLabel,{},FontSize,TV);set(gca,FontSize,TV);box off;ylabel(Average energy cost [W],FontSize,TV,Rotation,90);legend(No feedback)legend boxoffxlabel(Episode,FontSize,TV)set(gcf,paperposition,get(gcf,position))% print(gcf,RL_Random_4paper_100Evn, -dpng, -r300)%%% close allTV 20; %字体12LW 2 ; % Linewidthnf 2; %%%%设定figure的值% PlotValue figure(Name,MaxPowerCost,NumberTitle,off);hf(nf) figure(nf);set(hf(nf),Name,RL—Results,NumberTitle,off); %%%%设定值Col 1; %%%%设定值几列图片Row 4; %%%%设定值几行图片figure_num Col*Row; %作图个数space_bottom0.1; % 底部间距 %%%%设定值space_top0.04;%顶部间距 %%%%设定值space_left0.15;%左间距 %%%%设定值space_right0.05;%右间距 %%%%设定值space_UD0.05;%图片上下间距 %%%%设定值space_LR 0.09; % 图片左右间距 %%%%设定值space_legend0 ; %图和标注之间的距离设置 %%%%设定值FigHigh(1-space_top-space_bottom-(Row-1)*space_UD)/Row; %%%%设定值FigWidth(1-space_left-space_right-space_legend-space_LR*(Col-1))/Col; %设置图片的 %%%%设定值WidthSubFig 18 ; % 子图宽度为5 %%%%设定值HighSubFig 0.3*WidthSubFig; %%%%设定值set(hf(nf),Units, centimeters,Position,[55.4872 6.2653 WidthSubFig*Col HighSubFig*Row], WindowStyle,normal )% set(hf(nf),Units, centimeters,Position,[2064 67 924 916])StrLS{^,s,d,p}; % 设定绘制曲线的symbolsStrLegend {Power Cost of Left Robotic Fish, ...Power Cost of Right Robotic Fish, ...Swimming Speed of Schooling fish,...Swimming Speed of alone fish}; % 设定 Legend 的字符% LocaLegend [0.58 0.926453690834256 0.197974905237045 0.053981279662739;% 0.58 0.703780922617089 0.220472053772767 0.053981279662739;% 0.58 0.487181041873621 0.289088356806719 0.053981279662739;% 0.58 0.260459671344211 0.289088356806719 0.053981279662739];% TextPosition [ 2.35,4.0;% 4.7, 0.036;% 2.35,9;% 4.7,0.36;% 2.35,9;% 4.75,0.36;% 2.35,9;% 4.7,0.36];t 0:10;f 1 ;% 绘制s(f) subplot(Position,[space_left(FigWidthspace_LR)*(rem(f-1,Col)),space_bottom(Row-ceil(f/Col))*(FigHighspace_UD),FigWidth,FigHigh]);% shadedErrorBar(PD,MeanPowerLeft,StdPowerLeft,{linewidth,1.2,Color,CouzinColor(1,:)},1)stairs (t,RL_Phase_Leader,linewidth,LW,Color,CouzinColor(f,:))% hold on% shadedErrorBar(PD,MeanPowerRight,StdPowerRight,{linewidth,1.2,Color,CouzinColor(3,:)},1)% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);set(gca,XTickLabel,{},FontSize,TV);set(gca,YTickLabel,{0,\pi,2\pi},...YTick,[0 5 10]);box off;ylabel($\Psi_{Leader}$,FontSize,TV,Rotation,90);hl(f)legend(Turbulent environments);set(hl(f),position,[0.4134 0.7855 0.4549 0.0376]);legend boxoffaxis([0,10,0,10])ht text(0.2,8,(a),FontSize,TV,FontWeight,bold);f 2 ;% 绘制s(f) subplot(Position,[space_left(FigWidthspace_LR)*(rem(f-1,Col)),space_bottom(Row-ceil(f/Col))*(FigHighspace_UD),FigWidth,FigHigh]);% shadedErrorBar(PD,MeanPowerLeft,StdPowerLeft,{linewidth,1.2,Color,CouzinColor(1,:)},1)stairs (t,RL_Follower_Phase,linewidth,LW,Color,CouzinColor(f,:))% hold on% shadedErrorBar(PD,MeanPowerRight,StdPowerRight,{linewidth,1.2,Color,CouzinColor(3,:)},1)% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);set(gca,XTickLabel,{},FontSize,TV);set(gca,YTickLabel,{0,\pi,2\pi},...YTick,[0 5 10]);box off;ylabel($\Psi_{Follower}$,FontSize,TV,Rotation,90);hl(f)legend(Fin sensory feedback);set(hl(f),position,[ 0.3919 0.5569 0.4196 0.0376]);legend boxoffaxis([0,10,0,10])ht text(0.2,9,(b),FontSize,TV,FontWeight,bold);f 3;s(f) subplot(Position,[space_left(FigWidthspace_LR)*(rem(f-1,Col)),space_bottom(Row-ceil(f/Col))*(FigHighspace_UD),FigWidth,FigHigh]);stairs(t,Random_Phase_Leader,linewidth,LW,Color,CouzinColor(f,:))% shadedErrorBar(PD,MeanSpeed, StdSpeed,{linewidth,LW,Color,CouzinColor(4,:)},1);% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);% shadedErrorBar(iPD,iMeanSpeed, iStdSpeed,{linewidth,1.2,Color,CouzinColor(1,:)},1);% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);% set(gca,XTickLabel,{},FontSize,TV);set(gca,XTickLabel,{},FontSize,TV);set(gca,YTickLabel,{0,\pi,2\pi},...YTick,[0 5 10]);box off;ylabel($\Psi_{Leader}$,FontSize,TV,Rotation,90);hl(f)legend(Turbulent environments);set(hl(f),position,[0.3996 0.4705 0.4549 0.0376]);legend boxoff% xlabel(Episode,FontSize,TV)axis([0,10,0,10])ht text(0.2,9,(c),FontSize,TV,FontWeight,bold);f 4;s(f) subplot(Position,[space_left(FigWidthspace_LR)*(rem(f-1,Col)),space_bottom(Row-ceil(f/Col))*(FigHighspace_UD),FigWidth,FigHigh]);stairs(t,Random_Follower_Phase,linewidth,LW,Color,CouzinColor(f,:))% shadedErrorBar(PD,MeanSpeed, StdSpeed,{linewidth,LW,Color,CouzinColor(4,:)},1);% set(gca,XTickLabel,{0,1/4\pi,1/2\pi,3/4\pi,\pi,5/4\pi,3/2\pi,7/4\pi,2\pi},...% XTick,[1 2 3 4 5 6 7 8 9]);% shadedErrorBar(iPD,iMeanSpeed, iStdSpeed,{linewidth,1.2,Color,CouzinColor(1,:)},1);set(gca,XTickLabel,{0,2T,4T,6T,8T,10T},...XTick,[0 2 4 6 8 10]);set(gca,YTickLabel,{0,\pi,2\pi},...YTick,[0 5 10]);% set(gca,XTickLabel,{},FontSize,TV);set(gca,FontSize,TV);box off;ylabel($\Psi_{Follower}$,FontSize,TV,Rotation,90);hl(f)legend(No feedback);set(hl(f),position,[0.4175 0.2434 0.2822 0.0376]);legend boxoffxlabel(Time [s],FontSize,TV)set(gcf,paperposition,get(gcf,position))axis([0,10,0,10])ht text(0.2,8,(d),FontSize,TV,FontWeight,bold);% print(gcf,RL_Random_4paper_PD, -dpng, -r300) 参考文献[1]赵志杰.基于数值模拟的水下仿生推进建模及性能分析研究[D].南京理工大学,2020.更多创新智能优化算法模型和应用场景可扫描关注机器学习/深度学习类BP、SVM、RVM、DBN、LSSVM、ELM、KELM、HKELM、DELM、RELM、DHKELM、RF、SAE、LSTM、BiLSTM、GRU、BiGRU、PNN、CNN、XGBoost、LightGBM、TCN、BiTCN、ESN、Transformer、模糊小波神经网络、宽度学习等等均可~方向涵盖风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、用电量预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断组合预测类CNN/TCN/BiTCN/DBN/Transformer/Adaboost结合SVM、RVM、ELM、LSTM、BiLSTM、GRU、BiGRU、Attention机制类等均可可任意搭配非常新颖~分解类EMD、EEMD、VMD、REMD、FEEMD、TVFEMD、CEEMDAN、ICEEMDAN、SVMD、FMD、JMD等分解模型均可~路径规划类旅行商问题TSP、车辆路径问题VRP、MVRP、CVRP、VRPTW等、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、 充电车辆路径规划EVRP、 双层车辆路径规划2E-VRP、 油电混合车辆路径规划、 船舶航迹规划、 全路径规划规划、 仓储巡逻、公交车时间调度、水库调度优化、多式联运优化等等~小众优化类生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱调度、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划2E-VRP、充电车辆路径规划EVRP、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题、港口调度、港口岸桥调度、停机位分配、机场航班调度、泄漏源定位、冷链、时间窗、多车场等、选址优化、港口岸桥调度优化、交通阻抗、重分配、停机位分配、机场航班调度、通信上传下载分配优化、微电网优化、无功优化、配电网重构、储能配置、有序充电、MPPT优化、家庭用电、电/冷/热负荷预测、电力设备故障诊断、电池管理系统BMSSOC/SOH估算粒子滤波/卡尔曼滤波、 多目标优化在电力系统调度中的应用、光伏MPPT控制算法改进扰动观察法/电导增量法、电动汽车充放电优化、微电网日前日内优化、储能优化、家庭用电优化、供应链优化\智能电网分布式能源经济优化调度虚拟电厂能源消纳风光出力控制策略多目标优化博弈能源调度鲁棒优化等等均可~ 无人机应用方面无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化、车辆协同无人机路径规划通信方面传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化、水声通信、通信上传下载分配信号处理方面信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化、心电信号、DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理传输分析去噪、数字信号调制、误码率、信号估计、DTMF、信号检测电力系统方面微电网优化、无功优化、配电网重构、储能配置、有序充电、MPPT优化、家庭用电、电/冷/热负荷预测、电力设备故障诊断、电池管理系统BMSSOC/SOH估算粒子滤波/卡尔曼滤波、 多目标优化在电力系统调度中的应用、光伏MPPT控制算法改进扰动观察法/电导增量法、电动汽车充放电优化、微电网日前日内优化、储能优化、家庭用电优化、供应链优化\智能电网分布式能源经济优化调度虚拟电厂能源消纳风光出力控制策略多目标优化博弈能源调度鲁棒优化原创改进优化算法适合需要创新的同学原创改进2025年的波动光学优化算法WOO以及三国优化算法TKOA、白鲸优化算法BWO等任意优化算法均可保证测试函数效果一般可直接核心