news 2026/9/30 9:24:34

PSO联合优化STAR-RIS辅助NOMA:功率分配与相移设计实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PSO联合优化STAR-RIS辅助NOMA:功率分配与相移设计实战

简介:这份资源面向通信工程领域的研究人员、高校教师与研究生,聚焦基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化问题。STAR-RIS可同时反射与传输信号,结合NOMA能提升覆盖范围、服务用户数与频谱效率;资源在不依赖完整CSI的前提下,联合优化功率分配、基站波束成形及STAR-RIS透射与反射波束成形向量,以最大化总可实现速率并保障各用户最低速率。压缩包仅含1个PDF文件,约830KB,内容涵盖系统参数设置、信道模型、速率计算、目标函数、约束函数、主优化函数与结果可视化等完整可运行Python代码及解释,并讨论与DDPG等方法的对比及不同工作协议的性能差异。已有281人学习,适合研究智能反射面、非正交多址接入与智能优化算法的读者复现实验、评估STAR-RIS-NOMA相对OMA的性能优势,并为实际系统设计提供理论依据与技术支持。

1. 从一次“功率全给远用户”的翻车说起:STAR-RIS 辅助 NOMA 到底在优化什么

如果你做过 NOMA 的功率分配,大概率踩过这个坑:按信道增益反比分配功率,近用户少分、远用户多分,理论上公平又高效,可一旦远用户和近用户的空间信道高度相关,串行干扰消除(SIC)解码顺序就会来回抖,系统总速率不升反降。我第一次把 STAR-RIS 加进来时更惨——透射和反射两套波束互相打架,功率分配和表面相位各调各的,仿真曲线像心电图。这篇要讲的就是怎么把PSO(粒子群优化)、STAR-RIS(可同时透射与反射的智能表面)和NOMA(非正交多址)三件事拧成一股绳:用 PSO 联合优化基站发射功率分配和 STAR-RIS 的透射/反射相移与幅度,让系统和速率最大化。适合已经懂 NOMA 基础、想上手 RIS 联合优化、又不想推导一堆凸优化对偶问题的工程师。核心结论先放这:联合优化比“先定功率再调相位”的两步法,和速率通常能高出 15%~30%,而 PSO 是其中最容易复现、最不挑目标函数形态的解法。

2. 系统模型与优化问题:把物理场景翻译成 PSO 能吃的目标函数

2.1 STAR-RIS 与 NOMA 的耦合关系

STAR-RIS 和传统反射式 RIS 最大的区别,是它每个单元能同时工作在同相透射(T)和同相反射(R)两种模式,或者按能量分割(ES)把入射能量按比例分给透射和反射。对 NOMA 来说这很关键:基站到近用户可能走反射径,到远用户走透射径,两路信号在同一时频资源上叠加,靠功率域区分。于是系统里出现了三组互相耦合的变量——基站的功率分配系数、STAR-RIS 每个单元的透射相移和反射相移、以及 ES 模式下的能量分割比。任何一组单独调,另外两组的最优解都会变,这就是必须联合优化的根本原因。

常见做法是把 STAR-RIS 建模成对角相移矩阵。透射矩阵记为 $\mathbf{\Theta}_t = \text{diag}(\sqrt{\beta_t^1}e^{j\theta_t^1},\dots)$,反射矩阵 $\mathbf{\Theta}_r = \text{diag}(\sqrt{\beta_r^1}e^{j\theta_r^1},\dots)$,ES 模式下满足 $\beta_t^n + \beta_r^n = 1$。第 $k$ 个用户的接收信号经过 SIC 后,可达速率写成信干噪比的 log 形式。和速率最大化问题的标准形式是:

$$\max_{{p_k},{\theta_t^n},{\theta_r^n},{\beta_t^n}} \sum_k R_k \quad \text{s.t.} \sum_k p_k \le P_{max},\ p_k \ge 0,\ \beta_t^n+\beta_r^n=1,\ \theta \in [0,2\pi)$$

这个问题的非凸性来自三处:速率对相位的非凸、SIC 解码顺序随功率变化的组合特性、以及 ES 约束下的耦合。用凸优化硬啃要引入松弛和惩罚项,调参成本高;PSO 的好处是把这些变量直接编码成一个粒子,目标函数当黑匣子评估,约束用罚函数处理,工程上落地快得多。

2.2 变量编码:一个粒子装下功率、相位和分割比

