本文参考Google OR-Tools官网文档介绍OR-Tools的使用方法。
1 约束满足问题
1.1 CSP定义
在前一篇文章中我提到Google OR-Tools中解决整数规划问题有MP Solver和CP Solver两种工具,但是只介绍了MP Solver,而这篇文章则会介绍CP Solver。之所以会有这两种工具,是因为虽然都是解决整数规划,各自面对的问题类型还是有区别的,CP Solver一般用于约束满足问题(Constraint Satisfaction Problem),简称CSP。
一个约束满足问题包括有限变量集、每个变量的有限论域和有限约束集,每条约束限制了变量集赋值的组合,约束满足问题的解是为每个变量赋一个对应论域上的值,使之满足所有的约束。一般情况,解约束满足问题的目标是只要找到一个解就行,不过也可能要找出所有可行解中最优的那个。
举个简单的例子,比如一个人需要穿鞋、衬衫和裤子,其中每样东西都有一定的选择:鞋有运动鞋、皮鞋两双;衬衫有红色和白色两件;裤子有蓝色、灰色和牛仔裤三条。但是必须符合如下的规则:
- 运动鞋配牛仔裤;
- 皮鞋只能与灰裤子和白衬衫搭配;
- 白衬衫可以和牛仔裤或者蓝裤子搭配;
- 红衬衫只能与灰裤子搭配;
这个穿衣规则就是问题的约束,问题变量集合为{鞋,裤子,衬衫},而每种物品可选择的样式就构成了变量的论域。
下面是CSP问题的数学定义:
用一个三元组 ( V , D , C ) (V,D,C) (V,D,C)来表示CSP,其中
- V V V是由有限变量组成的集合 X 1 , X 2 , . . . , X n {X_1,X_2,...,X_n} X1,X2,...,Xn;
- D D D是一个函数,将每个变量映射到一个有限论域上,用 D X i D_{Xi} DXi表示变量 X i X_i Xi在函数 D D D上的映射,即变量 X i X_i Xi的论域;
- C C C是一个约束的有限集合,而且在约束中出现的变量只能是 V V V中的变量。如果 c ∈ C c\in C c∈C,则约束 c c c表示的是其中出现的所有变量对应论域笛卡尔积的一个子集。
对于一个 C S P ( V , D , C ) CSP(V,D,C) CSP(V,D,C):
- 如果一个 C S P ( V , D , C ) CSP(V,D,C) CSP(V,D,C)是 k k k-可满足的,当且仅当 V V V中所有由 k k k个变量组成的子集都存在一