资讯动态

柯西分布量子粒子群优化CQPSO在LTE基站选址覆盖优化中的应用

发布时间:2026/10/16 4:06:10 来源:尧图企业网站定制
1. 从现场问题说起基站覆盖率为什么不是一个“多建站”就能解决的问题我在做LTE网络规划优化的时候最常听到的一句话就是“覆盖不行就加站”。这个说法听起来简单但实际做起来完全不是这么回事。某片区基站数量并不算少可是因为地物遮挡、站距不合理、天线参数失配往往会出现一种尴尬局面——路测数据里RSRP平均值挺好看但弱覆盖栅格依然占了一成多投诉电话还是会打到网优那边去。这里面的本质是一个组合优化问题在一个给定的目标区域内从备选站址集合中挑选出若干个基站使得整体覆盖率最大。别小看这个“挑选”它的搜索空间极其恐怖。假设备选站址有40个需要选出12个那么组合数大约是C(40,12)的量级差不多是8.5亿种方案。每一种方案都要做一遍覆盖评估。想靠穷举遍历或者简单贪心策略去找全局最优基本是不现实的。更麻烦的是覆盖率的计算本身就不是一个线性问题。信号传播要经过路径损耗、穿透损耗、阴影衰落再加上高大建筑的遮挡一个位置能不能被覆盖取决于它和所有基站之间的信号强度关系。也就是说你改变任何一个基站的位置或者参数整个区域的覆盖分布都会跟着变。这种目标函数往往存在大量局部极值传统的最优化算法很难稳定发挥。所以我在做这个模拟项目X的时候把目光放到了群体智能算法上。粒子群优化这类算法不依赖梯度信息适合这种非常规的多峰优化问题。但标准粒子群又有一个老毛病——收敛快也容易过早陷入局部最优。为了在收敛速度和全局探索之间取得平衡我在量子的思路基础上引入了柯西分布扰动最终实现了一个“柯西分布量子粒子群优化”CQPSO的Matlab求解方案。下面把这套东西的来龙去脉、数学模型和实现细节完整拆一遍希望能给正在做类似“选址优化”“资源规划”的同学一点启发。2. 算法选型思路从经典PSO到量子粒子群再到柯西分布加持2.1 标准PSO的困境跑得快也容易“撞墙”说起粒子群优化很多做优化的朋友都不陌生。它的想法来自鸟群觅食每个粒子代表一个候选解通过不断向自身历史最优位置和群体全局最优位置学习更新自己的“飞行”方向。标准PSO的速度更新公式如下v(i,:) w * v(i,:) c1 * rand(1,d) .* (pbest(i,:) - x(i,:)) c2 * rand(1,d) .* (gbest(1,:) - x(i,:)); x(i,:) x(i,:) v(i,:);这里w是惯性权重c1、c2是学习因子rand在[0,1]之间随机取值。这版本最大的问题在于“速度盲区”。当粒子飞向gbest的时候如果速度没有及时衰减粒子容易冲过头在最优解附近震荡而不是精细收敛反过来如果w设置偏小种群又会快速趋向同一个位置多样性迅速流失一旦gbest本身不是全局最优整个群体就被“锁死”在那里。我在实验里经常看到标准PSO前20轮收敛气势很猛但后面80轮纹丝不动基本可以断定是陷入局部极值了。2.2 QPSO核心机制量子势阱和平均最优位置量子粒子群优化QPSO和标准PSO最本质的区别是它彻底取消了“速度”这个概念粒子的位置更新基于量子力学中粒子在势阱中的概率分布特性。QPSO的位置更新公式核心是两个量个体最优的加权平均位置mbest以及每个粒子当前最优与全局最优之间的距离。具体公式如下mbest sum(pbest, 1) / N; % N为种群规模 fi rand(1, d) * c; % c 1.49445源自QPSO文献常用值 p fi .* pbest(i,:) (1 - fi) .* gbest(1,:); % 个体吸引子 u rand(1, d); if rand 0.5 x(i,:) p beta * abs(mbest - x(i,:)) .* log(1 ./ u); else x(i,:) p - beta * abs(mbest - x(i,:)) .* log(1 ./ u); end这里的beta收缩扩张系数非常关键。它控制着粒子搜索的“烈度”实验中通常从1.0线性递减到0.5这样前期探索范围大后期逐渐收敛到最优解附近。QPSO的优势在于它能以概率1覆盖整个解空间理论上全局收敛能力优于标准PSO而且没有速度参数需要调的参数更少。2.3 柯西分布扰动长尾巴带来的“跳跃力”QPSO本身已经比标准PSO稳健不少但我在Test函数测试中发现一个现象当问题维度升高、局部极值增多时QPSO容易出现阶段性“卡顿”也就是种群多样性下降得还是太快。这时候引入柯西分布正是为了提高解空间的开拓能力。柯西分布和正态分布最大的区别在于它的尾部更厚也就是说虽然大多数采样值集中在中心附近但出现离群值的概率明显更高。这种“偶尔跳一大步”的特性用在实际算法里就是一种天然的变异机制——粒子有机会脱离当前吸引域跳到另一个较远区域重新探索。我在实现时没有直接替换QPSO的位置更新分布而是把柯西扰动叠加在每次迭代产生的坑位位置上。具体方式是生成一个服从标准柯西分布的随机增量以一定概率比如0.2~0.3施加到部分粒子上cauchy_rnd tan(pi * (rand(1, d) - 0.5)); % 标准柯西分布采样 x(i,:) x(i,:) cauchy_weight * cauchy_rnd;这个扰动幅度如果设置得当可以在不破坏收敛趋势的前提下有效避免整个群体跌入同一个陷阱。简单打个比方正常QPSO就像一队人在陌生山区里沿着已知的小路找营地稳但可能会走偏柯西扰动则是每隔一阵安排一个队员向随机方向踢一脚路边的石头偶尔就能发现一条没标在地图上的岔路。2.4 CQPSO整体流程和伪代码结合起来的CQPSO流程如下初始化种群每个粒子的位置就是一组候选基站编号的编码向量。计算每个粒子对应的覆盖率适应度。更新个体最优pbest和全局最优gbest。计算平均最优位置mbest。对每个粒子执行QPSO基础位置更新。按概率施加柯西扰动并做边界修正。重新计算适应度更新历史最优。判断是否达到最大迭代次数否则回到第3步。这套流程实现起来并不复杂但每一环节的细节都会影响最终效果。尤其是柯西扰动的幅度和施加概率我在实验中反复调了几组参数后面会单独说。3. 覆盖率问题的数学模型与目标函数设计3.1 信号传播模型用Okumura-Hata估算RSRP在LTE网络规划中覆盖率的核心判据通常看参考信号接收功率RSRP。RSRP低于一定门限比如-110dBm就视为弱覆盖这个栅格就不算被覆盖。RSRP的计算需要先估算路径损耗。在城市宏站场景下Okumura-Hata模型是一个经典选择。我在模拟项目X中使用的参数大致如下基站发射功率46dBm约40W天线增益15dBi不含馈线损耗载波频率2GHz接收终端天线高度1.5m基站天线高度35m路径损耗指数和修正项直接采用Hata城市模型路径损耗公式2GHz城市环境可以写成L 46.3 33.9 * log10(f) - 13.82 * log10(hb) - a(hm) (44.9 - 6.55 * log10(hb)) * log10(d);其中f单位是MHzhb是基站天线高度d单位是kma(hm)是终端高度修正因子。对于中等城市a(hm) (1.1 * log10(f) - 0.7) * hm - (1.56 * log10(f) - 0.8)。然后RSRP估算为RSRP txPower antennaGain - L - penetrationLoss - shadowFading;简单场景可以不考虑阴影衰落直接采用距离相关路径损耗如果要更贴近实际可以加一个服从对数正态分布的阴影衰落项。我做的模拟项目X里为了让算法效果更直观也为了减少随机因素干扰选择关闭阴影衰落只考虑距离和地物穿透损耗。3.2 目标区域离散化与覆盖率计算连续区域的覆盖率没法直接计算通常做法是把目标区域划分为均匀网格每个网格点代表一个采样位置。判断一个网格点是否被覆盖就看它的RSRP是否大于预先设置的门限我取-110dBm。覆盖率定义为coverage_rate covered_grid_count / total_grid_count;这个值就是算法的适应度函数。目标就是让它最大化。这里有一个容易被忽视的点栅格划分粒度。网格太细计算量指数增长网格太粗又可能漏掉小面积的覆盖空洞。我的经验是3km乘3km的区域划到80乘80左右就已经能看出比较细致的覆盖覆盖形态了再细化到100以上覆盖率的数值变化很小但耗时明显增加。3.3 约束条件与编码方式基站选址问题不仅要考虑覆盖率还要考虑实际工程约束。比如两个基站不能靠得太近避免干扰预算限制下最多只能建设K个基站站址只能从候选站址集合中选取。在编码上我采用了一个简单直接的方案每个粒子的位置是一个K维向量每一维的取值范围是候选站址的编号索引。如果候选站址离散排布那么编号就是1到N_candidate之间的整数。为了保证粒子的位置在迭代过程中始终有物理意义我在位置更新之后做了一个取整和边界钳制同时检查任意两个基站索引是否相同如果重复则做随机扰动。这种编码会损失一些连续优化算法的优势因为位置是离散的但胜在直观、容易实现而且CQPSO本身对解编码形式不敏感实际优化效果依然不错。如果想要更高精度可以采用实数编码再映射到最近的候选站址但这个方案我没有在模拟项目X里采用原因后面讲。4. Matlab实现中的关键细节与核心代码走读4.1 场景建模与候选站址生成先构建一个20乘20平方公里的区域道路和建筑物分布简化为不同权重的栅格地物衰减。我在模拟项目X里用的是3km乘3km区域地物分为三类市区建筑密集区域、园区开阔区域、郊野低矮区域分别对应穿透损耗25dB、15dB、5dB。栅格为30m乘30m也就是100乘100个栅格点。候选站址不是随机撒的而是根据现有网络布局模拟出一批“可选位置”比如现有杆塔站点、楼顶站点、街边灯杆站等。我生成了30个候选点最终希望从中选出10个站址。每个站址带上位置坐标、高度、可用天线类型这些信息。所有场景数据存放在结构体里scenario.areaLen 3000; % 区域边长单位米 scenario.hotspotGrid zeros(100, 100); % 地物类型权重 scenario.candidateSite [x_coords, y_coords, height, antennaGain];4.2 覆盖率计算函数全套RSRP计算和栅格判断这是整个项目最核心的函数。输入是当前选中的基站坐标和参数输出是该方案下的覆盖率。function coverage calcCoverage(sitePos, scenario) gridX scenario.gridX; % 栅格坐标矩阵 gridY scenario.gridY; thrRSRP -110; % 覆盖门限单位dBm covered zeros(size(gridX)); N size(sitePos, 1); rxPowerSum -Inf * ones(size(gridX)); for i 1:N d sqrt((gridX - sitePos(i,1)).^2 (gridY - sitePos(i,2)).^2); d(d 1) 1; % 防止短路 L 46.3 33.9*log10(2000) - 13.82*log10(35) - 0.98 ... (44.9 - 6.55*log10(35)) * log10(d/1000); rsrp 46 15 - L - scenario.penetrationLoss; rxPowerSum max(rxPowerSum, rsrp); % 最大RSRP原则 end covered rxPowerSum thrRSRP; coverage sum(covered(:)) / numel(covered); end这里有一个工程细节一个栅格点可能同时被多个基站覆盖实际终端会选择接收功率最强的那个小区驻留所以计算时用max合并多个基站的RSRP而不是做简单叠加。这个细节曾经让我吃过亏一开始我用的是所有基站RSRP的线性平均值结果覆盖率虚高后面发现和实际不符改成取最强信号之后才靠谱。4.3 基于柯西分布的变异扰动实现这一小节是整个算法的“灵魂”。在设计CQPSO时柯西扰动我打算加在QPSO位置更新之后但并不是每个粒子都加。具体实现里我采用的是“按粒子概率的扰动策略”% QPSO更新 x_new ... 基础QPSO更新结果... % 柯西扰动 if rand cauchyProb scale cauchyWeight * (1 - iter / maxIter) 0.01; x_new x_new scale * tan(pi * (rand(1,dim) - 0.5)); end % 边界处理 x_new max(x_new, lb); x_new min(x_new, ub);扰动权重为什么要随时间递减原因很简单算法前期需要强探索能力需要长尾大跳跃来探索陌生区域后期接近收敛如果扰动依然很大粒子会在最优解附近来回横跳导致收敛精度变差。我试验下来cauchyProb取0.25、初始cauchyWeight取0.2倍搜索范围比较均衡。4.4 主循环与可视化输出主循环逻辑很直观。在每次迭代结束后我会记录当前最优覆盖率并且每5代重新绘制一次覆盖热力图用不同颜色标识覆盖/未覆盖区域。Matlab的imagesc配合自定义colormap比直接用plot散点图直观得多。for iter 1:maxIter beta 1.0 - 0.5 * (iter / maxIter); % 计算mbest、更新所有粒子 % ... % 柯西扰动 % ... % 适应度评估 for i 1:popSize fitness(i) calcCoverage(decode(x(i,:)), scenario); end % 更新pbest和gbest % 记录convergence(iter) if mod(iter, 5) 0 plotCoverage(gbest, scenario); end end这里需要额外提醒一点calcCoverage函数是整个Simulation里计算量最大的瓶颈。群体规模30、迭代200次就是6000次覆盖率计算每次覆盖率计算要遍历10000个栅格点。所以函数里的矢量化操作必须做充分尽量避免逐个栅格的for循环否则Matlab跑起来会非常痛苦后面我会讲具体的加速技巧。5. 实验设计、参数调优与结果对比分析5.1 实验场景与参数配置我的实验分三组算法对比标准PSO、QPSO、CQPSO共同使用相同的场景、相同的初始种群种子、相同的迭代次数以保证对比公平性。主要参数如下参数PSOQPSOCQPSO种群规模303030最大迭代次数150150150惯性权重w0.6~0.9--学习因子c1/c22.0/2.0--收缩扩张系数beta-1.0→0.51.0→0.5柯西扰动概率--0.25初始扰动尺度--0.2候选站址30个目标建站数10个。覆盖率初始随机方案平均在72%左右。5.2 覆盖率与收敛行为对比三组算法各跑10次记录最好覆盖率、平均覆盖率、收敛代数。从我的实验结果看标准PSO最好覆盖率约为86.7%平均85.9%但多次实验的方差较大有的实验收敛到84%就完全停滞。QPSO最好覆盖率约为89.2%平均88.5%整体明显优于PSO收敛曲线平滑后期仍有缓慢爬升。CQPSO最好覆盖率约为91.4%平均90.8%主要优势在于多次实验的最差结果依然能到89%以上说明它更稳定而且后期被“锁死”的概率大幅降低。从收敛曲线看CQPSO初期收敛速度和QPSO接近但在迭代60代之后QPSO往往进入平台期而CQPSO还能通过柯西扰动跳出来找到新的更优位置。那批“跳变点”在曲线上表现为一个向上台阶隔几代出现一次。这正是重尾分布发挥作用的表现。5.3 最优站址方案的覆盖热力图解读我把最优方案画成热力图后发现几个有意思的现象算法自动把站址往“地物衰减大”的区域适当加密而宽敞开阔的区域站间距拉得更大。区域边缘地带出现明显的“塔下黑”缓解因为基站并非均匀分布而是和信号传播损耗做了匹配。存在冗余覆盖的情况比较少选出的10个站址之间距离都大于最小间隔约束没有出现两个站几乎重叠的浪费情况。通过对比初始随机方案和CQPSO最优方案可以看到未覆盖栅格从28%下降到8.6%并且这些未覆盖栅格基本集中在场景角落和极少数被高层阻挡的区域这是纯路径损耗模型下能接受的结果。6. 实战中的坑与填坑实录6.1 栅格分辨率带来的“假收敛”我在实验早期把栅格设得非常粗只有20乘20算出来的覆盖率轻松到了95%。后来改到80乘80同样的方案掉到88%。原因很简单粗网格天然忽略了小面积的弱覆盖缝隙。所以对比算法效果时一定要固定栅格粒度不能今天用20乘20明天用80乘80。建议最终评估统一用100乘100的细网格宁可多花计算时间也要让结果经得起推敲。6.2 柯西扰动“尺度太大会炸”我在调参阶段踩过一个很典型的坑初始cauchyWeight设成0.8倍搜索范围结果粒子整天往边界外面飞修边界修到手软覆盖率反而比不加扰动还差。后来分析发现柯西分布采样值偶尔会出现十几倍于标准差的极端值如果不限制扰动幅度的上限粒子位置会严重脱离可行区域边界截断又会让大量粒子堆积在边界上损害种群多样性。最终我把扰动幅度分成两项第一是整体缩放因子随时间递减第二是限制单次扰动的绝对幅度不能超过解空间范围的0.3倍。按这个逻辑重新调参后效果立刻好转。6.3 重复站址冲突的处理离散编码的问题是位置更新后粒子向量的各维可能收敛到同一个候选站址这样实际建站数会少于预设值覆盖率虚高。我一开始没注意后来检查输出才发现的。解决办法很简单在评估覆盖率之前做一个去重和补缺把重复的维度替换为当前概率最低的未使用候选站或者随机替换一个未使用站。6.4 Matlab执行效率大幅优化覆盖率函数里三重for循环是最容易拖垮Matlab的写法。我初始版本用了嵌套循环跑一次迭代花了40秒整个人都裂开了。后来做了几个改造所有栅格点和基站的距离计算全部矢量化利用隐式扩展处理。RSRP计算不在循环里调用log10等耗时函数而是把所有常数项预先合并成紧凑公式。利用profiler定位热点原来是max函数在混合维度下反复创建临时矩阵通过预先分配输出矩阵单次覆盖率计算时间压缩到0.08秒。如果你拿到的工程规模很大还可以考虑把覆盖率函数打包成MEX或使用并行池不过我的场景经过矢量化之后已经够用就没有再往复杂里改。6.5 随机种子的控制如果你想严谨对比算法一定要在实验脚本开头固定随机种子。否则一组实验结果可能是运气好、另一组运气差完全失去可比性。我在测试脚本里使用rng(42, twister);每条独立实验前重置一次并记录随机种子到结果文件名里方便复查。7. 最后再分享一点个人心得做这类“智能优化算法工程问题”的项目最容易犯的一个误区是过度迷信算法把整篇文章的重心全放在了优化算法本身反而把覆盖率计算、场景建模这些基础工程做得很粗糙。我实际做下来的体会是覆盖率模型的可信度决定了整个优化结果的上限。算法再强如果信号传播模型脱离实际或者场景栅格划分根本不反映真实地物那跑出来的“最优解”只是数学上的最优放到现实中一堆站址根本没法评判。所以在动手调算法之前建议先把场景建模和覆盖率评估函数做到自己敢拿出去复盘的程度。另一方面柯西分布引入QPSO这件事本身并不复杂但参数对结果的影响比想象中大。如果你准备在自己项目中借鉴建议按“先固定随机种子→固定场景→跑基准QPSO→逐组调柯西概率→逐组调扰动尺度”这个顺序做实验每一步只动一个变量才不会陷入参数调优的大坑。这个模拟项目X的框架后续还可以扩展不少方向比如把覆盖率判据从单一RSRP门限改成RSRP和SINR联合判断或者在适应度函数中加入建站成本约束、负载均衡因子等等。Matlab代码整体上保持着清晰的模块边界替换传播模型和评估函数都很方便拿来当算法研究和网络规划的测试骨架应该能省下不少重复造轮子的时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