简介:本资源是一份面向通信工程研究者与深度强化学习实践者的学术复现资料,聚焦智能超表面(RIS)辅助的NOMA-D2D通信系统,核心解决多用户干扰抑制与联合资源分配难题。内容涵盖系统建模、混合整数非线性优化问题分解、QoS感知的二分图信道匹配、DDPG驱动的发射功率与RIS相移联合优化,以及LSTM增强与动态优先级机制等创新设计,并提供完整可运行Python代码及逐模块注释。资源为单个763KB PDF文件,内含理论推导、算法流程、仿真结果分析及全部代码实现,便于读者从建模到复现全流程理解“分解-协调”优化框架。目前已有83人学习下载,适合具备无线通信与深度学习基础的研究人员开展RIS赋能边缘通信的算法验证与二次开发。
1. 这不是又一个强化学习玩具项目:RIS+D2D联合优化必须直面三重耦合约束
你手头的5G小基站刚部署完,D2D直连用户却总在边缘掉话——不是功率不够,而是干扰源藏在看不见的地方:D2D发射端→RIS→蜂窝用户(CU)的串扰、同频D2D对之间的互扰、还有CU上行信号对D2D接收端的压制。传统方法要么把RIS相移当固定参数硬编码,要么把功率控制和信道分配拆成独立模块轮流迭代,结果是收敛慢、速率增益卡在8%上不去。这篇复现真正落地的点在于:它用DDPG同时啃下离散信道匹配 + 连续功率控制 + 复数域RIS相移优化这三块硬骨头,且每个动作维度都绑定了物理约束——比如RIS相移必须保持单位模长,D2D功率不能突破23dBm上限,而奖励函数直接挂钩D2D用户和速率(不是吞吐量或SINR)。适合正在做RIS原型验证的通信工程师、需要把NOMA-D2D方案写进基金申报书的研究者,以及想拿真实信道模型练手的强化学习实践者。代码里没有仿真器黑箱,所有信道生成、干扰计算、状态转移全用NumPy/TensorFlow原生实现,连瑞利衰落的路径损耗系数(α=2.7)和参考距离(d₀=1m)都按3GPP TR 38.901实测值设定。
2. 为什么必须解耦?从NOMA-D2D-RIS联合优化问题出发
2.1 原始优化问题的不可解性根源
原始目标函数是典型的混合整数非线性规划(MINLP):
$$\max_{\mathbf{p},\boldsymbol{\theta},\mathbf{a}} \sum_{d=1}^{N_d} R_d(\mathbf{p},\boldsymbol{\theta},\mathbf{a})$$
约束条件包括:
- 功率约束:$0 \leq p_d \leq P_{\max}$
- RIS相移约束:$|\theta_m|=1, \forall m\in{1,\dots,M}$
- 信道分配约束:$\sum_{c=1}^{N_c} a_{d,c} = 1, \quad a_{d,c}\in{0,1}$
- QoS约束:$R_d \geq R_{\min}$
提示:直接求解该问题的计算复杂度是$O(2^{N_d N_c} \times M^2)$,当$N_d=10$、$N_c=5$、$M=32$时,穷举空间超$10^{17}$,梯度类算法因相移约束非凸而失效。
2.2 三阶段解耦设计的物理意义与数学依据
论文将问题分解为三个可独立求解的子问题,其合理性来自通信系统的分层特性:
- 第一层(信道分配):D2D簇与蜂窝信道的映射关系本质是资源拓扑匹配,受大尺度路径损耗主导,变化缓慢(秒级),适合用组合优化;
- 第二层(功率+RIS联合优化):D2D发射功率与RIS相移共同决定小尺度信道增益,响应毫秒级信道变化,且二者通过复合信道$H_{\text{ris}} = \mathbf{h}{r\to d}^H \boldsymbol{\Theta} \mathbf{h}{d\to r}$强耦合,必须联合调整;
- 第三层(交替迭代):两层间存在反馈——信道分配结果影响干扰图谱,而功率/RIS优化结果又改变各D2D对的信干噪比(SINR),需通过外循环协调。
2.2.1 二分图匹配如何建模QoS感知的信道分配
代码中BipartiteMatching.calculate_interference()构建的干扰矩阵并非简单计算链路强度,而是显式注入QoS约束:
# 计算D2D发射端到蜂窝用户的干扰(关键!) H_d2u = self.channel_model.H_rd[2*d] # D2D发射端→RIS H_ru_c = self.channel_model.H_ru[c] # RIS→蜂窝用户c theta = np.ones(self.params.M) # 初始相移(单位向量) interference = np.abs(np.dot(H_ru_c, theta * H_d2u))**2此处theta设为全1向量,是因为信道分配阶段不优化RIS——它只评估最坏情况下的干扰潜力。若某D2D对在某蜂窝信道上产生高干扰,说明该信道对该D2D对“不友好”,匹配权重应降低。但注意权重计算方式:
weight = max_interf - interference_matrix[d, c] # 转换为最大权重问题这确保了匹配结果天然满足最小化最大干扰原则,而非单纯最小化总干扰,从而保障边缘D2D用户的最低速率$R_{\min}=1$Mbps。
2.2.2 DDPG状态空间与动作空间的物理映射
DDPG智能体的状态维度为$N_d + 2M$,其中:
- 前$N_d$维对应D2D发射功率(归一化到$[0,1]$区间);
- 后$2M$维分别对应RIS反射单元相移的实部与虚部(归一化到$[-1,1]$)。
动作空间同样为$N_d + 2M$维,但动作值不直接等于新状态,而是增量:
next_state = state + action * 0.1 # 步长缩放因子0.1这个设计至关重要——它避免了动作爆炸(如直接输出功率值可能达23dBm,而神经网络输出范围仅$[-1,1]$),且符合物理系统调节特性:RIS相移微调、功率渐进式调整。更关键的是,在DDPGAgent.calculate_reward()中,动作被严格映射回物理量:
powers = 0.5 * (power_adjustments + 1) * self.params.P_max # [0,P_max] theta = phase_adjustments[:self.params.M] + 1j * phase_adjustments[self.params.M:] theta = theta / np.abs(theta) # 强制单位模长!注意:
theta / np.abs(theta)这行代码是RIS优化的生死线。若省略此归一化,复合信道增益计算将失效,因为RIS物理实现要求$|\theta_m|=1$。很多复现失败案例源于此处疏忽。
3. DDPG联合优化的工程实现细节与避坑指南
3.1 Actor-Critic网络结构的通信语义解析
Actor网络输出动作向量,其结构设计隐含对优化变量特性的理解:
def _build_actor(self): inputs = Input(shape=(self.state_dim,)) # 输入:功率+相移实虚部 x = Dense(256, activation='relu')(inputs) x = Dense(128, activation='relu')(x) outputs = Dense(self.action_dim, activation='tanh')(x) # 输出:[-1,1]增量 return tf.keras.Model(inputs, outputs)tanh激活强制输出在$[-1,1]$,与状态空间归一化范围一致。而Critic网络采用双输入结构:
def _build_critic(self): state_input = Input(shape=(self.state_dim,)) action_input = Input(shape=(self.action_dim,)) # 状态路径:提取当前资源配置特征 x_state = Dense(256, activation='relu')(state_input) x_state = Dense(128, activation='relu')(x_state) # 动作路径:提取调控策略特征 x_action = Dense(128, activation='relu')(action_input) concat = tf.keras.layers.Concatenate()([x_state, x_action]) x = Dense(64, activation='relu')(concat) outputs = Dense(1)(x) # Q值:预测该状态-动作对的长期回报这种分离式特征提取,让网络能区分“当前配置有多差”(state path)和“这个调控动作是否有效”(action path),比单输入网络更适应联合优化场景。
3.2 奖励函数设计:为什么不用SINR而用和速率?
calculate_reward()函数直接返回D2D用户和速率(单位Mbps),而非中间指标如SINR或干扰功率。原因有三:
- 目标一致性:原始优化目标就是和速率最大化,奖励函数必须与之严格对齐;
- 梯度可导性:$R_d = B \log_2(1+\text{SINR}_d)$对功率和相移连续可导,而SINR本身含分式结构,易导致梯度消失;
- QoS硬约束处理:代码中未显式惩罚$R_d < R_{\min}$,但通过
matching_result已确保信道分配阶段规避高干扰信道,使训练初期SINR天然满足阈值。若需强约束,可在奖励中添加惩罚项:
# 可选:加入QoS惩罚(调试阶段启用) if sinr < 10**(self.params.R_min/(self.params.B*np.log2(np.e)))-1: # 转换为SINR阈值 reward -= 100 # 严重惩罚3.3 经验回放与目标网络更新的关键参数调优
DDPG训练稳定性高度依赖以下参数:
| 参数 | 推荐值 | 物理意义 | 调优建议 |
|---|---|---|---|
gamma(折扣因子) | 0.99 | 衡量未来奖励重要性 | D2D通信场景中,信道变化快,不宜过高(>0.995易发散) |
tau(目标网络软更新) | 0.005 | 目标网络更新平滑度 | 小于0.001导致收敛慢,大于0.01引发震荡 |
batch_size | 64 | 梯度估计方差 | 显存允许下可增至128,但需同步增大buffer_size至20000 |
OU噪声sigma | 0.2 | 探索强度 | 初期设0.3加速探索,后期降至0.1提升收敛精度 |
训练中常见失败现象及对策:
- 奖励曲线剧烈震荡:检查
tau是否过大,或gamma与max_steps不匹配(max_steps=100时gamma=0.99合理); - 奖励长期停滞在低值:验证
calculate_reward()中干扰计算是否遗漏同信道D2D对(代码第172行if other_d != d_idx and other_c == c_idx:正确捕获); - RIS相移优化无效:确认
theta = theta / np.abs(theta)执行位置——必须在reward计算前,且不能放在get_action()中(否则动作空间失真)。
4. 信道建模的真实性验证与可复现实验设置
4.1 瑞利衰落信道生成的3GPP合规性
ChannelModel._generate_single_channel()生成的信道严格遵循3GPP标准:
d = np.random.uniform(10, 100) # 用户距离基站/RIS:10-100m(室内微蜂窝场景) PL = 10**(-3.53 - self.params.alpha*np.log10(d/self.params.d0))/10 # 路径损耗 h = np.sqrt(PL/2) * (np.random.randn(dim) + 1j*np.random.randn(dim)) # 瑞利衰落其中:
- 路径损耗常数$-3.53$对应2.4GHz载波频率(
fc=2.4); - 路径损耗指数$\alpha=2.7$适用于视距(LoS)主导的RIS辅助场景(非纯NLoS的3.5);
np.sqrt(PL/2)保证信道功率均值为PL(实部虚部各占一半功率)。
验证方法:运行
channel_model.generate_channels()后,检查H_br(BS→RIS)的幅度分布——应近似瑞利分布,可用plt.hist(np.abs(H_br), bins=50)可视化。
4.2 可复现性保障的完整实验配置表
为确保结果可复现,必须固定以下随机种子并记录环境版本:
| 配置项 | 值 | 说明 |
|---|---|---|
| NumPy随机种子 | np.random.seed(42) | 影响信道生成、经验采样 |
| TensorFlow随机种子 | tf.random.set_seed(42) | 影响网络权重初始化、梯度计算 |
| Python哈希种子 | export PYTHONHASHSEED=42 | 影响字典顺序(影响二分图节点添加) |
| 关键库版本 | numpy==1.23.5,tensorflow==2.12.0,networkx==3.1 | 版本差异可能导致max_weight_matching结果不同 |
运行main()前需插入:
import os os.environ['PYTHONHASHSEED'] = '42' np.random.seed(42) tf.random.set_seed(42)4.3 性能评估的黄金指标与基线对比
论文宣称“提升数据传输速率”,需用以下指标量化:
- D2D和速率(Mbps):
rewards_history末期值(建议取最后100轮平均); - 干扰抑制比(dB):计算优化前后D2D对CU的平均干扰功率比;
- 收敛速度(轮次):奖励曲线首次超过基线95%的时间点。
基线对比必须包含:
- 无RIS方案:
H_ris=0,仅直连链路; - 固定RIS方案:
theta随机初始化后冻结; - 独立功率控制:RIS相移固定,仅用DDPG优化功率。
在main()末尾添加基线测试:
# 基线1:无RIS agent_no_ris = DDPGAgent(params, channel_model, matching_result) agent_no_ris.channel_model.H_rd = np.zeros_like(agent_no_ris.channel_model.H_rd) # 清零RIS信道 # ... 训练并记录reward5. RIS相移优化的进阶技巧:从单位模长约束到相位连续性保障
5.1 单位模长约束的替代实现方案
theta / np.abs(theta)虽简洁,但在梯度反传时存在除零风险(np.abs(theta)接近0)。更鲁棒的实现是使用复数相位提取:
# 替代方案:直接操作相位角 phase = np.angle(theta) # 获取当前相位 # 动作调整相位而非实虚部 phase_adjustments = action[self.params.N_d:] # [-1,1]映射到[-π,π] new_phase = phase + phase_adjustments * np.pi theta_new = np.exp(1j * new_phase) # 天然单位模长此方案避免了模长归一化运算,且相位调整更符合RIS硬件控制逻辑(实际器件调节的是相位偏移量)。
5.2 相位连续性约束的工程必要性
RIS物理实现中,相邻单元相位跳变过大会激发高阶衍射,降低反射效率。代码中可通过在奖励函数中添加相位平滑惩罚项:
# 在calculate_reward()末尾添加 phase_diff = np.diff(np.angle(theta)) phase_smooth_penalty = -0.1 * np.sum(np.abs(phase_diff)**2) # L2平滑约束 reward += phase_smooth_penalty系数0.1需根据RIS单元间距(通常λ/2)和载波频率校准——2.4GHz对应波长12.5cm,若单元间距6cm,则相位跳变应限制在π/2内。
5.3 实时部署的模型轻量化路径
原始DDPG网络含约15万参数,难以部署到嵌入式RIS控制器。可行的轻量化方案:
- 知识蒸馏:用原始DDPG生成10万条(state, action)样本,训练小型MLP(2层×64节点);
- 量化感知训练:将Actor网络权重转为int8,TensorFlow Lite支持;
- 相移查表法:对典型场景(如D2D距离分布)预计算最优theta,存储为查找表。
验证轻量化效果的关键指标是推理延迟:在Jetson Nano上,原始模型单次推理约12ms,而量化后MLP可压至1.8ms,满足RIS实时重构(<10ms)要求。
本文还有配套的精品资源,点击获取