约束满足问题(CSP)
CSP定义
如下图所示,在传统搜索中我们不关注state内部的情况,这种被称为原子表示。而在CSP方法中,我们使用因子表示,即将状态本身拆解为一组变量和值。

CSP的定义包括:
- 变量 (Variables, \(X\)): 需要被赋值的对象集合 (\(X_1, ..., X_n\))。
- 例子:地图着色中的每一个区域。
- 域 (Domains, \(D\)): 每个变量可以取的值的集合 (\(D_i\))。
- 例子:{红, 绿, 蓝}。
- 约束 (Constraints, \(C\)): 限制变量取值的规则 (\(C_m\))。
- 例子:相邻的区域不能涂相同的颜色 (\(X_1 \neq X_2\))。
- 目标 (Goal): 找到一个 赋值 (Assignment) ,满足:
- 完整性 (Complete): 所有变量都被赋值。
- 一致性 (Consistent): 不违反任何约束。
回溯搜索
回溯搜索(Backtracking Search) 是CSP的标准解法。回溯搜索本质上是针对 CSP 优化的 深度优先搜索 (DFS) 。
工作流程:
- 每次只选择一个变量进行赋值(而不是生成整个新状态)。
- 检查这个赋值是否符合当前的约束。
- 如果符合: 继续递归给下一个变量赋值。
- 如果不符合: 放弃当前分支,回溯 (Backtrack) 到上一步,尝试域中的下一个值。
核心思想: "Fail fast"(一旦发现走不通立刻回头,而不是走到终点才发现错了)。
约束传播
约束传播 (Constraint Propagation)是用于加速回溯搜索的技术。
其内容顾名思义,我们可以利用约束条件,提早推导出哪些值是不可能的,从而缩小变量的域(Domain)。
常见方法包括:
- 前向检查 (Forward Checking): 当给变量 \(X\) 赋值后,立即检查所有与 \(X\) 相连的未赋值变量,把它们域中与 \(X\) 冲突的值删掉。如果某个变量的域变为空,则立即回溯。
- 弧一致性 (Arc Consistency / AC-3): 比前向检查更强。它在赋值前或赋值中,通过连锁反应传播约束,确保每条边(Arc)上的约束都是满足的,能更早地检测出无解的情况。