news 2026/4/25 0:02:41

【优化求解】基于QLearning算法找到最节省能量的机器鱼运动相位附Matlab代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【优化求解】基于QLearning算法找到最节省能量的机器鱼运动相位附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。

🍎 往期回顾关注个人主页:Matlab科研工作室

👇 关注我领取海量matlab电子书和数学建模资料

🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。

🔥 内容介绍

一、背景

(一)机器鱼研究的意义与发展

机器鱼作为仿生机器人领域的重要研究对象,具有广泛的应用前景。在海洋探测方面,机器鱼能够模仿鱼类的游动方式,灵活穿梭于复杂的海洋环境中,执行水质监测、海洋生物观测等任务。在水下救援场景里,它可以凭借良好的机动性,快速到达目标地点,为救援工作提供支持。然而,机器鱼在运行过程中面临着能量供应有限的问题。由于水下环境的特殊性,频繁更换电池或补充能源并不现实,因此如何降低机器鱼的能量消耗,延长其工作时间,成为机器鱼研究领域的关键问题。

(二)机器鱼运动相位与能量消耗的关系

机器鱼的运动主要依靠身体的摆动或鳍的运动,这些运动存在一定的相位关系。不同的运动相位组合会导致机器鱼产生不同的推进效率和能量消耗。例如,合适的尾鳍摆动相位与身体波动相位配合,可以使机器鱼在水中获得更大的推进力,同时减少不必要的能量损耗。而不合理的相位设置可能导致机器鱼在游动过程中产生额外的阻力,降低推进效率,从而消耗更多的能量。因此,寻找最优的机器鱼运动相位,对于提高其能量利用效率至关重要。

(三)传统优化方法的局限性

传统的寻找机器鱼最优运动相位的方法,如基于物理模型的数值计算和实验测试等,存在一定的局限性。基于物理模型的数值计算方法需要对机器鱼的流体动力学特性进行精确建模,但实际的机器鱼在水中的运动受到多种复杂因素的影响,如水流的不确定性、鱼体变形等,使得精确建模变得困难,计算结果与实际情况可能存在较大偏差。实验测试方法虽然能够直接获取机器鱼在不同运动相位下的能量消耗数据,但需要进行大量的实验,耗时费力,且难以全面覆盖所有可能的相位组合,容易遗漏最优解。因此,需要一种更高效、智能的方法来寻找最节省能量的机器鱼运动相位。

二、原理

(一)Q - Learning 算法基础

  1. 强化学习框架:Q - Learning 算法属于强化学习的范畴。强化学习旨在通过智能体与环境进行交互,根据环境反馈的奖励信号,不断调整自身的行为策略,以最大化累积奖励。在这个过程中,智能体通过尝试不同的动作,观察环境状态的变化以及获得的奖励,逐步学习到最优的行为策略。

  2. Q 值与 Q 表:Q - Learning 算法引入了 Q 值的概念,Q 值表示在某个状态下采取某个动作所能获得的长期累积奖励的期望。智能体通过维护一个 Q 表来存储不同状态 - 动作对的 Q 值。Q 表的行代表不同的状态,列代表不同的动作,表中的元素即为对应的 Q 值。在初始阶段,Q 表中的 Q 值通常被初始化为一个较小的随机值或零。

(二)基于 Q - Learning 算法寻找最优运动相位的实现

  1. 状态定义:将机器鱼的运动状态进行量化,定义为 Q - Learning 算法中的状态。例如,可以将机器鱼的当前位置、速度、身体姿态以及已经消耗的能量等信息组合成一个状态向量。不同的运动相位组合会使机器鱼处于不同的状态,通过对状态的准确描述,算法能够区分不同运动相位下机器鱼的运行情况。

  2. 动作定义:把机器鱼可能采取的不同运动相位组合定义为算法中的动作。这些动作会改变机器鱼的运动状态,进而影响其能量消耗和推进效果。例如,改变尾鳍摆动的频率、幅度以及与身体摆动的相位差等,都可以作为不同的动作。

  3. 奖励设计:设计合理的奖励函数是 Q - Learning 算法的关键。对于寻找最节省能量的机器鱼运动相位问题,奖励函数应与机器鱼的能量消耗和推进效果相关。例如,当机器鱼在某个运动相位下消耗较少能量且能够保持或提高推进速度时,给予较高的奖励;反之,若能量消耗过大或推进速度下降,则给予较低的奖励。通过这样的奖励机制,引导算法朝着寻找最节省能量的运动相位方向进行学习。

(三)算法学习过程

  1. 探索与利用:在算法的学习初期,智能体(即机器鱼的运动相位选择模型)需要通过探索不同的动作来了解环境(机器鱼的运动状态与能量消耗关系)。这意味着它会随机选择一些动作来尝试,即使这些动作可能不是当前看起来最优的。随着学习的进行,智能体逐渐开始利用已经学习到的知识,更多地选择那些具有较高 Q 值的动作,即更有可能节省能量的运动相位组合。这个过程通过一个探索率参数(如 ε - greedy 策略中的 ε)来控制,ε 在学习过程中逐渐减小,使得智能体从以探索为主逐渐转变为以利用为主。

  2. 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 Preset

close all

clc

clear

%=========================================

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; %字体12

LW = 2 ; % Linewidth

nf =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_bottom=0.1; % 底部间距 %%%%设定值

space_top=0.04;%顶部间距 %%%%设定值

space_left=0.15;%左间距 %%%%设定值

space_right=0.05;%右间距 %%%%设定值

