☰
基于柯西分布量子粒子群的LTE基站覆盖率优化方法
2026/10/15 5:52:17 网站建设 项目流程

LTE网络基站覆盖率优化这活儿,干过网络优化的人都知道,不是靠拍脑袋调几个参数就能拿下的。最近我把一套基于柯西分布量子粒子群优化的求解方法在Matlab里完整跑通了,专门用来解决多基站多参数下的覆盖问题,顺便把覆盖率从84%左右干到了95%以上。今天把这套件拆开揉碎写清楚,包含建模思路、算法改进点、完整代码设计和调试经验,适合正在做无线网络规划、智能优化算法应用,或者被导师丢了一个“粒子群改进方向”的同学参考。

我自己刚开始接触这个题目的时候,也犯过不少嘀咕:覆盖率问题不是拿仿真软件拉一下就行吗,为什么要写优化算法?后来在真实调整场景里发现,基站发射功率、天线方位角、下倾角之间的关系是非线性的,一个站调完另一个站又顶掉了,手工搜参完全跑不满范围。把问题变成“找一组参数让覆盖率最大”的目标函数之后,用改进粒子群去搜就是顺理成章的事了。量子粒子群和标准粒子群的区别,柯西分布又改了哪里,怎么做成Matlab能跑的代码,这篇文章都会讲到位。

1. 项目拆解:从“调站”说起,到底在优化什么

1.1 核心问题:人工调不了多基站联合覆盖

先明确一个概念。LTE网络基站覆盖率,通俗讲就是在一个区域内,有多少地方能收到质量足够的参考信号。这里“质量足够”在工程上通常看RSRP(参考信号接收功率),单位是dBm,城区一般认为RSRP大于等于-105dBm可以算覆盖良好,大于等于-110dBm算边缘覆盖。

多基站覆盖的复杂之处在于,每个基站都有几十个可调参数,最影响覆盖的三个是发射功率、水平方位角和下倾角。假设有4个站,至少要调12个参数。而且这些参数互相影响:A站下倾角压低了,原本由A站覆盖的远端区域可能落入B站,但是B站这时候的方位角如果不对,那边就会变成弱覆盖区。人工经验只能做粗调,精细优化需要自动化搜索。

这个项目要做的事就是把问题转成数学模型:把目标区域划成网格,计算每个网格点的最佳RSRP,统计达到阈值的网格比例,然后用改进量子粒子群去搜索一组最优的“功率+方位角+下倾角”组合,让覆盖率最大化。

1.2 方案为什么这么选:量子粒子群加柯西分布的动机

很多人会问,普通的粒子群优化(PSO)不是也能做参数搜索吗?为什么非得用量子粒子群,还要叠一个柯西分布?

这就是我实际跑下来才理解的地方。标准PSO的核心是两个东西:每个粒子的速度和位置,以及个体最优、全局最优的牵引。速度更新公式里有两个随机项,整个算法本质上模拟的是一群鸟在搜索空间里飞,飞得越久越靠近全局最优。但它的一个大毛病就是容易早熟,群体一旦都聚到一个局部最优附近,速度项很快衰减,粒子基本飞不动了,最终结果就是陷入一个局部解,覆盖率停在某个不理想的位置上。

量子粒子群优化(QPSO)改变了思路。它不再维护粒子的“速度”,而是认为粒子位置是由一个波函数的概率密度描述的,位置更新直接通过蒙特卡洛采样得到。这样做最大的好处是粒子没有速度衰减机制,即使到迭代后期也有一定概率跳到较远的位置,一定程度上克服了早熟问题。标准PSO好比是一个人跑步追目标,QPSO则像一只量子状态的“幽灵”,它不能确定自己在哪,只能根据概率出现在某个地方,天然多了一种探索性。

那柯西分布又是在什么位置介入的?标准QPSO的位置更新依赖均匀分布随机数产生的一个扰动项,均匀分布没有厚尾,产生的扰动值几乎都集中在一个范围内,粒子仍然容易待在局部区域附近。柯西分布不一样,它的概率密度函数的尾巴非常长,有较大概率抽到很大的值,相当于给了粒子一个“偶尔跳一大步”的能力,让它在卡住的时候有机会蹦出去探索更远的方向。这就是我最终确定“柯西分布量子粒子群优化”这个组合的原因。

