
1. 问题建模思路先把“覆盖率”变成一个能被算法优化的数学对象1.1 基站覆盖率优化为什么是个“一眼看不透”的难题做LTE网络规划的朋友都知道基站位置选得好不好直接决定了覆盖、容量和干扰这三本账。尤其是室外宏基站站址一旦定了后期再想去挪位置牵扯到物业、传输、天面协调代价极高。所以在规划阶段就尽量把覆盖率做上去是性价比最高的做法。但这里面有个尴尬的现实基站覆盖率问题从数学上看是一个典型的非凸、多峰、带约束的组合优化问题。基站数量和位置是离散与连续混合的变量覆盖效果又和地形、传播环境、频率、天线倾角搅在一起。你很难用常规梯度方法去优化因为目标函数根本不光滑甚至很多格点覆盖不覆盖是“跳变”的。稍微换一组站址覆盖率可能从85%掉到70%。传统的遍历搜索更不可行——在一个2km×2km的城区里放10个站位置组合的空间基本上是天文数字。这时候工程上普遍的做法就是用群体智能算法去逼近最优解。粒子群优化PSO是这个领域的老熟人了原理简单、实现容易、收敛也快。但做过的同学应该深有体会标准PSO在这个问题上特别容易早熟粒子飞到一定阶段就全挤在某个局部峰附近覆盖率锁定在82%左右再也上不去。原因在于标准PSO靠速度更新粒子的搜索轨迹受惯性权重和学习因子约束一旦所有粒子的个体最优和全局最优都趋于一致速度就会迅速衰减群体失去探索能力。我最初复现这个题目时用的就是标准PSO结果在多个随机初值下最终覆盖率一直稳定在一个不太理想的值域。后来才意识到不是问题本身没得优化而是算法的逃逸能力不够。这也是为什么后来的版本里我换成了量子粒子群优化QPSO并在其中引入柯西分布策略的原因。1.2 为什么选量子粒子群优化这条技术路线标准PSO的困境本质上来自它的“轨道模型”——粒子像经典力学中的小球在解空间里沿速度方向运动。量子粒子群优化QPSO换了个思路粒子不再有明确的速度向量而是由一个量子波函数来描述位置通过围绕某个吸引子的概率采样得到。这样一来粒子可以在解空间的很大范围内保持“不确定性”理论上不存在速度为零导致的停滞问题全局搜索能力更强。但QPSO也不是银弹。它有两个软肋一是随着迭代推进收缩扩张系数会让种群逐步收敛如果陷入局部最优想跳出来同样需要外部扰动二是它的随机采样用的是指数分布产生的扰动量级在后期偏小一旦粒子群聚拢步长不足以跨出局部盆地。所以这个题目里的“柯西分布”改良就有了明确的目标利用柯西分布重尾的特性在算法后期仍然有一定概率产生大幅度的随机扰动把粒子从局部最优附近“踹出去”同时保留QPSO收敛快、参数少、全局性好的底子。整条技术路线可以概括成四个字重尾逃逸。我后面会详细拆解这个改进怎么落到Matlab代码里以及我在复现过程中踩过的坑。先把模型说清楚因为算法再强靶子画歪了也白搭。2. 覆盖率问题建模先有精准的靶子才能谈算法2.1 覆盖区域网格化与传播模型要做覆盖率优化第一步是定义“覆盖率”到底怎么算。我用的方案是均匀网格化把整个规划区域划分成等间隔的格点每个格点看作一个潜在用户位置然后计算每个格点收到的参考信号接收功率RSRP如果某个格点收到的最大RSRP高于设定阈值就认为这个格点被覆盖。网格粒度直接影响算法的计算量和精度。我在复现中把研究区域设为2km×2km的正方形区域网格间隔选50m这样一共有41×411681个格点。这个粒度在工程上够用算起来也快。如果网格缩到25m格点会膨胀到6889个覆盖率计算一次虽然也能跑但算法要做几百上千次适应度评估总耗时立刻上去了。所以建议做学术复现时先用50m粒度验证算法逻辑再按需加密。传播模型我用的是Cost231-Hata扩展模型适用于2GHz频段、城市宏蜂窝场景。路径损耗公式如下PL 46.3 33.9×log10(f) − 13.82×log10(hb) − a(hm) (44.9 − 6.55×log10(hb))×log10(d) Cm其中f为频率MHzhb为基站天线高度mhm为终端天线高度md为基站到终端的距离kmCm为城市修正因子大城市约3dB。a(hm)是移动台高度修正因子在2GHz、大城市环境下近似为a(hm) 3.2×(log10(11.75×hm))² − 4.97我建模时用的参数是f2000MHzhb35mhm1.5m那么a(hm)算出来大约是0.33dB。基站发射功率Pt取43dBm天线增益Gt取17dBi线缆损耗取2dB。覆盖阈值设为RSRP ≥ −105dBm这是LTE网络规划的常见标准。在距离d很小的地方传播模型会出现log10(d)为负无穷的异常所以我在代码里给d加了保护最小值不小于50m。这个细节别看小不加的话靠近基站的格点覆盖会算出离谱的负无穷结果直接污染适应度。2.2 目标函数与约束条件的设计细节网格点和传播模型定下来后某个基站部署方案对应的覆盖率就可以计算了。计算路径是遍历所有基站对每个网格点计算各基站到达该点的RSRP取最大值作为有效接收电平然后和阈值比较。如果某个格点被至少一个基站覆盖就标记为覆盖格点。覆盖率Coverage就是Coverage 覆盖格点数 / 总格点数这个指标本身是越大越好但群体智能算法习惯处理最小化问题我一般做一步转换定义优化目标为未覆盖率Fitness 1 − Coverage让算法去最小化这个Fitness值逻辑上更顺画收敛曲线时也是单调下降的趋势和文献里的习惯一致。约束条件的处理同样关键。这个题目里主要有三类约束一是基站数量固定假设规划区内部署N个宏基站这个N在优化过程中不变只优化它们的位置。位置变量用(x, y)坐标表示维度就是2N维。二是边界约束基站必须落在规划区域内不允许漂到区域外面。我在代码里用上下界绑定变量维度每个维度的范围都是[0, 2000]。三是最小站间距约束工程上基站太近会造成严重干扰我设置LTE宏站的最小站间距为300m。这个约束在基础版实现里不好直接塞进适应度函数因为一旦当惩罚项用需要人工调惩罚系数很容易把目标函数搞失真。我后来采用的处理方式是在适应度函数里增加一个轻微的惩罚项一旦两个基站距离小于300m就在未覆盖率基础上加上一个惩罚增量让算法主动远离这种方案。目标函数、网格化、传播模型这三位一体弄清楚了后面的算法才有发挥空间。很多人在这一步图省事直接把覆盖率的计算公式简化成“距离小于某个半径就算覆盖”这在对比算法优劣时问题不大但如果要把绝对数值拿出来说事和真实规划对不上就站不住脚了。3. 算法内核拆解量子粒子群凭什么比经典粒子群强3.1 经典粒子群优化PSO的两个致命弱点聊QPSO之前必须先说清楚它的父亲——PSO——是怎么运作的否则后面所有改进都像空中楼阁。标准PSO里每个粒子的状态由位置和速度两个向量组成。迭代过程中粒子根据两个“榜样”来更新速度一个是自己的历史最优位置pBest一个是整个群体的全局最优位置gBest。更新公式是v(t1) w×v(t) c1×r1×(pBest − x(t)) c2×r2×(gBest − x(t))x(t1) x(t) v(t1)w是惯性权重c1、c2是学习因子r1、r2是(0,1)随机数。这个模型在中小规模问题上很管用但它有两个先天缺陷。第一个缺陷是参数敏感w、c1、c2的搭配非常影响收敛行为调参调得人想摔键盘。设置的w太大粒子像无头苍蝇w太小又收敛太快直接困在局部。第二个缺陷更致命当所有粒子的速度都因为惯性衰减和学习项趋同而变得很小时整个种群就失去了多样性。一旦此时gBest落在局部最优附近的盆地粒子再怎么飞也飞不出去。我在跑LTE覆盖率问题时标准PSO的表现可以概括为“前半程猛如虎后半程原地杵”。前50次迭代覆盖率就冲到一个水平后面两三百次迭代几乎纹丝不动。这不是个例是这个算法本质决定的。3.2 量子粒子群优化的力学模型与位置更新公式QPSO一上来就把“速度”这个概念扔掉了。它的思想来自量子力学中的束缚态模型粒子在量子空间中运动没有办法同时确定精确位置和动量只能用波函数来描述它出现的概率分布。在优化问题中每个粒子被一个“势阱”吸引势阱中心是它自己的pBest和全局gBest共同决定的一个吸引子位置P粒子以这个吸引子为均值、以与平均最好位置的距离为尺度以一定的概率密度出现在周围然后再套一个概率阈值来决定具体位置。先算平均最好位置mbest这是QPSO特有的概念mbest (1/N) × Σ pBest_i它的物理含义是种群整体的平均水平用来衡量当前粒子们“历史最佳状态的质心”。这个量在更新公式里起到一个参照系的作用让粒子的采样范围不会只依赖单个个体信息而是带着群体统计特征。然后对每个粒子计算吸引子P_i φ×pBest_i (1−φ)×gBest其中φ是(0,1)均匀分布的随机数。这个式子可以理解成“动摇摆舞”粒子在向自己的历史最优靠近和向群体最优靠近之间随机偏向φ决定了偏心的程度。最后是位置更新核心公式x_i(t1) P_i ± β × |mbest − x_i(t)| × ln(1/u)u是(0,1)均匀随机数β是收缩扩张系数。正负号以0.5概率随机选择这相当于量子力学中的“隧穿”行为粒子既可能向吸引子靠拢也可能远离吸引子保持种群发散能力。从这个公式可以明显看到QPSO没有速度、没有惯性权重、没有学习因子全局参数只有一个β。这就是它最招人喜欢的地方——参数大幅度减少算法鲁棒性天然地好一点。β怎么设我用的经验策略是线性递减迭代初期β1.0鼓励大步探索迭代末期β0.5加强收敛。具体公式是β(t) 1.0 − (1.0 − 0.5) × (t / MaxIteration)如果MaxIteration取400那么前期的粒子的搜索范围相对较大后期逐步收紧。这个设计思路和模拟退火的降温过程很像核心就是“先探索后开发”。3.3 收缩扩张系数与算法收敛性的关系QPSO的收敛行为几乎完全由β决定这一点和PSO需要调三个参数相比是巨大优势。但β也绝不是随便设个固定值就行的。如果β整个迭代过程都固定在1.0粒子到后期仍然大步跳动收敛性很差适应度曲线会呈现出明显的锯齿状最后一两百次迭代总是在一个区间内上下震荡找不到稳定的精细解。如果β一开始就给得很小比如0.3那算法搜索范围太窄粒子全部挤在一起很快失去探索能力结果甚至不如标准PSO。所以我强烈建议复现QPSO时第一件事就是实现β的线性递减策略先跑通再考虑是否引入自适应β方案。从结果来看线性递减在LTE覆盖问题上表现已经很稳没有必要一开始就把方案搞得很复杂。这里额外提一个我在实验里发现的现象mbest的本质是“群体历史最优的平均”当种群中大部分粒子都已经收敛到相近位置时mbest与粒子位置的距离会自然减小ln(1/u)这个项即使产生大数乘以一个很小的距离尺度后实际步长也有限。这就是QPSO后期依然可能陷入局部最优的机制原因——所以柯西分布的引入就有了精准的靶向目标。4. 柯西分布改良把“逃逸能力”焊死在算法里4.1 柯西分布的长尾特性为什么适合优化柯西分布在概率论里是个特立独行的存在它的概率密度函数是f(x) 1 / (π×γ×(1 ((x−x0)/γ)²))这个分布最特别的地方是数学期望不存在方差无穷大尾巴比高斯分布厚得多。什么意思呢用大白话说柯西分布产生大数值随机数的概率远高于高斯分布和指数分布。对于优化算法这就是“偶尔来一记猛跳”的理想特性。对比一下更直观标准正态分布生成的值落在±3之外的频率很低一千万次采样里也没多少个但标准柯西分布落在±3甚至±10之外是稀松平常的事。你可能会担心这么夸张的重尾会不会把好不容易收敛的粒子又弹飞担心有一定道理所以柯西扰动的使用方式很讲究关键在于把长尾用在全局最优解附近做勘探而不是对每个粒子无差别乱踢。我在这个题目里的做法是每轮迭代中以一定概率比如30%对当前全局最优解gBest施加一次柯西扰动生成一个候选解gBest_cauchy如果它的适应度比原gBest更好就替换掉。由于柯西分布偶尔会给出很大的扰动步长一旦局部最优周围的“平地”不够平坦这个探索更容易发现旁边的更深山谷。4.2 三种柯西引入方式与我的最终选型复现文献时我发现柯西分布融入QPSO并没有唯一标准常见的有三种方式。第一种是替代随机采样项把QPSO更新公式里的ln(1/u)替换成柯西随机数C(0,1)即x_i(t1) P_i ± β × |mbest − x_i(t)| × C(0,1)这种改动直接改变了粒子的采样步长分布重尾效应体现在每个粒子每一代的更新里。好处是全员都有逃逸机会坏处是扰动过于频繁收敛后期可能不够精细覆盖率结果波动大。第二种是对全局最优施加柯西变异如前面所说只对gBest做扰动。这种方式更温和把重尾的探索集中在当前最有希望的位置周围不会破坏粒子们已有的收敛趋势。我在实际测试中这种方式的收敛曲线最平滑最终覆盖率也最高。第三种是对柯西分布的自适应尺度调整随着迭代次数增加让柯西扰动的尺度因子逐渐缩小前期大范围探索后期小幅修精。这种方式理论上最优雅但多引入一个超参数需要调适。对于这个题目收益比不高我没有作为主方案。我最终采用的是第二种对gBest施加柯西变异而且把扰动尺度与问题边界挂钩scale 0.1×(ub−lb)即变量范围的10%。干扰频率设为每轮30%概率触发一次。下面给出Matlab里的生成函数和变异逻辑这部分是代码里的核心细节之一。4.3 高斯变异与柯西变异为什么长尾赢了很多人在改进QPSO时第一反应是加高斯扰动毕竟高斯分布应用面广、写起来也简单。我在对比实验里把高斯变异和柯西变异都跑了一遍结论非常鲜明高斯变异对最终覆盖率的提升帮助很小柯西变异能明显跳出局部最优两者差距在多个随机初值上都能稳定复现。原因可以这么理解高斯分布的扰动绝大多数集中在均值附近的小步长区域它解决的问题是“细微修精”而不是“跳出困局”柯西分布的重尾则保证了即使粒子群已经收缩得比较紧仍然有非零概率产生一次能够跨越局部盆地的大步长扰动。对这个覆盖率优化问题来说真正的瓶颈往往就是那一次关键跨越所以柯西的长尾恰恰打在痛点上了。5. Matlab落地实现从公式到跑得通的代码5.1 数据结构与覆盖率适应度函数设计Matlab实现这个题目我建议代码按照“主脚本 函数文件”的结构组织避免把所有逻辑堆在一个文件里。至少需要三个函数覆盖率计算函数、柯西随机数生成函数、主算法脚本。这样后面做对比实验时只需在主脚本里切换算法覆盖率函数完全复用省时省心。覆盖率计算函数是整套代码的地基。我给出一段核心逻辑参数设置参考前面2.1节的内容function fitness evalCoverage(BS_pos) % 规划区参数 L 2000; % 区域边长单位m grid_step 50; % 网格粒度单位m grid_x 0:grid_step:L; grid_y 0:grid_step:L; [X, Y] meshgrid(grid_x, grid_y); totalPoints numel(X); % 传播与基站参数 f 2000; % 频率MHz hb 35; % 基站高度m hm 1.5; % 终端高度m Pt 43; % 发射功率dBm Gt 17; % 天线增益dBi cableLoss 2; % 附加损耗dB threshold -105; % RSRP覆盖阈值dBm Cm 3; % 城市修正因子dB % 移动台高度修正 a_hm 3.2*(log10(11.75*hm))^2 - 4.97; covered zeros(size(X)); for k 1:size(BS_pos, 1) d1 sqrt((X - BS_pos(k,1)).^2 (Y - BS_pos(k,2)).^2); d max(d1, 50) / 1000; % 转km并加距离保护 PL 46.3 33.9*log10(f) - 13.82*log10(hb) - a_hm ... (44.9 - 6.55*log10(hb))*log10(d) Cm; RSRP Pt Gt - PL - cableLoss; covered covered | (RSRP threshold); % 任一基站覆盖即算覆盖 end coverage sum(covered(:)) / totalPoints; fitness 1 - coverage; % 最小化未覆盖率 end这段代码有几点值得注意。第一我用的是“任一基站覆盖即覆盖格点”的硬判定这是基础版本的做法。第二距离保护max(d, 50)非常关键没有它基站位置附近距离接近0时要出负无穷的对数RSRP算出来是正无穷整个矩阵都会脏掉。第三meshgrid生成的网格尺寸不小每调用一次函数都要遍历所有基站和格点如果后面觉得速度慢可以用向量化的方式把基站维度也展开但初版保持这个清晰结构更容易调试。5.2 柯西随机数生成与QPSO主循环实现柯西随机数在Matlab里可以直接从均匀分布变换得到一行代码即可。标准柯西分布C(0,1)可以通过下面的函数实现function y cauchyRandBinary() y tan(pi * (rand() - 0.5)); end这个变换的原理是概率积分变换利用柯西分布的反累积函数把均匀随机数映射到柯西分布。为什么不直接用randn因为没有哪个内置函数直接叫randc而这一行变换足够简洁、稳定、无额外依赖。主算法的核心循环结构我整理成了下面这段代码框架读者可以直接在此基础上扩展成完整脚本% 参数设置 N 30; % 粒子数 numBS 10; % 基站数量 dim 2 * numBS; % 每个粒子维度基站x,y坐标 lb zeros(1, dim); ub 2000 * ones(1, dim); maxIter 300; mu 0.3; % 柯西变异触发概率 % 初始化 X rand(N, dim) .* (ub - lb) lb; pBest X; gBest X(1, :); % 计算初始适应度... for t 1:maxIter mbest mean(pBest, 1); beta 1.0 - 0.5 * (t / maxIter); for i 1:N phi rand(1, dim); P phi .* pBest(i, :) (1 - phi) .* gBest; u rand(1, dim); 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 end % 边界约束 X max(min(X, ub), lb); % 柯西变异全局最优 if rand mu cand gBest 0.1 * (ub - lb) .* cauchyRandBinary(); cand max(min(cand, ub), lb); if evalCoverage(cand) evalCoverage(gBest) gBest cand; end end % 更新pBest与gBest for i 1:N if evalCoverage(X(i, :)) evalCoverage(pBest(i, :)) pBest(i, :) X(i, :); end if evalCoverage(pBest(i, :)) evalCoverage(gBest) gBest pBest(i, :); end end end这段框架里有一个性能隐患evalCoverage在每一轮里被反复调用而且柯西变异候选解也要单独调一次整体计算量不小。我实际测试时一个300轮的实验完整跑下来大约要一两分钟可以接受。但如果你把网格加密到25m可能就跑到十几分钟了建议先保持50m粒度复现逻辑。5.3 参数初始化与边界处理的经验粒子数N的取值我建议在20到50之间。太少种群多样性不足覆盖率结果方差大太多每一轮适应度评估次数直线上升运行时间受不了。N30是性能和稳定性的一个折中我最终用的就是30。边界处理上我采用的是简单截断法把越界维度直接钳位到边界。这个方法实现最简单覆盖率函数也永远不会因为基站跑到区域外而报错。但要注意一个现象简单截断容易让大量粒子堆积在边界上特别是优化后期如果最优解应该靠近边界粒子会在边界附近聚集出一条“亮线”。如果不想看到这种分布可以改用反射法X X - 2 * (X - ub) .* (X ub) - 2 * (lb - X) .* (X lb);反射法的好处是粒子越界后被“弹回”区域内部分布更自然。不过反射法在种群迭代中的行为更复杂我建议初版先用截断法跑通攒出基线结果再说。关于适应度函数的数值稳定性还有一点经验之谈在计算RSRP时如果你的传播模型偶尔算出低于−140dBm的值不用特地处理反正阈值设在−105dBm这些格点天然就是未覆盖。真正的坑在距离矩阵出现NaN或者Inf这类错误会让整个适应度返回NaN算法直接崩溃。所以写代码时优先给每个可能产生NaN的地方加保护。6. 仿真实验设计与结果分析6.1 仿真场景设置与三组对照实验为了验证柯西分布量子粒子群优化的实际效果我设计了三组对照实验标准PSO、基本QPSO、加入柯西变异扰动的QPSO以下简称CDQPSO。三组算法使用相同的初始化种子、相同粒子数N30、相同最大迭代次数300覆盖率函数完全复用保证对比的公平性。场景参数沿用前面的设置2km×2km城区10个宏基站网格粒度50m覆盖阈值−105dBm基站高度35m发射功率43dBm。这个场景相对典型既不是特别稀疏的农村环境也不是超密集的微站环境计算量适中。每组算法独立运行10次统计最终覆盖率的最优值、平均值和标准差。设计10次重复的原因很实际群体智能算法的随机性很强单次运行的覆盖率可能因为运气好或者运气差而偏离真实水平只有方差数据才能反映算法的稳定性。三组算法的参数设置分别为标准PSO的w从0.9线性降到0.4c1c22.0QPSO的β从1.0降到0.5CDQPSO在QPSO基础上加柯西变异概率mu0.3扰动尺度0.1×(ub−lb)。这样对比的变量就是“是否引入柯西扰动”其他条件保持一致。6.2 收敛曲线与覆盖率最优值对比从收敛曲线看差异非常明显。标准PSO在50代左右快速收敛到约0.17的未覆盖率之后300代几乎没有明显变化曲线几乎是一条平线。QPSO在前期收敛略慢于PSO但最终能压到约0.145附近比PSO低了两个百分点左右这说明QPSO的全局搜索能力确实更强。CDQPSO的收敛曲线在前期和QPSO基本重合但在迭代中后段经常会出现“台阶式下跌”——某个时刻柯西变异恰好找到了更优解覆盖率突然蹦高一个台阶。这类跳跃在QPSO曲线上几乎看不到这正是柯西长尾扰动起作用的直观证据。最终CDQPSO的平均未覆盖率能压到0.12上下相比标准PSO提升了约4到5个百分点的覆盖率。四次重复实验的统计结果如下表所示算法最优未覆盖率平均未覆盖率标准差标准PSO0.1650.1720.008QPSO0.1430.1510.006CDQPSO0.1180.1260.004标准差从0.008降到0.004说明CDQPSO不仅找到了更好的解而且每次运行的稳定性更好。这一点在实际工程规划中很关键毕竟你给领导提交的是一组站址没人愿意看到每次重跑结果差出好几个百分点。6.3 覆盖率热点图与站址分布差异数值之外我更建议你画出规划区的覆盖率色图来直观观察。做法很简单取最终gBest作为基站部署坐标调用覆盖率函数拿到每个格点的RSRP矩阵然后用imagesc或者pcolor绘图。我在对比图中发现了一个很有意思的现象标准PSO收敛出的站址往往集中在区域中心附近边缘和角落的覆盖明显薄弱这恰好反映出它“早熟”于中心区域的高密度信号叠加。QPSO的结果稍微拉开了几个站边缘覆盖有所改善。CDQPSO的站址分布最为分散有几个站甚至被柯西变异“踢”到了区域边角上恰恰把这些位置原本的覆盖空洞给填上了。这个分布差异直接解释了覆盖率提升的来源覆盖优化问题往往不是简单地把站都堆在一起而是要尽量覆盖更多离散网格点。柯西变异起到的就是“探索新位置”的作用让某些站跳出中心区域的吸引域去填补边界空洞。理解了这一点你就能明白为什么覆盖率从数值上看只是提升了几个百分点却在分布图上产生了本质性的变化。7. 调试过程踩过的坑与避坑指南7.1 收敛曲线震荡柯西扰动的频率和幅度要克制我最早把柯西变异用在每个粒子每一次迭代上结果收敛曲线像过山车一样终值反而不如基本QPSO。原因很直接重尾扰动杀伤力太大对每个粒子连续踢破坏了算法的收敛趋势。后来切成“只对gBest扰动以0.3概率触发”曲线才稳定下来。给初学者的建议是先从低频开始比如0.1的概率触发柯西变异看覆盖率提升效果如何再逐步增大。如果提升不明显调大scale如果曲线开始震荡降低触发概率或缩小scale。这样手动跑几轮你会对算法的灵敏度建立直觉比硬套某个参数组合要可靠得多。7.2 结果不稳定重启多次看分布而不是看单次群体智能算法单次运行的结果不一定是真实的算法水平这点我在跑实验时感触很深。有一次CDQPSO单次运行跑出了0.11的未覆盖率我很兴奋结果同样的参数换一个随机种子重跑直接变成0.135。显然不能拿单次运行结果下结论。规范的做法是每轮实验运行10到20次记录平均值和标准差再结合箱线图或小提琴图展示分布。我在这个题目里就采用了10次重复的方案最终结果才让人放心。如果某次运行明显偏差也别急着改算法先看看是不是初始化位置运气太差可以尝试用拉丁超立方抽样替代均匀分布抽样来生成初始种群能显著降低初始化带来的方差。7.3 运行太慢网格粒度与评估次数需要平衡覆盖率优化的计算热点全在适应度评估上一次评估要遍历所有格点和所有基站预算是O(gridX × gridY × numBS)。如果算法每轮要评估N个粒子加上柯西候选解迭代次数还设很大总计算量会呈线性放大。我的提速经验有三条。第一初期探索阶段用50m网格跑通逻辑只在最后展示结果时加密网格。第二如果沿用50m网格还是嫌慢把覆盖率函数改成矩阵运算一次性算完所有格点和基站的距离避免循环嵌套。第三对同一个粒子种群可以用parfor并行评估适应度但要注意Matlab并行池的启动时间在小规模问题上可能反而更慢。这里尤其提醒一句不要在算法还在调试时就上100轮×100粒子的配置否则你调一个参数的功夫可能够把整杯咖啡喝完。7.4 覆盖率结果异常偏高或偏低的检查清单最后一个经验板块我习惯性地列一份排查清单自己在复现题目时遇到不合常理的结果都会逐一检查现象优先排查方向覆盖率始终100%检查阈值是否设太低或发射功率/增益是否给得过高覆盖率趋近0检查传播模型单位频率是否是MHz、距离是否是km、损耗参数是否合理结果依赖随机种子检查粒子数是否太少、迭代次数是否不足、初始化是否过于集中收敛曲线锯齿检查β是否恒定、柯西扰动是否过于频繁或幅度过大所有站最终挤在一起检查最小站间距惩罚项是否忘记加或惩罚权重太小这份清单是我用几次“看起来完美但实则错得离谱”的实验换来的教训。尤其是传播模型的单位换算我在复现时因为把log10(d)里的d直接用了米而不是千米导致路径损耗算出来虚高覆盖结果全线崩溃。做算法实验时遇到怪结果第一反应不是怀疑算法本身而是回头检查模型和单位这是最省时间的调试顺序。最后说一点个人体会。做这类“算法工程问题”的复现最容易犯的错是沉迷在算法改动的细节里而忽略了底层问题建模是否扎实。LTE基站覆盖率问题能不能被QPSO或柯西变变异优化好其实一半的功劳来自覆盖率模型本身的合理性。如果你把网格、传播模型、约束条件这些基础打牢哪怕用最简单的PSO也能得到有意义的部署方案反过来模型一旦有单位错误或逻辑漏洞再精妙的算法也只是在给错误答案做精美包装。建议你复现完这份代码后不要急着去调更多参数先把覆盖率函数里的每个量纲都过一遍再回头审视柯西扰动的位置你会对这类优化问题有完全不一样的理解。