✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
一、无人机通信网络的发展与挑战
- 无人机通信网络的兴起 :近年来,无人机(Unmanned Aerial Vehicle, UAV)凭借其灵活部署、快速响应等特性,在通信领域得到了广泛应用。在一些偏远地区、受灾区域或临时活动场所,无人机可迅速搭建起空中通信基站,为地面用户提供通信服务,弥补传统地面通信网络覆盖的不足。此外,在工业监测、农业植保等领域,无人机也可作为移动中继节点,实现数据的高效传输。
- 面临的挑战 :然而,无人机通信网络在实际应用中面临诸多挑战。一方面,无人机的能量有限,其飞行时间和通信时长受到电池容量的限制。另一方面,无人机需要为多个地面用户提供服务,如何在复杂多变的环境中,合理调整自身位置和通信参数,以实现更多用户的稳定连接,是亟待解决的问题。同时,多个无人机之间的协同工作也增加了系统的复杂性,需要有效的分布式决策机制来优化网络性能。
二、分布式用户连接最大化的重要性
- 提升通信服务质量 :实现分布式用户连接最大化,意味着更多的地面用户能够接入无人机通信网络,从而提高通信服务的覆盖范围和质量。对于一些对通信实时性和可靠性要求较高的应用场景,如应急救援、远程医疗等,确保更多用户能够稳定连接至关重要,这直接关系到救援效率和患者的救治成功率。
- 优化资源利用效率 :在无人机通信网络中,资源(如频谱资源、能量资源等)是有限的。通过分布式用户连接最大化,可以更合理地分配这些资源,避免资源的浪费,提高资源的利用效率。例如,通过优化无人机的位置和通信参数,使得有限的频谱资源能够服务更多的用户,从而提升整个网络的性能。
三、多智能体深度 Q 学习(MA - DQL)原理
- 深度 Q 学习(DQN)基础 :深度 Q 学习是一种结合深度学习和强化学习的方法。在强化学习中,智能体通过与环境进行交互,根据环境反馈的奖励信号来学习最优行为策略。Q 学习通过维护一个 Q 值表,记录在不同状态下采取不同行动所获得的预期奖励。而 DQN 则利用深度神经网络来逼近 Q 值函数,从而能够处理高维、复杂的状态空间。它以状态作为输入,输出每个可能行动的 Q 值,智能体根据 Q 值选择最优行动。
- 多智能体扩展 :在多智能体系统中,存在多个相互作用的智能体。多智能体深度 Q 学习(MA - DQL)将 DQN 扩展到多个智能体的场景。每个无人机可看作一个智能体,它们需要在共享的环境中独立做出决策,同时考虑其他智能体的行为对自身决策的影响。每个智能体都有自己的 Q 网络,通过与环境交互获取奖励,更新 Q 网络参数以学习最优策略。然而,多智能体之间的相互作用使得环境变得更加复杂,传统的 DQN 方法需要进行改进以适应这种多智能体环境。例如,在训练过程中,智能体不仅要考虑自身的奖励,还要考虑整个系统的性能指标(如分布式用户连接数量),以实现全局最优。
四、基于 PyTorch 实现 MA - DQL
- PyTorch 优势 :PyTorch 是一个广泛使用的深度学习框架,具有动态计算图、易于使用和高效的特点。在实现 MA - DQL 时,PyTorch 提供了丰富的工具和库,方便构建和训练深度神经网络。其动态计算图使得模型的构建和调试更加灵活,开发人员可以根据实际需求快速调整网络结构。此外,PyTorch 的 GPU 加速功能能够显著提高训练效率,对于处理复杂的多智能体强化学习任务至关重要。
- 实现过程 :基于 PyTorch 实现 MA - DQL,首先需要定义每个智能体(无人机)的 Q 网络结构。网络的输入可以是无人机自身的状态信息(如位置、剩余能量、通信范围等)以及部分环境信息(如周围用户分布),输出为每个可能行动(如移动方向、通信功率调整等)的 Q 值。然后,在训练过程中,每个智能体根据当前状态选择行动,与环境进行交互,获取奖励和新的状态。通过不断迭代,智能体利用 PyTorch 的自动求导功能计算 Q 值的梯度,更新 Q 网络参数,逐步学习到最优的决策策略,以实现分布式用户连接最大化。
⛳️ 运行结果
编辑
📣 部分代码
%% Create (renew) pattern data
% renew the patterns' folder
namedir = 'patterns-fgd';
eval(['!rm -rv ', namedir]);
eval(['!mkdir ', namedir]);
results_path = './ecg100m';
% n is the total derivative order
for n = 1.125 : 0.125 : 5.75
namef = sprintf('fmxh%g',n*1000);
named = sprintf('fmxh%.3f',n);
[inverse_pattern,~,forward_pattern] = fracmexihat(-5,8,168,named);
save(['patterns-fgd/',namef,'.mat'],...
'inverse_pattern','forward_pattern');
fprintf('File %s.mat created!\n',namef);
%plot(pattern), getframe(gcf);
end
fontSize = 14;
%% Load experimental ECG
% plotATM('100m');
% Load ECG data from MIT-100m at physionet.org/cgi-bin/atm/ATM
[time,signal_MLII,signal_V5] = plotATM('100m',false);
% Make the signal shorter and good-to-compute
%lpow = floor(log2(length(time)));
samples = 1 : numel(time);
s = signal_V5(samples);
t = time(samples);
s = (s - min(s))/diff(minmax(s));
% Set the malfunction
t_initial = 6.5*0.2*4 + 0.2;
t_final = t_initial + 0.2*4;
fig = figure('color','white','name',...
sprintf('Signal V5'),'Unit','Normalized',...
'Position',[0.1 0.05 0.8 0.8],'MenuBar','none',...
'PaperOrientation','landscape','PaperUnit','inch','PaperSize',[11 8.5/3]);
hold on;
fill([t_initial t_initial t_initial t_final t_final t_final],[0 0 1 1 0 0],[1 .85 .85],'LineStyle','none');
h1 = plot(t,s,'b','linewidth',1.5);
xlim([0 10]); ylim([0 1.0]);
%title(sprintf('V5 signal MIT-100m'),...
% 'Interpreter','LaTeX','FontSize',20);
xlabel('Time [s]','Interpreter','LaTeX','FontSize',fontSize,'LineWidth',1.5);
ylabel('Norm. Amplitude',...
'Interpreter' ,'LaTeX','FontSize',fontSize,'LineWidth',1.5);
legend({'Reported Arrhythmia','Signal from V5'},'Interpreter','LaTeX','FontSize',fontSize)
set(h1.Parent,'TickLabelInterpreter','LaTeX','FontSize',fontSize,...
'LineWidth',1.5,'Box','on');
set(gca,'xticklabel',num2str(num2str(get(gca,'xtick')','%.0f')));
%set(gca,'yticklabel',num2str(num2str(get(gca,'ytick')','%.2f')));
h1.Parent.XAxis.TickDirection = 'out';
h1.Parent.YAxis.TickDirection = 'out';
%print(fig,[results_path,'/','ECG100m_','signal'],'-dpdf','-r300','-fillpage');
% fprintf(sprintf('Figure %s generated!\n',['signal']));
%close(fig);
%% Perform the computations (SWT)
% Prepare folders and files
%!mkdir ecg100m
files = dir([namedir,'/']);
namefiles_ = {files.name};
namefiles = namefiles_(3:end);
nnamefiles = numel(namefiles);
% Number of decomposition levels
levels = 3;
% Load patterns from the folder
DATAa = nan(nnamefiles,numel(time));
DATAd = nan(nnamefiles,numel(time));
orders = nan(1,nnamefiles);
orderslabel = cell(1,nnamefiles);
for ii = 1 : nnamefiles
filestr = namefiles{ii};
load([namedir,'/',filestr]);
X = linspace(0,1,numel(forward_pattern));
Y = forward_pattern;
% Y = inverse_pattern;
[psi,xval,nc] = pat2cwav(Y, 'orthconst',3,'continuous') ;
% Split the file name in two strings
headstr = filestr(1:4);
tailstr = filestr(5:8);
% Get the fractional order
fracorder = str2double(tailstr)/1000;
% Get the continous wavelet transform
%[cfs,f] = cwt(s,psi,Fs);
% Obtain filters
[Lo_D,Hi_D,Lo_R,Hi_R] = orthfilt(psi);
% Calculate swt
[swa,swd] = swt(s,levels,Lo_D,Hi_D);
% Store these values in a matrix
DATAa(ii,:) = (swa(levels,:)-min(swa(levels,:)))/diff(minmax(swa(levels,:)));%(swa(levels,:)-min(swa(levels,:)))/diff(minmax(swa(levels,:)));
%DATAd(ii,:) = swd(levels,:);%/max(abs(swd(levels,:)));
orders(ii) = fracorder;
orderslabel = ['$$\\nu+n=$$ ',sprintf('%.2f',fracorder)];
% Plot it in pretty good resolution
fig = figure('color','white','name',...
sprintf('Frac MEX Hat, nu = %.2f',fracorder),'Unit','Normalized',...
'Position',[0.1 0.05 0.8 0.4],'MenuBar','none',...
'PaperOrientation','landscape','PaperUnit','inch','PaperSize',[12 8.5/3]);
y_min = min(DATAa(ii,:)); y_max = max(DATAa(ii,:)); hold on;
fill([t_initial t_initial t_initial t_final t_final t_final],[y_min 0 y_max y_max 0 y_min],[1 .85 .85],'LineStyle','none');
plot(t,DATAa(ii,:),'b','linewidth',1.5);
xlim([0 10]); ylim([y_min y_max]);
%title(sprintf('Level %d coefficients',levels),...
% 'Interpreter','LaTeX','FontSize',20);
xlabel('Time [s]','Interpreter','LaTeX','FontSize',fontSize,'LineWidth',1.5);
ylabel(sprintf('Norm. Coeff. $$\\hat{a}_%d $$',levels),...
'Interpreter','LaTeX','FontSize',fontSize,'LineWidth',1.5);
set(gca,'TickLabelInterpreter','LaTeX','FontSize',fontSize,...
'LineWidth',1.5,'Box','on');
set(gca,'xticklabel',num2str(num2str(get(gca,'xtick')','%.0f')));
%set(gca,'yticklabel',num2str(num2str(get(gca,'ytick')','%.2f')));
h1 = get(gca);
h1.XAxis.TickDirection = 'out';
h1.YAxis.TickDirection = 'out';
print(fig,[results_path,'/','ECG100m_',headstr,tailstr],'-dpdf','-r300','-fillpage');
fprintf(sprintf('Figure %s generated!\n',[headstr,tailstr]));
close(fig);
end
%% Summary plot
🔗 参考文献
🍅往期回顾扫扫下方二维码