2. LTE覆盖模型:把“覆盖好”写成数学语言

2.1 传播模型与RSRP计算

优化算法的核心在于目标函数,LTE覆盖率问题的目标函数首先要把每个网格点的RSRP算出来,而RSRP计算的骨架是传播模型。这里常用的模型是Cost231-Hata,适用于1500MHz到2000MHz的城区宏站场景,正好匹配LTE常用的2GHz频段。

Cost231-Hata路径损耗公式如下:

PL=46.3+33.9·log10(f)-13.82·log10(hb)-a(hm)+(44.9-6.55·log10(hb))·log10(d)+Cm

其中f是频率,单位MHz;hb是基站天线高度,单位m;hm是终端高度,单位m;d是距离,单位km;Cm是城市修正因子,大城市中心取3dB,中等城市取0dB。a(hm)对于市区场景的常用形式是:

a(hm)=(1.1·log10(f)-0.7)·hm-(1.56·log10(f)-0.8)

把这个公式放到Matlab里实现时,我建议直接做成一个函数,输入是距离向量,这样后面计算整个网格的距离矩阵时可以直接用点乘运算,避免循环。

除了路径损耗,实际RSRP还要叠加天线方向和穿透损耗。天线增益我用了简化的3GPP方向图模型:水平半功率波束宽度取65度,垂直半功率波束宽度取12度,最大增益取15dBi,旁瓣抑制取20dB。下倾角会直接影响垂直方向的角度偏差,这个在计算天线增益时必须带入。穿透损耗按城区典型值取15到20dB,视障环境不同可以自己调整。

最终每个网格点的RSRP由所有基站分别计算,然后取最大值,模拟站点选取最强信号的自然过程:

RSRP=max_k(P_t,k-PL_k-L_penetration+G_k)

P_t是基站k的发射功率,单位dBm;G_k是天线增益,单位dBi;L_penetration是穿透损耗。这个式子写出来以后,目标函数就清晰了。

2.2 优化变量、目标函数与约束

我设置的目标区域是一个模拟的5000m乘4000m矩形片区,网格步长取50m,一共生成101乘81约8100个网格点。基站在区域内固定放置4个,每个站的可变参数是:

  • 发射功率,范围30到46dBm
  • 水平方位角,范围0到360度
  • 机械下倾角,范围0到15度

因此优化变量的维度是12。每个粒子的位置就是一组12维向量,前三个数对应第一个基站,以此类推。

覆盖率定义为网格中RSRP大于等于-105dBm的点数占总点数的比例。目标函数就是最大化这个比例。仿真场景没有额外约束的话,越界参数直接通过边界操作处理,这部分在算法实现里再展开。

提示:如果你后续想做得更贴近工程实际,还可以加一个边缘覆盖约束,比如所有覆盖点的RSRP最小5%分位不能低于某个值,但基础版本先以覆盖比例为单一目标即可。

3. 柯西分布量子粒子群的核心机制

3.1 标准QPSO的更新逻辑

先过一遍标准QPSO,然后看柯西分布是怎么改进去的。标准QPSO里每个粒子有一个pbest(自身历史最优)和整个种群的gbest(全局最优)。第一步先算所有pbest的平均值mbest:

mbest=(1/N)·Σpbest_i

第二步为每个粒子生成一个局部吸引子p_i:

p_i=φ·pbest_i+(1-φ)·gbest

这里φ是一个0到1之间的均匀分布随机数。第三步更新粒子位置:

x_i(t+1)=p_i±β·|mbest-x_i(t)|·ln(1/u)

u同样是0到1之间的均匀随机数,β是收缩扩张系数,通常随迭代线性递减。正负号随机选取。这个公式的逻辑是,粒子被吸引向p_i方向移动,移动距离由α和mbest决定,ln(1/u)部分则引入随机扰动。β从1.0逐渐降到0.4左右,前期探索范围大一些,后期收敛到局部精细搜索。