space_UD=0.05;%图片上下间距 %%%%设定值

space_LR = 0.09; % 图片左右间距 %%%%设定值

space_legend=0 ; %图和标注之间的距离设置 %%%%设定值

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'}; % 设定绘制曲线的symbols

StrLegend = {'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+(FigWidth+space_LR)*(rem(f-1,Col)),space_bottom+(Row-ceil(f/Col))*(FigHigh+space_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 boxoff

f = 2;

s(f) = subplot('Position',[space_left+(FigWidth+space_LR)*(rem(f-1,Col)),space_bottom+(Row-ceil(f/Col))*(FigHigh+space_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 boxoff

xlabel('Episode','FontSize',TV)

set(gcf,'paperposition',get(gcf,'position'))

% print(gcf,'RL_Random_4paper_100Evn', '-dpng', '-r300')

%%

% close all

TV = 20; %字体12

LW = 2 ; % Linewidth

nf =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_bottom=0.1; % 底部间距 %%%%设定值

space_top=0.04;%顶部间距 %%%%设定值

space_left=0.15;%左间距 %%%%设定值

space_right=0.05;%右间距 %%%%设定值

space_UD=0.05;%图片上下间距 %%%%设定值

space_LR = 0.09; % 图片左右间距 %%%%设定值

space_legend=0 ; %图和标注之间的距离设置 %%%%设定值

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'}; % 设定绘制曲线的symbols

StrLegend = {'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+(FigWidth+space_LR)*(rem(f-1,Col)),space_bottom+(Row-ceil(f/Col))*(FigHigh+space_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 boxoff

axis([0,10,0,10])

ht = text(0.2,8,'(a)','FontSize',TV,'FontWeight','bold');

f =2 ;

% 绘制

s(f) = subplot('Position',[space_left+(FigWidth+space_LR)*(rem(f-1,Col)),space_bottom+(Row-ceil(f/Col))*(FigHigh+space_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 boxoff

axis([0,10,0,10])

ht = text(0.2,9,'(b)','FontSize',TV,'FontWeight','bold');

f = 3;

s(f) = subplot('Position',[space_left+(FigWidth+space_LR)*(rem(f-1,Col)),space_bottom+(Row-ceil(f/Col))*(FigHigh+space_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+(FigWidth+space_LR)*(rem(f-1,Col)),space_bottom+(Row-ceil(f/Col))*(FigHigh+space_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 boxoff

xlabel('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优化、家庭用电、电/冷/热负荷预测、电力设备故障诊断、电池管理系统(BMS)SOC/SOH估算(粒子滤波/卡尔曼滤波)、 多目标优化在电力系统调度中的应用、光伏MPPT控制算法改进(扰动观察法/电导增量法)、电动汽车充放电优化、微电网日前日内优化、储能优化、家庭用电优化、供应链优化\智能电网分布式能源经济优化调度,虚拟电厂,能源消纳,风光出力,控制策略,多目标优化,博弈能源调度,鲁棒优化等等均可~

🌟 无人机应用方面:无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化、车辆协同无人机路径规划

🌟通信方面:传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化、水声通信、通信上传下载分配

🌟信号处理方面:信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化、心电信号、DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测

🌟电力系统方面:
微电网优化、无功优化、配电网重构、储能配置、有序充电、MPPT优化、家庭用电、电/冷/热负荷预测、电力设备故障诊断、电池管理系统(BMS)SOC/SOH估算(粒子滤波/卡尔曼滤波)、 多目标优化在电力系统调度中的应用、光伏MPPT控制算法改进(扰动观察法/电导增量法)、电动汽车充放电优化、微电网日前日内优化、储能优化、家庭用电优化、供应链优化\智能电网分布式能源经济优化调度,虚拟电厂,能源消纳,风光出力,控制策略,多目标优化,博弈能源调度,鲁棒优化

🌟原创改进优化算法(适合需要创新的同学):原创改进2025年的波动光学优化算法WOO以及三国优化算法TKOA、白鲸优化算法BWO等任意优化算法均可,保证测试函数效果,一般可直接核心

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 23:59:56

PyAutoCAD终极指南:5分钟掌握Python自动化AutoCAD绘图技巧

PyAutoCAD终极指南:5分钟掌握Python自动化AutoCAD绘图技巧 【免费下载链接】pyautocad AutoCAD Automation for Python ⛺ 项目地址: https://gitcode.com/gh_mirrors/py/pyautocad 还在为AutoCAD中重复繁琐的绘图任务而烦恼吗?每天面对大量图纸需…

作者头像 李华
网站建设 2026/4/24 23:58:32

SystemVerilog断言(SVA)实战:从语法精要到验证场景构建

1. SystemVerilog断言(SVA)的实战价值 第一次接触SystemVerilog断言(SVA)时,我完全被它强大的验证能力震撼到了。想象一下,你正在调试一个复杂的芯片设计,传统的验证方法可能需要编写大量测试向量和检查代码,而SVA只需要几行简洁的…

作者头像 李华
网站建设 2026/4/24 23:53:21

从蓝桥杯Web省赛真题里,我总结出前端新人最该掌握的5个CSS/JS实战技巧

蓝桥杯Web省赛真题解析:前端新人必掌握的5个CSS/JS实战技巧 参加技术竞赛是检验学习成果的绝佳方式,而蓝桥杯Web组省赛真题更是前端开发者成长的宝贵资源。本文将从历年真题中提炼出5个最具实战价值的技巧,这些技巧不仅能帮助你在竞赛中脱颖而…

作者头像 李华