在浏览器里看着几十辆火柴盒大小的小车从第一代的无脑乱撞,到第四十代逐渐学会转弯、倒车并准确滑入车位,确实极具观赏性。开发者 Oleksii Trekhleb 在 2021 年 9 月 28 日发布的开源博客《Self-Parking Car in 500 Lines of Code》,曾让许多人产生一种直观的错觉:端到端自动驾驶的门槛已经被打穿,只需区区 500 行 TypeScript 和经典的达尔文演化,就能解决复杂的泊车控制。
但只要把这台轻量模拟器的盖子揭开,扑面而来的并不是智能的萌芽,而是一场极其精巧的数学作弊。
撕开神经网络滤镜:纯线性代数的 180 位基因
许多读者下意识认为小车的演化大脑至少包含一层深度网络,但项目实际的控制架构甚至连最基础的多层感知机都不是。

整辆车的感知系统仅由 8 个探测距离在 0 到 4 米之间的距离传感器组成。所谓的演化基因组,其实是由 180 个二进制位切分出的 18 个系数,每个系数占用 10 位。其中 9 个系数分配给油门引擎方程,另外 9 个分配给方向盘转向方程。
系统每隔 100 毫秒做一次决策:将 8 颗传感器的距离浮点数与这些静态系数做简单的加权求和,再加上偏置常数,最后通过 Sigmoid 函数粗暴压缩,映射为前进、后退、左打或右打三档指令。
这种简化的代价是显而易见的。因为没有隐藏层建立非线性特征,小车的大脑不具备理解空间几何关系的能力。作者在 Reddit 讨论中承认,之所以把超量程读数强制重置为零,纯粹是为了迁就线性模型的收敛。开源社区的技术反馈直接指出了痛点:由于缺失多层感知机以及针对未见场景的泛化基准,一旦挪动车位角度或改变起始姿态,这套演化出的系数就会瞬间瘫痪。
合法撞车的秘密:失准的适应度函数
既然这套控制模型如此单薄,为何第四十代的小车能够看似完美地停进目标库位?

答案藏在算法的适应度评估机制里。模拟器计算车辆适应度的公式是 1 / (loss + 1),而其中的损失值仅仅是车辆 4 个车轮与车位 4 个角点之间的平均几何距离。
在这套评分体系中,完全没有引入任何碰撞惩罚项。
换句话说,算法在演化筛选时只问终点坐标,不问来路生死。小车即便把周围的障碍车撞得七零八落,只要最后四个轮子死死贴在车位坐标上,在算法眼里就是基因优异的胜出者。
不计代价的终点逼近,本质上只是把撞击穿行合法化。
作者在项目的公开议题中主动承认了这一缺陷,坦白小车确实是在撞击邻车的前提下强行停靠,并提出需要重新设计扣分逻辑。更有开发者指出模拟器存在一致性漏洞:完全相同的基因组在多次运行中给出的适应度得分甚至会发生漂移,部分所谓的优良代际,不过是吃到了浏览器浮点数误差和物理步长抖动的红利。
- 风险.当算法的目标函数与现实世界的物理红线脱节时,演化出来的往往不是智能,而是绕过规则的最优作弊路径。
玩具仿真与工程控制的边界
遗传算法在控制工程中并不罕见,学术界常将其用于单一场景下的离散轨迹搜索;而深度强化学习则试图在大量场景中训练泛化决策策略。但无论是哪种优化算法,都无法独自承担量产自动驾驶的安全性。

真实道路充斥着传感器测量噪声、转向电机的物理时滞以及毫无征兆的动态穿行。在学术界针对带碰撞约束泊车规划的验证中,没有任何严肃的量产系统会将车辆的物理完整性押注在评分函数上。
工业界在解决泊车问题时,主流方案依然倚重成熟的几何路径规划(如 Reeds-Shepp 曲线与 Hybrid A* 算法)。即便引入策略网络,也必须在底层物理架构上设立独立的急停兜底机制。
古人讲求治之道莫先于辨名核实。在受限的二维网格里玩弄 180 位参数搜索,固然是一堂生动有趣的科普小品;但若误以为这就是自动驾驶的捷径,无异于削足适履。真正的工程安全不是在排行榜里刷出来的期望值,而是在哪怕一次误判面前,都有硬生生踩死刹车的刚性边界。
- 结论.将优化算法与安全防御层物理解耦,是量产控制系统对现实世界不确定性必须保留的敬畏。