3.2 柯西分布的落点与实现

标准QPSO里的随机扰动ln(1/u),本质上是参数为1的指数分布随机数。指数分布的特点是尾巴衰减非常快,基本不会产生极大的数值,因此粒子很难发生“远距离跳跃”。一旦群体聚集在一个局部最优附近,想要跳出来就需要这种远距离跳跃能力,指数分布给不了,而柯西分布恰恰能给。

柯西分布的概率密度函数是:

f(x)=1/(π·(1+x²))

它的尾巴按x²衰减,比指数分布慢得多,所以随机抽样时出现的极值概率显著更高。用柯西随机数的绝对值去替换ln(1/u),就得到了柯西量子粒子群更新式:

x_i(t+1)=p_i±β·|mbest-x_i(t)|·|C|

其中C服从标准柯西分布。取绝对值是为了保证扰动方向不影响符号随机性,逻辑上也更直观。

柯西随机数用反变换法生成:标准柯西分布的累积分布函数为F(x)=0.5+arctan(x)/π,反解出x=tan(π·(U-0.5)),U是均匀分布。Matlab里一个函数就够了:

function c = cauchyRand(n) % 通过反变换法生成标准柯西分布随机数 u = rand(n); c = tan(pi * (u - 0.5)); end

我实验中发现一个细节:直接生成的柯西随机数偶尔会出现绝对值非常大的值,比如几百甚至上千,这会直接把粒子踢到边界外面。初代问题不大,但迭代后期会破坏收敛性。所以我会对柯西随机数做一个粗略的缩放,除以平均绝对值,使它的量级维持在1附近,同时保留厚尾特性。这个处理不是必须的,但实测能明显改善收敛曲线的平滑度。

4. Matlab代码实现与关键步骤

4.1 整体代码框架

整个项目我按四个脚本函数拆分:主脚本、柯西量子粒子群主函数、覆盖率计算函数、辅助工具函数。拆开的好处是覆盖率计算和算法本体完全解耦,以后换一个信号衰减模型,或者换成WiFi覆盖、水声通信覆盖,只需要改覆盖率计算函数,算法部分不用动。

主脚本流程大概是:

  1. 设置仿真场景参数(区域大小、网格步长、基站坐标、频段、发射功率范围等)
  2. 初始化种群,每个粒子是12维向量
  3. 迭代调用柯西量子粒子群更新函数,每代计算一次所有粒子的覆盖率
  4. 记录每一代gbest,生成收敛曲线
  5. 绘制RSRP热力图和覆盖边界

4.2 粒子更新主循环核心代码

柯西量子粒子群主函数的核心更新逻辑如下,这是整套算法最值钱的部分:

function [gbest, gbestScore, hist] = cqpso(func, dim, lb, ub, swarmSize, maxIter) % 初始化粒子位置 X = rand(swarmSize, dim) .* (ub - lb) + lb; pbest = X; gbest = X(1, :); gbestScore = inf; % 初始化收缩扩张系数参数 beta0 = 1.0; beta1 = 0.4; % 计算初始适应度 scores = zeros(swarmSize, 1); for i = 1:swarmSize scores(i) = func(X(i, :)); if scores(i) < gbestScore gbestScore = scores(i); gbest = X(i, :); end end pbestScore = scores; hist = zeros(maxIter, 1); for t = 1:maxIter beta = beta1 + (beta0 - beta1) * (1 - t / maxIter); mbest = mean(pbest, 1); for i = 1:swarmSize phi = rand(1, dim); p = phi .* pbest(i, :) + (1 - phi) .* gbest; % 柯西扰动,按平均绝对值做一次缩放 C = cauchyRand([1, dim]); C = C / mean(abs(C)); if rand() < 0.5 Xnew = p + beta * abs(mbest - X(i, :)) .* abs(C); else Xnew = p - beta * abs(mbest - X(i, :)) .* abs(C); end % 越界处理:随机重置到界内,而不是直接夹在边界 Xnew = boundReset(Xnew, lb, ub); newScore = func(Xnew); if newScore < pbestScore(i) pbest(i, :) = Xnew; pbestScore(i) = newScore; end if newScore < gbestScore gbestScore = newScore; gbest = Xnew; end X(i, :) = Xnew; end hist(t) = gbestScore; end end

