Introduction
CP的idea大致就像在解一个数独。运用已知的知识来deduce和排除一些solution,从而使得solution space变小。
拿八皇后举一个例子:
(这是一个鼎鼎大名的问题)要求在8x8的棋盘上放置八个皇后(皇后可以竖着走横着走斜着走),使得任一皇后不在其他皇后的攻击范围内。
假设从左往右开始放置皇后。
放置第一个 column的时候,此时没有限制,可以在 (1, 1)处放置。这样就导致 (2, 1), (3, 1),…,(8, 1) 不能放置皇后;同理 (2, 2), (3, 3), …, (8, 8)也不能放置皇后
放置第二个 column的时候,此时可以在第3~8位放置,那么假设就在 (2, 3)放置。这样就导致 (3, 3), (4, 3),…,(8, 3)不能放置皇后;同理 (3, 4),…(7, 8)与(3, 2)不能放置皇后
以此类推,我们会发现解的可选范围的确缩小了。如果遇到不能摆出八皇后的窘境,那就得回溯一下,在前面某个column的可行解中挑选另一值,再继续放置皇后。
Computational Paradigm:
- Use constraints to reduce