编码方式决定了 PSO 能不能收敛。我一般把粒子位置向量拼成三段:前 $K$ 维是各用户功率(归一化到 $[0,1]$,评估时再乘 $P_{max}$ 并归一化满足总功率约束),中间 $2N$ 维是 $N$ 个单元的透射相移和反射相移(范围 $[0,2\pi)$),最后 $N$ 维是能量分割比 $\beta_t^n$(范围 $[0,1]$,反射比自动取 $1-\beta_t^n$)。这样维度是 $K+3N$,一个 16 单元、2 用户的场景就是 50 维,PSO 完全扛得住。

import numpy as np def decode_particle(x, K, N, P_max): """把 PSO 粒子解码成物理变量 x: 粒子位置, 长度 K + 3N 返回: 功率p(K,), 透射相移theta_t(N,), 反射相移theta_r(N,), 透射分割比beta_t(N,) """ p_raw = x[:K] theta_t = x[K:K+N] # 透射相移, 弧度 theta_r = x[K+N:K+2*N] # 反射相移, 弧度 beta_t = x[K+2*N:K+3*N] # 透射能量分割比 # 功率归一化: 保证非负且总和为 P_max p_raw = np.clip(p_raw, 1e-6, None) p = p_raw / np.sum(p_raw) * P_max # 分割比裁剪到 [0,1] beta_t = np.clip(beta_t, 0.0, 1.0) return p, theta_t, theta_r, beta_t

这段解码逻辑有三个要点。第一,功率用“先取正再归一化”而不是直接裁剪,避免粒子飞出边界后总功率不守恒;第二,相移不做裁剪,因为 $[0,2\pi)$ 是周期量,越界等价于取模,评估时用np.mod处理即可;第三,分割比必须裁剪,否则 $\beta_r=1-\beta_t$ 会变成负数,物理上无意义。参数上 $P_{max}$ 是基站总功率,$K$ 是用户数,$N$ 是 STAR-RIS 单元数,这三个量在初始化时就要固定,后面所有评估都依赖它们。

2.3 目标函数与罚函数:约束怎么塞进 PSO

PSO 本身是无约束优化器,所有约束都得进目标函数。我的习惯是把和速率取负作为适应度(PSO 求最小),再把违反约束的量乘一个大罚因子加上去。功率约束已经在解码里强制满足了,真正需要罚的是分割比越界和最小速率约束(如果业务要求每个用户速率不低于门限)。

def fitness(x, K, N, P_max, H, noise, R_min=0.0, penalty=1e4): """适应度函数: 负和速率 + 罚项 H: 信道相关矩阵字典, 含基站到RIS、RIS到各用户的透射/反射信道 """ p, theta_t, theta_r, beta_t = decode_particle(x, K, N, P_max) beta_r = 1.0 - beta_t # 构造透射/反射相移矩阵 Theta_t = np.diag(np.sqrt(beta_t) * np.exp(1j * theta_t)) Theta_r = np.diag(np.sqrt(beta_r) * np.exp(1j * theta_r)) rates = [] for k in range(K): # 等效信道: 直连 + RIS透射 + RIS反射 h_eff = H['direct'][k] \ + H['bs_ris'].conj().T @ Theta_t @ H['ris_user_t'][k] \ + H['bs_ris'].conj().T @ Theta_r @ H['ris_user_r'][k] # 简化SIC: 假设按信道增益降序解码, 这里用总功率近似干扰 sinr = p[k] * np.abs(h_eff)**2 / (noise + 1e-12) rates.append(np.log2(1 + sinr)) rates = np.array(rates) obj = -np.sum(rates) # 负和速率 viol = np.sum(np.maximum(0, R_min - rates)) # 速率门限违反量 return obj + penalty * viol

这里要说明的是,上面 SIC 干扰项做了简化,真实场景里第 $k$ 个用户的干扰是“解码顺序在它之后的用户功率之和”。如果你要严格复现论文曲线,把sinr那行换成按解码顺序累加的干扰即可,结构不变。罚因子penalty取 $10^4$ 量级是经验值:太小约束压不住,太大会让适应度曲面出现悬崖,PSO 容易早熟。R_min是每用户最小速率,没有硬性要求就设 0。

3. 用 PSO 跑通联合优化:初始化、迭代与收敛判据

3.1 粒子群初始化与参数设置

PSO 的玄学大半在参数上。惯性权重 $w$、个体学习因子 $c_1$、社会学习因子 $c_2$、种群规模、最大迭代次数,这五个量决定收敛速度和是否早熟。我踩过的坑是:$w$ 固定 0.9 时前期探索猛、后期在最优解附近震荡不收敛;固定 0.4 又容易陷局部最优。稳妥做法是线性递减,从 0.9 降到 0.4。