这里我的目标函数统一定义为最小化问题,所以覆盖率写成了负值。如果你习惯最大化,直接传给func时取个负号即可。越界处理用了随机重置,这个细节后面我会在问题排查里解释为什么不用直接夹紧方式。

4.3 覆盖率计算与可视化

覆盖率计算函数是整个目标函数的核心,需要仔细写。我把Cost231-Hata路径损耗和天线增益都抽成了小函数,便于维护:

function cov = calcCoverage(x, para) nSt = para.nSt; Pt = x(1:3:end); Az = x(2:3:end); Tilt = x(3:3:end); X = para.X; % 网格点x坐标矩阵 Y = para.Y; % 网格点y坐标矩阵 RSRPbest = -inf(size(X)); for k = 1:nSt d = sqrt((X - para.Bx(k)).^2 + (Y - para.By(k)).^2); d(d < 1) = 1; % 防止log10(0) % Cost231-Hata路径损耗 PL = cost231hata(d / 1000, para.f, para.hb, para.hm, para.cityType); % 水平角与方位角偏差 angleHoriz = atan2d(Y - para.By(k), X - para.Bx(k)); deltaAz = mod(angleHoriz - Az(k) + 180, 360) - 180; % 垂直角偏差 angleVert = atand((para.hb - para.hm) ./ d); deltaTilt = angleVert - Tilt(k); % 简化天线方向图增益 G = antennaGain(deltaAz, deltaTilt, para); RSRP = Pt(k) - PL - para.penetrationLoss + G; RSRPbest = max(RSRPbest, RSRP); end cov = sum(RSRPbest(:) >= para.threshold) / numel(RSRPbest); end

天线增益函数实现:

function G = antennaGain(deltaAz, deltaTilt, para) % 简化3GPP天线方向图模型 hLoss = -min(12 * (deltaAz / para.hpbw).^2, para.sll); vLoss = -min(12 * (deltaTilt / para.vpbw).^2, para.sll); G = para.gMax - min(-(hLoss + vLoss), para.sll); end

注意水平角度差的计算,用mod把差值映射到[-180, 180]区间再代入模组,否则方位角从350度转到10度时会产生一个340度的伪差,天线增益会被严重低估。这个坑我一开始就踩了,后来才意识到是角度归一化的问题。

可视化用pcolor叠加基站位置和阈值等值线:

figure; pcolor(para.X, para.Y, RSRPbest); shading interp; colormap(jet); colorbar; hold on; plot(para.Bx, para.By, 'kv', 'MarkerSize', 10, 'MarkerFaceColor', 'k'); [C, h] = contour(para.X, para.Y, RSRPbest, [-105, -100], 'k-'); clabel(C, h); title('RSRP热力图与覆盖边界');

5. 一组模拟实验与参数调优记录

5.1 实验设置与一组典型结果

为了验证柯西量子粒子群确实优于标准量子粒子群,我做了对照实验。场景参数如下:

参数取值
区域范围5000m x 4000m
网格步长50m
基站数量4
频率2000MHz
基站高度30m
终端高度1.5m
穿透损耗15dB
覆盖阈值-105dBm
粒子数30
最大迭代数100

初始随机方案的覆盖率在82%到86%之间波动,因为基站间互相干扰和空洞比较多。标准QPSO跑到100代收敛在93.4%左右,柯西分布版本收敛到95.6%左右,提升超过2个百分点。收敛曲线在前期就能看出差异,CQPSO大概到30代就已经超过标准QPSO最终值,后面50代在继续微调。

