
《计算机科学书籍》第二版发售
《计算机科学书籍》第二版现已发售,涵盖机器学习、深度学习、大语言模型与人工智能。可立即购买,还有主页、章节、购买、博客等相关链接。
儿子教会我的约束求解
2026年7月8日,作者儿子两岁,有强烈探索欲,喜欢机械交通工具和土方工程机械设备,尤其爱用Brio木制火车套装“玩火车”。作者通过搭建有趣轨道布局自娱自乐,进而思考Brio火车套装轨道部件设计的底层结构及能搭建的最复杂布局,发现这是个有趣算法问题。儿子展现出约束求解专长,接下来内容是作者根据儿子“教导”编辑整理而成。
Brio火车系统
Brio是儿童木制火车玩具,也受部分成年人深入研究。作者查阅非官方的Brio轨道指南,该指南为每个轨道部件赋予字母代码和尺寸规格,如A代表144毫米中等直轨,A1和A2分别是108毫米和54毫米变体,E是标准弯道,八个45度弯道可围成直径约40厘米圆圈,多数轨道部件可翻转。此外还有坡道和桥梁部件,为简单起见,将系统视为二维,因桥梁部件不稳固,儿子老撞倒,作者尽量藏起来。
首先,让轨道闭合
一天早上,作者把八个弯道拼接成圆圈,儿子欢呼“圆圈”,看来读《托马斯和他的朋友们之形状认知》起作用了。但这是最简单闭合回路,作者思考能否将一组轨道部件排列成闭合布局。文章可视化效果由三个求解器支持,图一至图四用回溯搜索算法,图五用约束求解算法,图六用SAT求解器。回溯搜索算法像孩子搭建轨道,放下部件,看连接口,不合适就回溯。求解器处理开放连接口,尝试匹配部件和方向,递归处理,遇死胡同回溯。用类似Python伪代码表示搜索过程。对于八个E型弯道,若弯道朝向相同问题简单,但求解器会先尝试放错方向,导致“已探索状态”计数增加。儿子说“再来点,爸爸”。
让轨道变大
作者把圆圈轨道断开,添加平行直轨让轨道变大,称其为“椭圆形”,儿子指出是“长方形”,作者意识到儿子说得对。添加直轨增加可能状态数量,“贪心”算法可能把直轨放错位置致轨道无法闭合,需具备回溯能力。儿子说“指数级的,爸爸”,确实,部分布局数量随部件数量呈指数级增长,此布局比圆圈多两个部件,状态数量约增加八倍。在当前规模下,简单穷举回溯算法可快速运行,但最坏情况运行时间仍呈指数级,会遇瓶颈。作者认为圆圈等形状无聊,需有交叉点和分支才有趣。
交叉点增加分支点
儿子拿起H3型交叉轨道部件,作者给儿子展示,儿子称其为“有两个环的图”。图是用线连接点的数学概念,环是能回到起点的路径,此前轨道像单线,交叉轨道有四个连接口,放置它会打开三个连接口,搜索开始分支,数据模型改变。目标是检查轨道部件能否组成闭合网络,答案是可以,两个圆圈通过交叉轨道连接,连接口配对,火车可穿过两条轨道。碰撞检测最初作为约束条件添加,保证正确性同时加快搜索速度。此外,还可订阅获取免费45页计算机科学学习路线图,已有1000多名读者加入。
分支让回路变成网络
L型和M型分支轨道出现后,求解器能找到更有趣布局,创建内外圈,分支轨道连接口配对。儿子说“爸爸!三度节点。没有欧拉回路。”咨询ChatGPT后作者明白,“度”指交汇轨道端点数量,交叉轨道度为四,分支轨道度为三,奇数度顶点意味着火车无法一圈覆盖每段轨道,交叉轨道度为偶数,火车可沿“8”字形行驶,使用分支轨道时火车无法一圈覆盖全路径。
将其转化为约束问题
作者尝试搭建超级复杂轨道布局失败,儿子指出这是约束满足问题,变量是开放连接口,定义域是能匹配部件,约束条件是连接口配对。约束满足问题是明确选择、允许范围和不能共存选择的问题,如数独游戏。回溯算法有浪费之处,无前瞻性和目标性。儿子提出传播和回跳,在约束求解器中,开放连接口保留候选列表,前向检查更新候选列表,冲突导向回跳决定回溯程度。作者测试发现,最初版本的求解器让情况更糟,原因是前向检查局限性,Brio火车套装死胡同情况多非局部。儿子建议使用全局约束,从整个布局检查,成功减少搜索状态数,但并非所有情况都有效,且求解器回跳时会忘记失败情况,两种搜索算法只能对确切部件给出“是”或“否”答案,作者想搭建最好布局,儿子建议让求解器选择部件。
交给SAT求解器
作者最初把轨道布局问题看作图论问题,实际更像拼图问题,儿子通过分类部件展示像多联骨牌,可使用SAT求解器。多联骨牌拼接是经典拼图难题,Brio火车套装问题类似。布尔可满足性问题是询问布尔变量公式是否存在使公式为真的赋值,所有NP问题可转化为布尔可满足性问题。利用SAT求解器可快速找到最优布局,但需将放置方式转化为是非问题,列出部件可能位置。Brio火车套装部件无固定网格位置,作者取巧记录搜索算法访问过的连接口位置,让SAT求解器在这些位置放置部件。每个放置方式对应布尔变量,规则转化为子句。连通性要求是难题,儿子引导采用循环方法,排除反例使布局连通,此方法类似整数规划求解器处理旅行商问题,被称为“反例引导的细化”。SAT求解器底层有巧妙工作,采用冲突驱动的子句学习,虽不一定比其他搜索算法快,占用内存多,但能在给定部件数量下找到最复杂布局,可选择部件。
我的收获
作者按SAT求解器输出摆放轨道部件,意识到儿子幼儿园让他加速学习算法,还给自己上了一课。作者错误在于假设只有一个问题,“这组确切部件能否组成闭合布局”和“哪些部件能组成最复杂网络”是不同问题。递归回溯算法局限性大,但简单、内存需求少、响应快;CSP求解器搜索更智能,需找到有用约束条件;SAT求解器改变问题本身,有永久记忆,但代价是内存、速度和适用范围。最后,还可订阅获取免费45页计算机科学学习路线图,已有1000多名读者加入。


被折叠的 条评论
为什么被折叠?



