定义约束满足问题
约束满足问题:
环境:单agent、延续、静态、完全可观察
一种特殊的搜索问题,通过识别违反约束的变量/值的组合迅速消除大规模的搜索空间,利用结构状态的优势。
约束满足问题包含变量X,值域D,描述变量取值范围的约束集合C
二元约束-约束图
全局约束-变量个数任意 - 约束超图,alldiff、atmost
偏好约束通常被处理成个体变量赋值的开销
当对问题中变量的赋值满足所有约束时,该赋值是相容的
CSP问题的解是所有变量的相容的、完整的赋值
约束满足问题的特性
可交换性 : 对变量赋值的顺序不影响最终结果
约束传播:一个变量的赋值将改变其它变量的值域
约束传播:CSP中的推理
约束传播与搜索可以交替进行,也可以将约束传播作为搜索前的预处理
约束传播核心思想:增强图中各部分局部相容性,通过删除不相容结点的取值。
结点相容
如果单个变量(对应于CSP网络中的结点)值域中的所有取值满足它的一元约束,就称此变量是结点相容的。
弧相容
若对Xi的每个赋值,Xj都存在某个取值满足弧(Xi, Xj)的二元约束,则称Xi关于Xj是弧相容的。
AC-3算法能够处理的只有二元约束,即弧相容的情况。
算法步骤:
1、首先,将所有的二元组(弧)入队
2、二元组一个个出队,出队的时候确定一个为固定的值,另一个可变
3、对可变变量的值域进行调整,剔除不满足的值
4、如果值域发生改变,将与可变变量有关的所有的二元组入队
5、队列为空时,结束算法
路径相容
对{Xi, Xj}的每一个相容赋值{Xi=a, Xj=b},Xm都有合适的取值同时使得{Xi, Xm}和{Xm, Xj}是相容的,则称集合{Xi, Xj}关于Xm是路径相容的。
k相容
如果对于任何k − 1个变量的任何相容赋值,任何第k个变量总能被赋予一个和前k − 1个变量相容的值,那么称这个CSP是k相容的。
CSP的回溯搜索
变量和取值顺序
- 最少剩余值(MRV)变量优先: V优先选择剩余值数量最少的变量。
选择剩余值数量多的变量容易使得剩余值数量少的变量的值域变为空值域。
也称为“失败优先”启发式,剩余值少的变量的值域容易变为空而失败
如果剩余值数量相同:
-
最大度变量优先:优先选择对其他变量约束最多的变量(约束最多其他变量的变量).通过选择与其它未赋值变量约束最多的变量来试图降低未来的分支因子
-
最少约束值优先:选择的取值会删除邻居变量的一些有效值,选择的取值应尽可能少地删除邻居变量的有效值(让邻居保留更多的剩余值)。
-
为什么变量选择失败优先而值选择是失败最后呢?
选择具有最少剩余值的变量通过早期有效剪枝有助于最小化搜索树中的结点数;
而对于值的排序只需找到一个解,因此首先选择最有可能的值是有意义的。
提前检查失败/如何剪枝(前向检验、维护弧相容)
前向检验(Forward Checking):一个变量X赋值后,对每个相邻变量Y根据弧相容推理从值域删除与X不相容的值,如果某个变量值域变为空,就回溯。(只影响邻居)
维护弧相容(MAC):当变量X赋值后,INFERENCE调用AC-3,从与X相邻的所有未赋值变量开始,进行约束传播,一旦某个变量的值域变为空,则AC-3调用失败并立即回溯。(一石激起千层浪)
弧相容能够比前向检查更早地检测到失败,原因是MAC在变量值域发生变化时递归传播约束。
CSP的局部搜索(非重点)
在为变量选择新值的时候,最明显的启发式是选择与其它变量冲突最少的值——最少冲突启发式。
使用最少冲突启发式的CSP的地形通常有一系列高原。可能有上百万种赋值,它们都只有一个冲突。
◼ 高原搜索。这可以由禁忌搜索引导:将最近访问过的状态记录在表中,并禁止算法再回到那些状态。
◼ 模拟退火也可以用于逃离高原
约束加权。每个约束都有一个数字权重Wi,初始都为1。搜索的每一步,算法都选择修改一个变量的值,使得违反的约束权重和最小化。接着增加当前赋值违反的约束的权重值。这给高原增加了地形,并且它随着时间的进行不断给难于解决的约束增加权重。
CSP的问题结构
如果一个CSP是树形结构的或是类树形结构的,能对其使用树形CSP算法来在线性时间内得到一个解。
如果一个CSP是类树形结构的,我们能用割集调整(cutset conditioning)来将CSP转换为树形结构CSP求解。如果能找到比较小的割集,算法十分有效。
树分解技术把CSP转变为子问题构成的树,如果约束图的树宽不大,则算法十分有效。
独立子问题
独立性通过寻找连通子图确定
分治解决:
假设变量共n个,每个子问题c个变量一共n/c个子问题,每个子问题的复杂性为O(dc),总工作量为O(dcn/c)
不分解的情况下为O(dn)
树形结构的CSP的求解算法
- 拓扑排序
求解树结构CSP时,首先任意选择一个变量为树的根,选择变量顺序,这样每个变量在树中出现在父结点之后。
n个结点的树有n-1条弧,所以在 O(n)步内可以将此图改造成直接弧相容,每一步需要比较两个变量的d个可能取值,所以总时间是 O(nd2)。一旦有了直接弧相容的图,就可以沿着变量列表并选择任意剩余值。由于父结点与其子结点的弧是相容的,我们知道无论父结点选择什么值,子结点都有值可选。这意味着无须回溯; 可以沿着变量线性前进。
如果CSP有解,在线性时间O(nd2)求解,如果无解,则会检测到矛盾。
化简为树形结构的方法
删除结点(环割集)
(1)从 CSP 的变量中选择子集 S,使得约束图在删除 S 之后成为一棵树。S称为环割集(cycle cutset)。
(2)对于满足S所有约束的S中变量的每个可能赋值∶
(a)从CSP剩余变量的值域中删除与S的赋值不相容的值,并且
(b)如果去掉S后的剩余 CSP有解,把解和S的赋值一起返回。
如果环割集的大小为 c,那么总的运行时间为 **O(dc·(n-c)d²)**∶我们需要尝试S中变量的赋值组合共dc种,对其中的每个组合需要求解规模为n-c 的树问题。如果约束图"近似于一棵树",那么c将会很小,直接回溯将节省巨大开销。然而在最坏情况下,c 可能大到(n-2)。
合并结点(树分解) 原理:分治
树分解将约束图分解为相关联的子问题,每个子问题独立求解,再把得到的结果合并起来。
树分解必须满足的条件
- 原问题中的每个变量至少在一个子问题中出现
- 原问题中的两个变量若有约束相连,它们至少同时出现在一个子问题中(连同它们的约束)
- 如果一个变量出现在树中的两个子问题中,那么它必须出现在连接这两个子问题的路径上的所有子问题里。
树分解CSP的求解:
独立求解每个子问题;任何一个无解,整个问题就无解。求解所有的子问题后,设法构造一个完整解。
每个子问题被视为一个“巨型变量”,它的值域是这个子问题的所有解的集合。
用前面给出的树算法来求解连接这些子问题的约束——它们的共享变量要取相同的值
习题
4阶幻方
一个n阶幻方是n*n方阵:该方阵每一行、每一列和两条对角线上的整数的和都等于同一个数。现在我们得到了一个残缺的4阶幻方,如图所示。
1)将该问题形式化,描述为CSP(约束满足问题),给出约束关系;
2)按照约束传播策略和标准搜索过程求解该问题,补全给出的4阶幻方。
变量集合:{X11,X12,X21,X22,X32,X41,X42}(10分)
值域集合:{X⋲Z,X⋲[1,16]}(20分)
约束集合:(20分)
X11 + X12 + 2 +13 = X21 + X22 + 11 + 8 =
9 + X32 + 7 + 12 = X41 + X42 + 14 + 1 =
X11 + X21 + 9 + X41 = X12 + X22 +X32 +X42 =
2 + 11 + 7 + 14 = 13 + 8 + 12 + 1 = 34 =
X11 + X22 + 7 + 1 = X41 + X32 + 11 +13
AllDiff(X11,X12,X21,X22,X32,X41,X42)
2)按照约束传播策略和标准搜索过程求解该问题,补全给出的4阶幻方。
利用约束传播或是最少剩余值启发式优先确定X32,X41,X42三个点的值,在确定X11的值之后,通过前向检验缩减后续节点的值域,在缩减值域后,通过最少剩余启发式快速结束搜索
补全幻方
6.5
选择C3,域是{0,1}。
为C3选择值1。(不能选择0;它将无法在向前检查中存活下来,因为它将迫使F为0,并且该和的前导数字必须是非零的。)
选择F,因为它只有一个剩余的值。
为F选择值1。
现在C2和C1的最小剩余值是2;选择C2。
任何一个值都可以通过前项检验,为C2选择0。
现在C1有了最小的剩余值。
对于C1的值选择0。
变量O必须是一个偶数(因为它是T+T小于5的和(因为O+O=R+10×0)。这使得它最受限制。
任意选择4作为O的值。
R现在只有1个剩余的值。
为R选择值8。
T现在只有1个剩余的值。
为T选择值7。
U必须小于9而且是偶数;选择U。
向前检查的唯一值是6。
剩下的唯一的变量是W。
W所剩下的唯一值是3。
这是一个解决方案。
6.9
为什么变量选择失败优先而值选择是失败最后呢?
- 选择具有最少剩余值的变量通过早期有效剪枝有助于最小化搜索树中的结点数;
- 而对于值的排序只需找到一个解,因此首先选择最有可能的值是有意义的。
6.12
用AC-3算法求解树结构CSP在最坏情况下的复杂度是多少?
在树状结构图上,没有弧会被考虑多于一次,因此AC-3算法为O(ED),其中E为边数,D为最大域的大小。