覆盖率提升2个百分点看起来不多,但在实际场景里,一个6000平方公里的片区每提升1%覆盖,就相当于多覆盖几百个弱覆盖点,如果是城区密集区,这一部分往往对应重要道路和楼宇周边,价值不小。

5.2 几个关键参数怎么定

粒子数swarmSize。我建议取30到40。少于20时种群多样性太差,柯西的厚尾也救不回来;大于60时计算量明显上升,但覆盖率提升非常有限。30是一个性价比很高的平衡点。

收缩扩张系数β。从1.0线性降到0.4,前半程保证大范围探索,后半程做精细收敛。如果降得太快,比如从1.0直接跳到0.5,迭代后期粒子会很快失去多样性;如果终值低于0.3,又可能因为扰动太小陷入局部解。

柯西随机数缩放。这是我额外加的一步,把C除以平均绝对值,让扰动量的典型量级稳定在1附近。不缩放也能收敛,但收敛曲线会出现明显毛刺,偶尔会有粒子突然蹦到边界重新开始,单次运行方差变大。

最大迭代数。100代足够。覆盖率在这个规模下通常在60代左右开始平缓,跑再多代边际收益很低,耗时反而翻倍。

6. 常见问题与排查技巧实录

现象可能原因解决办法
覆盖率收敛到90%以下就停了粒子越界后被直接夹到边界值,大量粒子堆在边界越界粒子改为在界内随机重置,恢复种群多样性
收敛曲线上下抖动剧烈柯西随机数未缩放,极值过大对柯西随机数做平均绝对值缩放
RSRP计算结果出现NaN网格点与基站的距离为0,log10(0)报错距离矩阵加1m下限
迭代初期涨得很快,中期停滞β下降过快,探索能力衰竭放慢β衰减,或提高β初值到1.2
天线方位角算错角度差没有归一化到[-180, 180]用mod(delta+180,360)-180统一处理
计算耗时特别大网格过密或距离循环没有向量化网格步长取50m,距离矩阵用向量化计算

除了表格里的问题,还有一个小技巧是我摸索出来的:每次迭代结束时,可以把gbest对应的RSRP热力图输出一版,看看覆盖率提升的同时,弱覆盖点是怎么变化的。如果发现某个区域的弱覆盖始终没改善,大概率是那一带的基站参数没被搜到,可以试试在那个基站旁边增加一个粒子初始值,或者在目标函数里加一个局部权重。

越界处理的方式值得专门说一嘴。很多人写粒子群喜欢把越界值夹到上下边界,写起来非常省事,但这会导致大量粒子堆在边界平面上,多样性急剧下降。我在这个项目里一开始也是夹紧,结果覆盖率一直在91%上不去,改成随机重置之后很快就破了93%。原因其实很简单:边界附近往往是参数范围的极端值,多个粒子跑到同一个边界会变成“复制人”,群体探索能力被白白丢掉了。

7. 一些可以继续扩展的方向

这个项目跑通之后,我给它扩展了两三个变体,都是很小的改动但效果不错。第一种是把目标函数从“覆盖率最大化”改成“覆盖率最大化加最低RSRP分位的惩罚”,这样搜索出来的方案在边缘区域表现更好,不会出现为了覆盖率牺牲边缘用户的情况。第二种是把基站开关状态加入优化变量,适合夜间节能减排场景。第三种是引入动态网格,在弱覆盖区域加密网格,在覆盖良好区域稀疏化,减少计算量。

如果你要继续深入这个方向,建议把重点放在目标函数的工程化上,算法层面的柯西改进已经很成熟了。覆盖率计算的建模精度才是决定优化结果上限的关键,传播模型修正、天线方向图校准、干扰矩阵引入,每一步都比单纯调算法参数带来的收益大。

我自己的体会是,这类“改进优化算法+工程问题求解”的项目,最忌讳的就是过度纠结算法细节而忽略问题建模。代码里把柯西分布换成其他分布很容易,但如果把路径损耗模型的频率适用范围搞错了,就算算法收敛得再漂亮,结果也是不可信的。做这块最好的路径是先吃透覆盖问题本身的物理意义,再动手改算法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询