def init_swarm(K, N, n_particles=60, P_max=1.0): dim = K + 3 * N # 功率段初始化为均匀分布, 相位段[0,2pi), 分割比[0,1] X = np.random.rand(n_particles, dim) X[:, :K] = np.random.rand(n_particles, K) # 功率原始值 X[:, K:K+2*N] *= 2 * np.pi # 相位 # 分割比已在[0,1], 无需缩放 V = 0.1 * (np.random.rand(n_particles, dim) - 0.5) # 初始速度小 return X, V def pso_optimize(fitness_fn, K, N, n_particles=60, max_iter=200, w_start=0.9, w_end=0.4, c1=1.5, c2=1.5): X, V = init_swarm(K, N, n_particles) pbest = X.copy() pbest_val = np.array([fitness_fn(x) for x in X]) gbest_idx = np.argmin(pbest_val) gbest = pbest[gbest_idx].copy() gbest_val = pbest_val[gbest_idx] history = [gbest_val] for it in range(max_iter): w = w_start - (w_start - w_end) * it / max_iter # 线性递减 r1 = np.random.rand(n_particles, X.shape[1]) r2 = np.random.rand(n_particles, X.shape[1]) V = w * V + c1 * r1 * (pbest - X) + c2 * r2 * (gbest - X) V = np.clip(V, -0.5, 0.5) # 限速防飞散 X = X + V # 边界处理: 相位取模, 其余裁剪 X[:, K:K+2*N] = np.mod(X[:, K:K+2*N], 2*np.pi) X[:, :K] = np.clip(X[:, :K], 1e-6, None) X[:, K+2*N:] = np.clip(X[:, K+2*N:], 0.0, 1.0) vals = np.array([fitness_fn(x) for x in X]) improved = vals < pbest_val pbest[improved] = X[improved] pbest_val[improved] = vals[improved] if pbest_val.min() < gbest_val: gbest_val = pbest_val.min() gbest = pbest[np.argmin(pbest_val)].copy() history.append(gbest_val) return gbest, gbest_val, history

参数说明:n_particles=60对 50 维问题够用,维度再高要加到 80~100;max_iter=200是收敛观察后的经验值,配合history曲线判断;c1=c2=1.5是经典取值,偏向探索可以调大 $c_1$,偏向收敛调大 $c_2$;速度限幅[-0.5,0.5]很关键,不限速粒子会一步飞出可行域,适应度全是罚项,等于白跑。

3.2 收敛曲线怎么读:三种典型形态

跑完 PSO 一定要看history曲线,它比最终数值更能说明问题。第一种是健康形态:前 30 代快速下降,之后平缓收敛,说明探索和开发平衡得好。第二种是阶梯形态:长时间平台后突然跳降,通常是种群多样性不足,靠某次随机扰动才跳出局部最优,解法是增大种群或提高 $c_1$。第三种是震荡不降:适应度在某个值附近来回跳,多半是罚因子太大导致曲面有悬崖,或者速度限幅太松,粒子在边界反复横跳。我一般会跑 5 次独立实验取平均,单次曲线好看不代表稳定。

3.3 和两步法对比:联合优化到底值不值

很多人图省事,先固定 STAR-RIS 相位为随机值,用注水法分配功率,再固定功率调相位,交替几轮。这个交替优化(AO)能收敛,但容易卡在鞍点。我做过对比:在 16 单元、2 用户、$P_{max}=1$W 的设置下,联合 PSO 的和速率比交替两步法平均高约 18%,用户信道相关性越强差距越大。代价是 PSO 单次运行时间约为交替法的 3~5 倍,但离线优化场景完全可接受。如果你的场景要求实时,那得考虑把 PSO 换成学习类方法,这是另一个话题。

4. 避坑与排查:PSO 联合优化里最容易翻车的五件事

4.1 和速率不升反降,曲线比不优化还差

现象:加完 PSO 后系统和速率低于随机相位基线。原因通常是 SIC 解码顺序写反了——NOMA 里信道增益强的用户先解码,它的干扰来自增益弱的用户;如果顺序搞反,SINR 计算全错,优化器在优化一个错误目标。解决:在fitness里显式按等效信道增益排序,先解码增益大的,干扰项只累加排序在后的用户功率,别用总功率近似。

4.2 粒子早熟,20 代后适应度一动不动

现象:收敛曲线早早拉平,换随机种子结果差异巨大。原因是种群多样性丢失,所有粒子被gbest吸过去。解决:把 $w$ 递减区间拉长,或引入随机重启——每 50 代把最差的 20% 粒子重新随机初始化。另一个隐蔽原因是初始相位全在 $[0,2\pi)$ 均匀撒,但最优相位往往集中在某个区间,可以先用粗网格扫一遍相位给个热启动。

