1. 简介
Constraint Satisfaction Problems – 约束满足问题。即是在满足所有变量的约束条件下,达到目标结果。
2. 回溯搜索 – Backtracking search
基础的无信息搜索算法,原理是每次为一变量选择一个赋值,当没有合法的值可以赋给某变量时就回溯到上一个阶段,继续选择domain中可用的值;如果domain为空则继续回溯,如此往复直到最终满足目标。
缺点: 不断回溯试错,效率不高,可以通过以下方法(预先剔除错误结果集等)提升效率
3. 三个方向提升搜索效率
3.1 Ordering
3.1.1 Minimum remaining values (MRV) – 最少剩余值
- 思想:选择对应的域中合法值最少的变量 ,减少搜索空间,提升效率
- 开始时遍历所有的变量找出合法值最小的那一个,然后赋值,如果在某一步中出现变量合法值为空时,就回溯到上一个阶段重新赋值合法值…
- 可能导致局部最优的情况发生;所以往往配合LCV使用
3.1.2 Least Constraining Value (LCV) – 最少约束值
- 思想:在每一次选择一个变量进行赋值时,优先选择对其他变量产生最少约束的取值,减少搜索空间,提升效率
- 由于选择对其他变量产生约束最少的解,所以可以大大减少回溯次数!!但是任然会有局部最优的情况
3.2 Filtering
3.2.1 forward checking – 前向检查
在匹配的过程中,判断剩余变量的合法值范围,如果发现某一个变量的合法值范围为零时,应该立即回溯
配合约束传播,如图中显示的NT、SA在迭代的过程中发现不能颜色相同,即应立即回溯
3.2.2 Arc Consistency – 弧相容
比前向搜索更快的检查到错误方案
- 弧相容算法的基本思想:
通过在变量之间建立相互约束关系,在迭代中剔除相互冲突的约束条件,直到所有变量之间的约束满足为止。
如下图,我们可以建立NT与SA的约束关系,发现当 NT - blue 时,SA删除蓝色解(注意在尾巴删除),导致其解集为空,即检测到错误
- 缺点:
任然在回溯搜素之内,而且弧相容算法的结果可能有0、1、…个解
结合上面知识,可以通过MRV先确定选择的变量,再通过LCV确定该变量的可行域中应该选择哪一个解;同时结合前向检查、弧相容等提前剔除失败路径,达到整体提升效率的目的
3.3 Structure
Tree structure 大大降低原来结构的时间复杂度 O(d^N) 到 O(nd^2)
简单来说 Tree-Structured CSPs 把无向无环图中任意挑选一个节点作为根节点,剩余节点从左到右构成拓扑结构,如下例子模拟过程:
-
以A作为根节点,根据原图节点顺序从左到右连接各个节点形成有向无环图的线性化
-
Remove backward – 向后移除,即从第n个节点到第2个节点,Parent(i) -> i 两两经行弧相容算法剔除可行域中冲突的部分,最终结果如下
任意两个节点之间都不会存在颜色冲突的情况(无回溯)
-
Assign forward – 前向赋值,即按照箭头顺序从最左边开始一一赋值,最终获得正确的结果集
由于在实际应用中往往并不是无环图,所以引入割集的概念将一般的树推广
割集简单来说就是找到一个图中受约束变量的最小子集,只要删去这一子集就能得到一棵树(无环)
如下图例子中找到最小的割集,不难看出A、B组成最小割集使得其变成无环图
一旦找到了最小割集,就可以将变量逐一都分配进去并删去附近所有节点的域(可能存在回溯)。剩下的就是我们熟悉的树形结构CSP
4. 本地搜索 – Local search
另一个也经常用的解决约束满足问题算法。
- 思想:
min-conflicts heuristic 最小冲突启发式策略,即每次选择一个跟其他变量相关性约束最强的变量来赋值,将其转变为相关性约束最弱的变量
举个例子吧,在四皇后问题中,要将四个皇后相互分开互不攻击,可以先将平行四边形左上的皇后移动上一格(相关性约束为3 最大)变成与其他三个皇后无约束… 以此类推只需两步达成目标
- 优点:除了任意n的n皇后问题,本地搜索对任意生成的CSP的运行时间几乎是常数
- 缺点:非备完备性和非最优性,不一定有最优解。而且在如下的极端范围内,所需要的时间空间消耗大大提升