ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于DDQN的RIS无人机通信物理层安全优化

基于DDQN的RIS无人机通信物理层安全优化 简介这份资源面向无线通信、物理层安全与强化学习方向的研究生及科研人员聚焦RIS辅助无人机通信中的安全速率优化问题。针对城市环境中视距链路易被遮挡、传统加密难以应对窃听威胁的痛点文档提出基于双深度Q网络的联合优化方案同时调整RIS相移矩阵与UAV三维轨迹以最大化系统可达安全速率。压缩包内仅含1个docx文档约503KB内容涵盖引言、系统模型、算法设计与仿真分析等完整章节包含公式推导与系统框图便于读者理解DDQN在RIS-UAV安全通信中的建模思路与实现细节。目前已有278人学习下载适合希望快速掌握RIS辅助UAV物理层安全建模、强化学习求解思路及论文写作框架的读者参考借鉴。1. 从一次山区应急通信演练说起这套方案到底在解决什么去年跟一个做应急通信的团队聊天他们提到一个很具体的场景山区洪涝之后地面基站要么被冲毁要么被山体挡住救援队带着便携设备进去信号时断时续。他们试过用无人机挂中继电台但问题很快暴露——山区地形复杂无人机到地面终端的链路经常被山脊遮挡绕飞又费电而且链路是开放的任何人都能截获。这就是典型的无人机通信物理层安全问题不是加密算法不够强而是无线信道的广播特性决定了只要在覆盖范围内信号就能被偷听。这篇要讲的东西就是在这个场景下用强化学习去调智能超表面让无人机通信的物理层安全性能提上来。智能超表面RIS是一块由大量可调反射单元组成的板子每个单元能独立改变入射信号的相位相当于把无线传播环境从“听天由命”变成“可以编程”。无人机带着RIS飞通过调整每个单元的相移把有用信号增强到合法用户方向同时把窃听方向的信号抵消掉。但问题是无人机的轨迹、RIS相移、发射功率这些变量耦合在一起传统优化方法要么算不动要么需要完美的窃听者位置信息——实际中你根本不知道窃听者在哪。强化学习在这里的价值就出来了不需要知道窃听者的精确位置只靠合法链路的反馈就能学出一套策略。DDQNDouble Deep Q-Network是常见选择因为它能缓解Q值高估问题在离散动作空间里比较稳。适合谁看做无人机通信、应急通信、物理层安全方向的研究生和工程师以及想把这套东西落到仿真平台上的开发者。下面从系统模型开始拆一步步走到能跑的代码。2. 系统模型与问题建模把物理层安全写成强化学习能吃的形式2.1 为什么选RIS辅助而不是纯波束成形无人机通信的物理层安全核心指标是保密容量secrecy capacity定义是合法链路容量减去窃听链路容量。如果只靠无人机的多天线波束成形在山区这种强遮挡场景下直射路径经常不存在波束成形增益上不去。RIS的好处是它能主动构造一条反射路径无人机发射信号打到RISRIS把信号反射到被山体遮挡的合法用户同时通过相位调控让反射到窃听者方向的信号相互抵消。这里有个容易翻车的地方很多人以为RIS单元越多越好实际上在无人机载重和功耗限制下单元数通常控制在64到256之间。单元间距一般是半波长工作在Sub-6GHz频段时一块128单元的RIS板子尺寸大概在0.5米见方重量两三公斤小型多旋翼能带得动。频段选择上常见做法是3.5GHz或5.8GHz前者覆盖好但带宽窄后者带宽大但绕射能力差山区场景我一般倾向3.5GHz。2.2 状态空间、动作空间与奖励函数的设计把这个问题写成MDP状态空间要包含无人机位置、RIS相移配置、合法用户和窃听者的信道状态。但实际中窃听者信道不可知所以状态里只能用合法链路的CSI和无人机自身状态。常见做法是无人机三维坐标归一化到0到1合法用户的信噪比SNRRIS当前相移矩阵的实部和虚部或者直接用量化后的相位索引剩余电量或剩余飞行步数动作空间如果直接对每个RIS单元做连续相位控制维度太高DDQN处理不了。工程上一般做离散化每个单元相位从{0, π/2, π, 3π/2}四个值里选或者用2比特量化。但128个单元如果每个4个选择动作空间是4^128仍然爆炸。所以实际做法是分组控制把128个单元分成8组每组16个单元共用同一个相位动作空间降到4^865536DDQN还能处理。或者用码本方式预定义一组相位配置动作就是从码本里选一个。奖励函数直接决定学出来的策略是不是你要的。最直接的是用保密容量做奖励import numpy as np def secrecy_rate(h_legit, h_eve, ris_phase, p_tx, noise_power): 计算保密容量 h_legit: 合法链路信道增益 (复数) h_eve: 窃听链路信道增益 (复数) ris_phase: RIS相移向量 (复数, 单位模) p_tx: 发射功率 noise_power: 噪声功率 # 合法链路等效信道: 直射 RIS反射 h_l h_legit[direct] np.sum(h_legit[ris] * ris_phase) h_e h_eve[direct] np.sum(h_eve[ris] * ris_phase) snr_l p_tx * np.abs(h_l)**2 / noise_power snr_e p_tx * np.abs(h_e)**2 / noise_power c_l np.log2(1 snr_l) c_e np.log2(1 snr_e) return max(c_l - c_e, 0)这段代码的逻辑是合法链路和窃听链路的等效信道都由直射分量和RIS反射分量叠加而成RIS相移向量直接改变反射分量的相位。参数说明h_legit[ris]和h_eve[ris]是无人机到RIS再到各接收端的级联信道通常建模为莱斯衰落p_tx在训练时可以先固定后期作为动作的一部分联合优化noise_power取-174dBm/Hz加带宽。但实际训练时直接用保密容量做奖励有个问题当窃听链路很差时保密容量接近合法容量梯度信号弱学得慢。我一般会加一个惩罚项当合法用户SNR低于阈值时给负奖励这样能加速收敛。另外如果窃听者位置完全未知可以用“最坏情况”思路假设窃听者在某个区域内最优位置用这个上界来算奖励逼着策略学出鲁棒性。3. DDQN训练流程从环境搭建到策略收敛3.1 仿真环境搭建与信道生成训练之前得有个能快速出样本的环境。我一般用Python搭不依赖外部仿真器因为DDQN训练需要大量交互Gym风格的轻量环境最合适。核心是信道生成无人机到RIS、RIS到用户、无人机到窃听者这些链路用莱斯衰落建模直射分量根据几何位置算。import numpy as np class RISUAVEnv: def __init__(self, n_ris128, n_groups8, area_size1000): self.n_ris n_ris self.n_groups n_groups self.area_size area_size self.group_size n_ris // n_groups self.phase_levels np.array([0, np.pi/2, np.pi, 3*np.pi/2]) def reset(self): # 无人机随机初始位置 (x, y, z) self.uav_pos np.array([ np.random.uniform(0, self.area_size), np.random.uniform(0, self.area_size), np.random.uniform(50, 150) ]) # 合法用户位置 self.user_pos np.array([ np.random.uniform(0, self.area_size), np.random.uniform(0, self.area_size), 1.5 ]) # 窃听者位置 (训练时随机, 测试时用最坏情况) self.eve_pos np.array([ np.random.uniform(0, self.area_size), np.random.uniform(0, self.area_size), 1.5 ]) self.step_count 0 return self._get_state() def _get_state(self): # 状态: 无人机位置归一化 合法用户SNR 当前相移配置 uav_norm self.uav_pos / self.area_size snr self._compute_snr() phase_idx np.random.randint(0, 4, self.n_groups) # 简化: 随机相移 return np.concatenate([uav_norm, [snr], phase_idx / 3.0]) def _compute_snr(self): # 简化的SNR计算, 实际要用信道模型 dist np.linalg.norm(self.uav_pos - self.user_pos) path_loss 20 * np.log10(dist) 20 * np.log10(3.5e9) - 147.55 return 30 - path_loss # dB这个环境类的关键参数n_ris是RIS单元数n_groups是分组数area_size是场景边长。reset()里无人机高度限制在50到150米这是常见无人机通信的合理范围。_get_state()返回的状态向量维度是31812对DDQN来说很友好。注意这里SNR计算做了简化实际训练时要把RIS反射路径加进去否则学出来的策略不会用RIS。3.2 DDQN网络结构与关键超参数DDQN和普通DQN的区别在于它用两个网络在线网络选动作目标网络算目标Q值这样能缓解Q值高估。网络结构不用太深三层全连接就够因为状态维度只有十几维。import torch import torch.nn as nn class DDQN(nn.Module): def __init__(self, state_dim, action_dim, hidden_dim256): super().__init__() self.net nn.Sequential( nn.Linear(state_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, action_dim) ) def forward(self, x): return self.net(x) # 关键超参数 config { state_dim: 12, action_dim: 4**8, # 8组, 每组4个相位 hidden_dim: 256, lr: 1e-4, gamma: 0.95, epsilon_start: 1.0, epsilon_end: 0.05, epsilon_decay: 0.995, batch_size: 64, buffer_size: 100000, target_update: 200, # 每200步同步一次目标网络 }超参数里最需要调的是lr和gamma。lr我一般从1e-4开始太大容易震荡太小收敛慢。gamma取0.95是因为无人机轨迹规划是长程决策但太大又会让Q值发散0.95到0.99之间试。epsilon_decay用0.995意味着大概1000步左右从纯探索降到0.05实际训练中如果发现前期学得太慢可以改成0.99。动作空间4^865536对DDQN来说偏大训练时经常出现Q值区分度不够的问题。一个实用技巧是用动作嵌入把8组相位索引分别embedding后拼接再过一个小的注意力层这样网络能学到组间的相对重要性。但这是进阶做法先跑通基础版再说。3.3 训练循环与收敛判断训练循环里最容易翻车的是经验回放。很多人直接把所有transition塞进buffer但无人机通信场景里不同位置的样本分布差异很大均匀采样会导致网络偏向高频位置。我一般用优先经验回放按TD误差采样但实现复杂。简单替代方案是分区域存buffer每个区域采样时按比例抽。from collections import deque import random class ReplayBuffer: def __init__(self, capacity): self.buffer deque(maxlencapacity) def push(self, state, action, reward, next_state, done): self.buffer.append((state, action, reward, next_state, done)) def sample(self, batch_size): batch random.sample(self.buffer, batch_size) state, action, reward, next_state, done zip(*batch) return (np.array(state), np.array(action), np.array(reward), np.array(next_state), np.array(done)) def __len__(self): return len(self.buffer) def train_step(online_net, target_net, optimizer, buffer, config): if len(buffer) config[batch_size]: return None state, action, reward, next_state, done buffer.sample(config[batch_size]) state torch.FloatTensor(state) next_state torch.FloatTensor(next_state) action torch.LongTensor(action) reward torch.FloatTensor(reward) done torch.FloatTensor(done) # 当前Q值 q_values online_net(state) q_value q_values.gather(1, action.unsqueeze(1)).squeeze(1) # DDQN: 在线网络选动作, 目标网络算Q值 with torch.no_grad(): next_actions online_net(next_state).argmax(1) next_q target_net(next_state).gather(1, next_actions.unsqueeze(1)).squeeze(1) target_q reward config[gamma] * next_q * (1 - done) loss nn.MSELoss()(q_value, target_q) optimizer.zero_grad() loss.backward() # 梯度裁剪, 防止Q值爆炸 nn.utils.clip_grad_norm_(online_net.parameters(), max_norm10) optimizer.step() return loss.item()这段训练代码里next_actions用在线网络选next_q用目标网络算这是DDQN的核心。梯度裁剪的max_norm10是血泪经验无人机通信的奖励尺度变化大不裁剪的话Q值经常飞到1e6以上网络直接废掉。收敛判断不能只看loss要看平均奖励的滑动平均。我一般跑5000到10000个episode每个episode 200步如果平均奖励连续500个episode不涨就停。4. 避坑与排查训练不收敛时先查这五件事4.1 奖励曲线震荡剧烈Q值发散现象训练前期奖励还能涨到中间突然崩掉Q值输出变成NaN或者极大值。原因通常是学习率太大加上奖励尺度没归一化。保密容量的数值范围可能在0到10 bps/Hz但加上惩罚项后可能到-50网络输出层没有归一化就会爆。解决把奖励除以一个常数比如最大可能保密容量让奖励落在-1到1之间学习率降到1e-5再试梯度裁剪的max_norm从10降到1。4.2 策略学出来不用RIS相移一直不变现象训练完看策略发现无人机只调位置和功率RIS相移从头到尾一个值。原因是状态里没有包含RIS相移的反馈或者奖励函数里RIS的贡献被直射路径淹没了。解决状态里显式加入当前相移配置的编码奖励函数里把RIS反射路径的增益单独加权比如reward secrecy_rate 0.5 * ris_gain另外检查信道模型如果直射路径太强RIS确实没用这时候要调整场景让直射被遮挡。4.3 动作空间太大Q值区分度低现象训练很久策略还是随机选动作Q值最大的动作和最小的差不到0.01。原因是65536个动作对DDQN来说太大网络输出层维度太高每个动作的样本太少。解决减少分组数从8组降到4组动作空间降到256或者用动作嵌入加注意力机制最粗暴的办法是限制RIS相移只能取0和π两个值动作空间降到2^8256。4.4 窃听者位置变化时策略失效现象训练时窃听者位置固定测试时换个位置保密容量直接掉到零。原因是策略过拟合到了训练时的窃听者位置。解决训练时对窃听者位置做域随机化每个episode随机采奖励函数用最坏情况窃听者位置即在一个区域内选让保密容量最小的位置或者用对抗训练交替优化策略和窃听者位置。4.5 仿真跑得太慢一天跑不完一轮现象每个episode要算128个RIS单元的级联信道Python循环太慢。原因是信道生成用了for循环逐单元算。解决把RIS信道写成矩阵乘法用numpy的广播机制或者预生成一批信道样本存起来训练时随机抽如果还慢把RIS单元数降到64先跑通再往上加。5. 进阶技巧用最坏情况鲁棒性换泛化能力基础版DDQN跑通之后真正决定这套方案能不能落地的是鲁棒性。实际场景里窃听者的位置、信道状态都是不确定的训练时见过的位置测试时不一定在。我一般用两个手段来提升泛化一是训练时对窃听者位置做域随机化每个episode在合法用户周围500米范围内随机采二是奖励函数里加一个鲁棒项用采样估计最坏情况保密容量。具体做法是每个step除了算当前窃听者位置的保密容量再随机采5个虚拟窃听者位置取其中最小的保密容量作为奖励的一部分。这样策略会倾向于学出对窃听者位置不敏感的解。代码上就是在奖励函数里加一层循环def robust_reward(h_legit, h_eve_list, ris_phase, p_tx, noise_power): 鲁棒奖励: 对多个虚拟窃听者位置取最坏情况 h_eve_list: 多个窃听者信道的列表 c_l compute_legit_rate(h_legit, ris_phase, p_tx, noise_power) c_e_worst min( compute_eve_rate(h_eve, ris_phase, p_tx, noise_power) for h_eve in h_eve_list ) return max(c_l - c_e_worst, 0)这个改动会让训练慢5倍左右但测试时的保密容量方差能降一半以上。另一个技巧是课程学习先在小范围随机窃听者位置训练收敛后逐步扩大随机范围这样比一上来就大范围随机收敛快。验证方法上我习惯用三个指标平均保密容量、保密中断概率secrecy outage probability即保密容量低于阈值的概率、以及策略对窃听者位置扰动的敏感度。敏感度用有限差分算即窃听者位置移动10米保密容量变化多少。如果敏感度大于0.1 bps/Hz每10米说明策略还不够鲁棒得继续加随机化。最后说个我自己的习惯每次改完奖励函数或状态设计先跑100个episode看平均奖励不急着跑完整训练。如果100个episode奖励还在随机水平说明设计有问题调完再跑。这样能省很多时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表