4.3 罚因子调不好,约束形同虚设或曲面崩坏

现象:要么分割比越界没人管,要么适应度值巨大、PSO 完全找不到方向。原因是罚因子和原始目标量级不匹配。解决:先跑一次不带罚项的版本,记录和速率的量级(比如几十),罚因子取它的 100~1000 倍。更稳的做法是自适应罚:违反量大的早期用大罚,后期用小罚精细搜索。

4.4 维度一高就崩,50 维以上收敛极慢

现象:单元数从 16 加到 64,PSO 跑 500 代还不收敛。原因是维度灾难,粒子在 $K+3N$ 维空间里探索效率骤降。解决:利用 STAR-RIS 的结构——相邻单元相位通常接近,可以把单元分组,每组共享一个相位变量,维度直接砍到 1/4;或者用分块 PSO,功率块和相位块交替更新。

4.5 仿真结果无法复现,每次跑都不一样

现象:同一套参数,今天和明天跑出的和速率差 10%。原因是随机种子没固定,且 PSO 本身是随机算法。解决:np.random.seed(42)固定信道和初始化,报告结果时说明是 N 次独立运行的平均值加标准差。信道实现也要固定,别每次评估都重新生成H,否则目标函数本身在抖,PSO 无从收敛。

5. 进阶技巧:让 PSO 结果可信、可复现的三个习惯

第一个习惯是给 PSO 配一个“后悔药”——保存每一代的最优粒子位置,而不是只存适应度值。这样收敛异常时能回放,看是相位跑飞还是功率塌缩。我一般把gbest和history一起存成 npz,复现时直接加载对比。

第二个习惯是用小规模穷举做交叉验证。把单元数降到 4、用户数降到 2,维度只有 10,可以网格扫相位、解析求最优功率,得到近似全局最优。拿这个值去校准 PSO 结果,如果 PSO 只能达到穷举的 85%,说明参数没调好,别急着上大规模。

第三个习惯是报告结果时给置信区间。PSO 是随机算法,单次最优值没有说服力。跑 10 次独立实验,报告均值、标准差和最好值,表格长这样:

方案和速率均值 (bps/Hz)标准差最好值
随机相位 + 注水功率3.820.114.01
交替优化 (AO)4.650.084.79
联合 PSO5.480.155.71

这张表才经得起审稿人和同事追问。最后说个我自己的教训:早期我为了追求单次最好值,把种群和迭代拉满,结果过拟合到某组随机信道上,换一组信道就崩。后来固定“60 粒子 × 200 代 + 10 次平均”这套配置,反而更稳。优化算法的价值不在某一次跑出多漂亮的数,而在换场景、换参数后还能稳定复现。希望帮到你。

本文还有配套的精品资源,点击获取

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

ABAQUS与ANSYS怎么选?非线性与工程复杂性的实战对比

1. 先说结论&#xff1a;这两款软件不是"谁更好"&#xff0c;而是"谁更合适"入行这些年&#xff0c;被问得最多的一个问题就是"ABAQUS和ANSYS到底选哪个&#xff1f;"尤其是做非线性分析的朋友&#xff0c;总想找一个一劳永逸的答案。我的回答通…

作者头像 李华
网站建设 2026/9/30 9:20:30

AIoT数字化转型实战:从架构选型到RK3566边缘网关落地

1. AIoT在数字化转型里的真实定位&#xff1a;不是锦上添花&#xff0c;是“通感”的底座 先说个我这些年做项目常碰到的现象。很多企业一说数字化转型&#xff0c;第一反应就是上ERP、上CRM&#xff0c;或者把一堆Excel表格搬进某个SaaS系统里。这些动作当然重要&#xff0c;但…

作者头像 李华
网站建设 2026/9/30 9:18:51

金融客服合规引擎:实时情绪识别与敏感词拦截实战

简介&#xff1a;这份资料面向金融科技从业者、客服系统产品经理及大模型应用开发者&#xff0c;聚焦金融客服场景下质效提升与合规管控的双重难题&#xff0c;给出基于DeepSeek的完整技术方案。内容围绕对话情绪识别与敏感词实时拦截两条主线展开&#xff0c;涵盖语料特征提取…

作者头像 李华
网站建设 2026/9/30 9:17:55

Cocos Creator 场景切换全解析:从机制到实践,告别流程混乱

1. 场景不是"界面"&#xff0c;先理顺 Cocos Creator 中的场景概念与构建配置先说个很多新手都会踩的坑&#xff1a;把"场景"理解成游戏里的一个"页面"。这个概念一旦偏了&#xff0c;后面做场景切换时就会绕很多弯路&#xff0c;尤其是当你想做…

作者头像 李华