[控场AI]
· 5 分钟阅读· 2,632 字

Router Rumble:用WiFi路由器演示梯度下降为何败给NSGA-II

Router Rumble:用WiFi路由器演示梯度下降为何败给NSGA-II

Router Rumble 用WiFi路由器摆放场景,可视化展示梯度下降在离散目标函数上失效而NSGA-II胜出的过程。

Router Rumble 是开发者 Austin Starks 开源的 Python 实验项目,通过在模拟房间中寻找 WiFi 路由器最优摆放位置,直观对比梯度下降与进化算法 NSGA-II 的表现差异。项目的核心问题在于目标函数——信号覆盖位置的数量——是离散的整数值,形成"阶梯状"地形。梯度下降从单一位置出发,因四邻域探测返回相同覆盖数、估算斜率为零而原地停滞,最终只能覆盖 100 个采样点;NSGA-II 则以 32 个位置组成的种群展开全局搜索,最终达到 209 个覆盖位置。两种算法均获得 1200 次评估预算以保证对比公平。项目基于 NumPy 和 pymoo 构建,无需 GPU,支持自定义墙体布局和参数,兼具教学价值与可探索性,清晰说明了算法选型必须匹配问题性质这一核心原则。

当优化问题的目标函数不再平滑连续时,经典的梯度下降会陷入困境。开发者 Austin Starks 开源了一个名为 Router Rumble 的 Python 实验项目,用一个直观的场景——在模拟房间里摆放 WiFi 路由器——把梯度下降与进化算法 NSGA-II 的差异可视化地呈现出来。

Router Rumble 演示

一个看得见的优化难题

这个实验的设定非常接地气:在一个模拟的住宅环境中放置一台 WiFi 路由器,目标是让尽可能多的位置接收到足够强的信号。具体的目标函数统计的是信号能够达到 −57 dBm 的覆盖位置数量,总采样点为 560 个。

问题的关键在于,这个目标函数是"阶梯状"的——信号覆盖数量以离散的整数变化,而非平滑曲线。这恰恰是梯度下降的软肋。项目用录制好的搜索过程生成 GIF 回放,让人能直观看到两种算法在同一个房间里"找位置"的全过程。

梯度下降为何原地踏步

梯度下降的工作方式决定了它的局限。在 Router Rumble 中,它从单一位置出发,测试周围四个相邻位置。由于目标函数是离散的,这四个邻近位置返回了相同的覆盖数量,于是算法估算出的斜率为零——它认为自己已经到达了一个平坦区域,无路可走。

结果就是梯度下降停留在了 100 个覆盖位置,再也无法改进。这并不是算法实现有问题,而是基于梯度的方法在非平滑、离散目标上的本质缺陷:没有可用的梯度信息,就没有前进的方向。

这种现象在优化理论中被称为"伪平台"(pseudo-plateau)——并非真正的局部最优,而是目标函数的离散性造成的梯度盲区。有限差分法(finite difference)是梯度下降在无解析梯度时的常见替代方案:通过计算相邻点的函数值之差来近似导数。但当采样步长小于目标函数的最小变化单位时,差分结果恒为零,梯度估计完全失效。Router Rumble 的四邻域探测本质上就是这种有限差分,而信号覆盖数量以整数跳变的特性,使得任何足够小的步长都无法感知到函数值的变化。即便增大步长,也只是将算法退化为随机采样,失去了梯度下降本身的方向性优势。

NSGA-II 的群体优势

相比之下,NSGA-II 作为一种进化算法,采取了完全不同的策略。它维护一个由 32 个位置组成的种群,分散在整个房间中同时探索。这种群体式搜索不依赖梯度,而是通过选择、交叉、变异来迭代改进。

最终 NSGA-II 达到了 560 个采样位置中的 209 个覆盖,远超梯度下降的 100 个。值得一提的是,这个示例中 NSGA-II 只使用了单一目标——它本是为多目标优化设计的算法,在单目标场景下依然展现出对离散问题更强的适应能力。

NSGA-II(Non-dominated Sorting Genetic Algorithm II)由 Deb 等人于 2002 年提出,是多目标进化优化领域的经典算法。其核心机制包括两部分:非支配排序(non-dominated sorting)将种群按帕累托前沿分层,确保优质解得到保留;拥挤度距离(crowding distance)则度量个体在目标空间中的稀疏程度,防止种群过度集中在某一局部区域。这两个机制共同作用,使种群在搜索过程中既保持对优质解的压力,又维持足够的多样性。在 Router Rumble 的单目标场景中,非支配排序退化为简单的值比较,但种群多样性带来的全局探索能力仍然是其相对梯度下降的核心优势。pymoo 是一个专门实现多目标优化算法的 Python 库,提供了 NSGA-II 及其变体的开箱即用实现。

公平对比的实验设计

为了让比较有说服力,作者对两种方法设置了相同的"预算":各自获得 1200 次目标函数评估,其中包括初始化和局部探测。唯一的差异在于起点——梯度下降从一个位置开始,而 NSGA-II 从一个铺满房间的种群开始。

除了这个核心的离散目标对比,仓库还包含了更完整的实验内容:

  • 平滑目标函数的对比,用于展示在梯度可用时两种方法的表现
  • 跨 20 个随机种子的结果,验证结论的稳健性而非偶然
  • 可交互的回放,用户能逐帧拖动查看搜索状态

本地运行与可调参数

项目的工程门槛很低,基于 NumPy 和 pymoo 构建,无需 GPU,也不需要任何 API key。克隆仓库即可本地运行:

git clone https://github.com/austin-starks/router-rumble.git
cd router-rumble
uv run run_demo.py

更重要的是它的可玩性——用户可以自由修改墙体布局、信号强度目标、随机种子以及评估预算,然后重新运行实验。这让它不只是一个静态 demo,而是一个可供教学和探索的沙盒。

对优化算法选型的启示

Router Rumble 的价值在于它用一个极简的场景说清了一个重要道理:算法选型必须匹配问题的性质。梯度下降在平滑可导的连续优化中高效且可靠,但面对离散、阶梯状或噪声严重的目标函数时,缺乏梯度信息会让它寸步难行。

进化算法这类无梯度(gradient-free)方法虽然计算成本更高、收敛更慢,却能在这类"地形崎岖"的问题上找到可行解。对于从事超参数搜索、工程布局优化、组合优化的开发者而言,这是一个值得收藏的直观参考案例。

无梯度优化(gradient-free optimization)是一个比进化算法更宽泛的方法族,还包括贝叶斯优化、模拟退火、粒子群算法、Nelder-Mead 单纯形法等。这类方法的共同特点是只依赖目标函数的输出值,而不要求其连续或可微。在实际工程中,以下场景往往需要考虑无梯度方法:目标函数包含仿真、实验或外部系统调用(黑箱优化);参数空间包含离散或类别变量;函数评估代价极高,需要高效利用有限次数的查询预算。贝叶斯优化在评估次数极少时通常优于进化算法,因为它会主动建立目标函数的代理模型来指导搜索;而进化算法在并行计算资源充足时更具优势,因为一代种群可以同时评估。

分享:

相关推荐