约束满足
就是求解的问题存在约束。考虑一张拓扑图,每个节点都存在候选区间,然后某几个(1-n)节点之间存在约束,比如某个点不能取特定值,某两个相加等于定值之类的。一个约束包含几个变量,就是几元约束(相容)。
相容
就是约束
节点相容
单个点存在约束,直接利用约束消除这个点里的非合法区间就行了。
弧相容
二元约束,使用AC3算法:
把所有二元关系入队,每次弹出一个,假设为
(
A
,
B
)
(A,B)
(A,B),约束其中一个调整另外一个,如果约束产生效果,如锁定A的值域确定B的值域,如果对原本值域无影响,就弹出下一个;否则B值域发生变化,那我就把所有
(
B
,
D
i
)
(B,D_i)
(B,Di),
D
i
D_i
Di表示所有其他和B相关的节点,加入队列。直到队列为空就结束。
路径相容
一个节点和另外两个发生相容,处理成三元相容。考虑三个节点两两相连,目标用两种颜色为其染色,显然无解。我们假设一开始每个节点值域都是{1,2},利用任意两点间颜色不相同永远无法消除值域,也就是说只靠两元约束永远无法解决这个问题,所以需要把两元约束处理成三元的。A和B相容,B和C相容,那就处理成ABC相容。
k相容
多元约束,PC2算法:书上说何AC3差不多,那大概就是所有n元关系入队,然后锁定n-1个值更新一个值域,发生值域更新就把受到改变节点约束的多元关系也入队把。
全局约束
含有不同元的约束,各种约束组成的整体。有各种不同的约束啦。
数独问题
数独问题最一般的做法就是,选一个点,看行列、方格哪些数字已经出现,出现过就更新这个值域范围。但是仅仅依靠这种方式只能解决简单的问题。
可以利用多元约束求解,那基本等同于全部搜索,根本不可能算的完的。
CSP回溯搜索
就深搜嘛,提了一些可以优化的地方。
- 利用简单约束提前消减搜索空间,交替进行效果更好,因为搜索一会,又多了很多可以利用约束消除的节点。
- 先搜索可能取值少的节点
- 智能回溯,搜索路径a-b-c,a和c冲突了,但是你回去改b,你再搜到c的时候还是不对,所以应该跳到使冲突发生的地方。
局部搜索
给一个存在一些冲突的初值,对其进行修正的算法可能会很快。我觉得可能因为解很可能不唯一,你给定一个值至少离某个解很近,而从0开始离每个解都很远。
比如说八皇后,给个初始存在冲突的情况,随便选一个点,他和其他一般存在不只一个冲突,选择一个能让冲突数量最少的方式进行搜索。
问题结构
拓扑排序(自己去查)
图化树
选择一个割集,把剩下部分变成一棵树。枚举割集,进行每种情况下的树搜索。
树分解
把图中几个连通块作为一个节点,把这些互相存在关系的节点连成树。
CSP问题改进
放宽、分解、增强约束。