求解CSP的一种通用算法
图a:
- (Block 1):从CSP公式开始,包括定义变量、变量的域和约束。约束储存在constraint store中。
- (Block 2):使用基于逻辑的过滤算法来减少每个约束的各个变量的域,该算法系统地减少变量的域。随着变量的域被减少,使用该变量的每个约束随后被激活以应用其相关联的过滤算法。这个元过程被称为约束传播(constraint propagation)和域缩减(domain reduction)。
- (Block 3):在约束传播和域缩减之后,出现了两种可能性,即找到或不找到解决方案。如果找到解决方案,则算法终止(End1)。
- (Block 4):如果没有找到解决方案,则检查当前阶段的问题不一致性(至少一个变量的域变为空的状态)。
- (Block 5):如果不一致性被证明(失败)则在Block 5中检查搜索树,以检查是否已经探索了所有子问题。如果对所有分支都进行了深入研究,那么问题的不一致性就得到了证明。如果不是,则算法回溯(Block 7)到前一阶段,并分支到不同的子问题(Block 6)。
- (Block 6):如果不一致性没有被证明,那么使用一些搜索策略进行搜索以进行分支。分支通过临时添加约束,将主要问题划分为一组互斥和集体穷举的子问题。分支选择其中一个分支,并使用过滤算法再次传播所有约束(Block 2)。
约束传播(Constraint Propagation)
- 约束内域缩减(Within-Constraint Domain Reduction)
- 图b:
- 约束传播使用了逻辑弧一致性检验去交流(或传递)关于变量域在涉及某些特定变量的约束中或者之间的信息。图b描述了这个概念。
- 在图b中,(a)展示了作业1(job1)有一个处理时间3(可能无法中断)。从变量C1(作业1的完成时间)和S1(作业1的开始时间)的初始域[0, 1, 2, 3, 4, 5, 6]开始。
- (b)中,约束𝐶1=𝑆1+3使用了𝑆1域中的值缩减了𝐶1的域,使得弧𝐶1←𝑆1一致。
- (c)中,约束𝐶1=𝑆1+3使用了更新后的𝐶1的域缩减了𝑆1的域,使得弧𝐶1→𝑆1一致。
- 这种双向弧一致性检查确保了该构造中涉及的两个变量的域的完全减少。
- 约束间域缩减(Between-Constraint Domain Reduction)
- 图c:
- 约束传播还需要在涉及公共变量的约束之间进行信息通信,以减少它们的域。
- 图c描述了在相关约束间约束传播的概念。
- 在这个例子中,目的是在一台机器上,在时域[0, 1, 2, 3, 4, 5, 6]上调度两个作业,第一个作业处理时间为3,第二个作业处理时间为2。
- 在第一步中,𝐶1、𝐶2、𝑠1、𝑠2 在约束弧一致性检验的帮助下缩减了域。
- 在第二步中,约束𝐶1<5 缩减了𝐶1的域(𝐶1=[3, 4])。
- 在第三步中,这个关于𝐶1的更新域的信息被传送到了𝐶1=𝑆1+3,域𝑆1被缩小,𝑆1=[0, 1]。
- 在步骤四中,𝐶2的域被缩小,𝐶2=[5, 6],域𝑆2被缩小,𝑆2=[3, 4]。
- 步骤序列说明了相关约束之间的顺序和完全通信的概念。显然,实际序列可以与相同的最终结果互换(例如,步骤3和4)。
分支(Branching)
- 任何分支策略都可以部署在图a的块6中
- 典型的,部署深度优先战略,但也可以使用其他更复杂的前瞻性战略。无论如何,分支机构的决定权也是开放的。
- 通常,我们通过首先选择一个域尚未绑定(缩减为单个值)的变量来进行分支。变量的选择通常基于启发式(用于指导高效搜索的经验法则),如“最小当前域/优先”。一旦选择了变量,就通过将变量实例化为其当前域中的一个值来建立分支。
- 同样,这种选择可以根据类似“当前域中的最小值优先”的启发式方法进行。事实上,可以根据临时约束(涉及变量的一个值、变量的多个值、多个变量的多值)来决定分支。在CP术语中,搜索策略使用这几种选择中的一种沿着搜索树前进的点是所谓的选择点。
CSP算法在约束优化问题中的应用
- CSP问题可以很容易地扩展到约束优化问题(COP)。
- 假设我们的COP有一个要最小化的目标Z。
- 如果找到原始CSP的第一个解决方案,则计算其目标值(Z'),将约束Z<Z'添加到已解决的CSP的约束存储中以形成新的CSP,并在此新问题上重复CSP算法。重复这个过程,直到发现不一致之处,并找出所有分支。最后找到的解决方案是最优的。