作者:小猪快跑
基础数学&计算数学,从事优化领域5年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法
在过去的几十年里,出现了两种主要的约束处理方案——一种基于 conditioning 或者 search,,另一种基于 inference 或者 derivation.。约束满足的 search 采用深度优先回溯的形式,而 inference 则通过变量消除和树聚类算法或有界局部一致性强制来执行。与人类解决问题的技术相比,conditioning 类似于猜测(一个变量的值),或者通过假设进行推理。然后将问题划分为子问题,以变量子集的实例化为条件,每个子问题都应得到解决。另一方面,inference 对应于对手头问题的重新解释或演绎。基于 inference 的算法派生并记录新信息,生成等价的问题表示,从而更容易地解决问题。
如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑
相关文献
- [Handbook of Constraint Programming](Handbook.dvi (gla.ac.uk))
从一个例子出发
我们先看一个简单的约束满足问题(CSP),假设约束如下:
max A + B + C + D + E s . t . A + 2 B + 3 C ⩽ 5 A + 2 E + 3 F ⩽ 4 C + 2 D + 3 E ⩽ 3 A + 2 C + 3 E ⩽ 2 A , B , C , D , E ∈ N \begin{aligned} \max\ & A+B+C+D+E \\ s.t. & A + 2B + 3C \leqslant 5 \\ & A + 2E + 3F \leqslant 4 \\ & C + 2D + 3E\leqslant 3 \\ & A + 2C + 3E \leqslant 2 \\ & A,B,C,D,E \in \mathbb{N} \end{aligned} max s.t.A+B+C+D+EA+2B+3C⩽5A+2E+3F⩽4C+2D+3E⩽3A+2C+3E⩽2A,B,C,D,E∈N
我们把所有变量画在图上,然后对于每个约束,我们画一个圈,刚好包含其变量,如图(a)所示,我们一般称之为hypergraph。
通过节点表示变量,并将弧与驻留在同一约束中的任意两个节点关联起来,如图(b)所示,我们一般称之为Primal-constraint graph (二元约束图的泛化)。
我们来看一下对偶问题:
min
5
W
+
4
X
+
3
Y
+
2
Z
{
W
+
X
+
Z
⩾
1
2
W
⩾
1
3
W
+
Y
+
2
Z
⩾
1
2
Y
⩾
1
2
X
+
3
Y
+
3
Z
⩾
1
3
X
⩾
1
W
,
X
,
Y
,
Z
∈
N
\begin{aligned} \min 5W+4X+3Y+2Z \\ \left\{ %在equation环境下使用,用\left\{命令添加左大括号,用\right.以打点.结束 \begin{gathered} W& +& X& & & +& Z& \geqslant 1 \\ 2W& & & & & & & \geqslant 1 \\ 3W& & & +& Y& +& 2Z& \geqslant 1 \\ & & & & 2Y& & & \geqslant 1 \\ & & 2X& +& 3Y& +& 3Z& \geqslant 1 \\ & & 3X& & & & & \geqslant 1 \\ \end{gathered} \right.\\ W,X,Y,Z \in \mathbb{N} \\ \end{aligned}
min5W+4X+3Y+2Z⎩
⎨
⎧W2W3W+X2X3X++Y2Y3Y+++Z2Z3Z⩾1⩾1⩾1⩾1⩾1⩾1W,X,Y,Z∈N
我们知道其实
W
W
W 对应原问题第一个约束:
A
+
2
B
+
3
C
⩽
5
A + 2B + 3C \leqslant 5
A+2B+3C⩽5,那我们重新定义一下符号,令
W
=
(
A
B
C
)
W=(ABC)
W=(ABC) :
min
5
(
A
B
C
)
+
4
(
A
E
F
)
+
3
(
C
D
E
)
+
2
(
A
C
E
)
{
(
A
B
C
)
+
(
A
E
F
)
+
(
A
C
E
)
⩾
1
2
(
A
B
C
)
⩾
1
3
(
A
B
C
)
+
(
C
D
E
)
+
2
(
A
C
E
)
⩾
1
2
(
C
D
E
)
⩾
1
2
(
A
E
F
)
+
3
(
C
D
E
)
+
3
(
A
C
E
)
⩾
1
3
(
A
E
F
)
⩾
1
(
A
B
C
)
,
(
A
E
F
)
,
(
C
D
E
)
,
(
A
C
E
)
∈
N
\begin{aligned} \min 5(ABC)+4(AEF)+3(CDE)+2(ACE) \\ \left\{ %在equation环境下使用,用\left\{命令添加左大括号,用\right.以打点.结束 \begin{gathered} (ABC)& +& (AEF)& & & +& (ACE) &\geqslant 1 \\ 2(ABC)& & & & & & &\geqslant 1 \\ 3(ABC)& & & +& (CDE)& +& 2(ACE) &\geqslant 1 \\ & & & & 2(CDE)& & &\geqslant 1 \\ & & 2(AEF)& +& 3(CDE)& +& 3(ACE) &\geqslant 1 \\ & & 3(AEF)& & & & &\geqslant 1 \\ \end{gathered} \right.\\ (ABC),(AEF),(CDE),(ACE) \in \mathbb{N} \\ \end{aligned}
min5(ABC)+4(AEF)+3(CDE)+2(ACE)⎩
⎨
⎧(ABC)2(ABC)3(ABC)+(AEF)2(AEF)3(AEF)++(CDE)2(CDE)3(CDE)+++(ACE)2(ACE)3(ACE)⩾1⩾1⩾1⩾1⩾1⩾1(ABC),(AEF),(CDE),(ACE)∈N
我们又知道,对偶问题不等号右边的系数其实来自于原问题的目标函数,第一个约束对应原问题目标函数里
A
A
A 的系数,我们记为
A
c
o
e
f
A_{coef}
Acoef :
min
5
(
A
B
C
)
+
4
(
A
E
F
)
+
3
(
C
D
E
)
+
2
(
A
C
E
)
{
(
A
B
C
)
+
(
A
E
F
)
+
(
A
C
E
)
⩾
A
c
o
e
f
2
(
A
B
C
)
⩾
B
c
o
e
f
3
(
A
B
C
)
+
(
C
D
E
)
+
2
(
A
C
E
)
⩾
C
c
o
e
f
2
(
C
D
E
)
⩾
D
c
o
e
f
2
(
A
E
F
)
+
3
(
C
D
E
)
+
3
(
A
C
E
)
⩾
E
c
o
e
f
3
(
A
E
F
)
⩾
F
c
o
e
f
(
A
B
C
)
,
(
A
E
F
)
,
(
C
D
E
)
,
(
A
C
E
)
∈
N
\begin{aligned} \min 5(ABC)+4(AEF)+3(CDE)+2(ACE) \\ \left\{ %在equation环境下使用,用\left\{命令添加左大括号,用\right.以打点.结束 \begin{gathered} (ABC)& +& (AEF)& & & +& (ACE) &\geqslant A_{coef} \\ 2(ABC)& & & & & & &\geqslant B_{coef} \\ 3(ABC)& & & +& (CDE)& +& 2(ACE) &\geqslant C_{coef} \\ & & & & 2(CDE)& & &\geqslant D_{coef} \\ & & 2(AEF)& +& 3(CDE)& +& 3(ACE) &\geqslant E_{coef} \\ & & 3(AEF)& & & & &\geqslant F_{coef} \\ \end{gathered} \right.\\ (ABC),(AEF),(CDE),(ACE) \in \mathbb{N} \\ \end{aligned}
min5(ABC)+4(AEF)+3(CDE)+2(ACE)⎩
⎨
⎧(ABC)2(ABC)3(ABC)+(AEF)2(AEF)3(AEF)++(CDE)2(CDE)3(CDE)+++(ACE)2(ACE)3(ACE)⩾Acoef⩾Bcoef⩾Ccoef⩾Dcoef⩾Ecoef⩾Fcoef(ABC),(AEF),(CDE),(ACE)∈N
于是我们会发现一个现象,比如第一个约束:
(
A
B
C
)
+
(
A
E
F
)
+
(
A
C
E
)
⩾
A
c
o
f
f
(A)
(ABC)+(AEF)+(ACE)\geqslant A_{coff} \tag{A}
(ABC)+(AEF)+(ACE)⩾Acoff(A)
每个变量名都有A,那么他们的关系我们就记为A,以此类推,我们画图(c),一般我们称为dual-constraint-graph
我们看到图©中 ( A E F ) (AEF) (AEF) 和 ( A B C ) (ABC) (ABC) 之间的弧线是多余的,因为变量A也沿着备选路径 ( A B C ) − A C − ( A C E ) − A E − ( A E F ) (ABC) - AC - (ACE) - AE - (AEF) (ABC)−AC−(ACE)−AE−(AEF) 出现。因此,即使去掉了 ( A E F ) (AEF) (AEF) 和 ( A B C ) (ABC) (ABC) 之间的约束,这些约束也保证了对 A A A 的一致赋值。同样,标记为 E E E 和 C C C 的弧线也是冗余的,删除它们产生图(d)。
最后我们总结一下: (a)Hyper, (b)Primal, ©Dual and (d)Join-tree constraint graphs of a CSP.
那么小伙伴肯定要问了,我们折腾了一大圈画了这个图到底有什么用呢?
我们其实很容易发现根节点是 A C E ACE ACE ,对应的约束是 A + 2 C + 3 E ⩽ 2 A + 2C + 3E \leqslant 2 A+2C+3E⩽2 ,从这个约束中能推出 R A C E = { ( 0 , 0 , 0 ) , ( 1 , 0 , 0 ) , ( 2 , 0 , 0 ) , ( 0 , 1 , 0 ) } R_{ACE}=\{(0,0,0),(1,0,0),(2,0,0),(0,1,0)\} RACE={(0,0,0),(1,0,0),(2,0,0),(0,1,0)} 。
A | C | E |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
2 | 0 | 0 |
0 | 1 | 0 |
这时候我们发现 E = 0 E=0 E=0 ,于是可以把变量 E E E fixed。我们再看 A C E ACE ACE 的子节点,比如说 C D E CDE CDE ,因为 E = 0 E=0 E=0 ,所以其实 C D E CDE CDE 已经变成 C D CD CD 了。 R C D = ( 0 , 0 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 3 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) R_{CD}={(0,0),(1,0),(2,0),(3,0),(0,1),(1,1)} RCD=(0,0),(1,0),(2,0),(3,0),(0,1),(1,1) 。因为 C D CD CD 和 A C AC AC 之间的关系只有 C C C ,所以我们只关心两种关系 C C C 取交集。于是 R C D = { ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) } R_{CD}=\{(0,0),(1,0),(0,1),(1,1)\} RCD={(0,0),(1,0),(0,1),(1,1)} 。其实我们会发现 R C D R_{CD} RCD 也是很特殊的关系,可以拆分成 R C = { 0 , 1 } , R D = { 0 , 1 } R_C=\{0,1\},R_D=\{0,1\} RC={0,1},RD={0,1}
C | D |
---|---|
0 | 0 |
1 | 0 |
0 | 1 |
1 | 1 |
同样的, A E F AEF AEF 已经变成 A F AF AF 了, R A F = { ( 0 , 0 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 3 , 0 ) , ( 4 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) } R_{AF}=\{(0,0),(1,0),(2,0),(3,0),(4,0),(0,1),(1,1)\} RAF={(0,0),(1,0),(2,0),(3,0),(4,0),(0,1),(1,1)} 。因为 A F AF AF 和 A C AC AC 之间的关系只有 A A A ,所以我们只关心两种关系 A A A 取交集。于是 R A F = { ( 0 , 0 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) } R_{AF}=\{(0,0),(1,0),(2,0),(0,1),(1,1)\} RAF={(0,0),(1,0),(2,0),(0,1),(1,1)}。
A | F |
---|---|
0 | 0 |
1 | 0 |
2 | 0 |
0 | 1 |
1 | 1 |
同样的, R A B C = { ( 0 , 0 , 0 ) , ( 1 , 0 , 0 ) , ( 2 , 0 , 0 ) , ( 3 , 0 , 0 ) , ( 4 , 0 , 0 ) , ( 5 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 1 , 1 , 0 ) , ( 2 , 1 , 0 ) , ( 3 , 1 , 0 ) , ( 0 , 2 , 0 ) , ( 1 , 2 , 0 ) , ( 0 , 0 , 1 ) , ( 1 , 0 , 1 ) , ( 2 , 0 , 1 ) , ( 0 , 1 , 1 ) } R_{ABC}=\{(0,0,0),(1,0,0),(2,0,0),(3,0,0),(4,0,0),(5,0,0),(0,1,0),(1,1,0),(2,1,0),(3,1,0),(0,2,0),(1,2,0),(0,0,1),(1,0,1),(2,0,1),(0,1,1)\} RABC={(0,0,0),(1,0,0),(2,0,0),(3,0,0),(4,0,0),(5,0,0),(0,1,0),(1,1,0),(2,1,0),(3,1,0),(0,2,0),(1,2,0),(0,0,1),(1,0,1),(2,0,1),(0,1,1)} 。因为 A B C ABC ABC 和 A C AC AC 之间的关系有 A C AC AC ,所以我们关心两种关系 A C AC AC 取交集。于是 R A B C = { ( 0 , 0 , 0 ) , ( 1 , 0 , 0 ) , ( 2 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 1 , 1 , 0 ) , ( 2 , 1 , 0 ) , ( 0 , 2 , 0 ) , ( 1 , 2 , 0 ) , ( 0 , 0 , 1 ) , ( 0 , 1 , 1 ) } R_{ABC}=\{(0,0,0),(1,0,0),(2,0,0),(0,1,0),(1,1,0),(2,1,0),(0,2,0),(1,2,0),(0,0,1),(0,1,1)\} RABC={(0,0,0),(1,0,0),(2,0,0),(0,1,0),(1,1,0),(2,1,0),(0,2,0),(1,2,0),(0,0,1),(0,1,1)} 。
A | B | C |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
2 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 0 |
2 | 1 | 0 |
0 | 2 | 0 |
1 | 2 | 0 |
0 | 0 | 1 |
0 | 1 | 1 |
又因为
R
A
B
C
R_{ABC}
RABC 包含了
R
A
C
R_{AC}
RAC ,又因为
R
A
B
C
R_{ABC}
RABC 包含了
R
C
R_{C}
RC ,所以最终我们只需看:
R
D
=
{
0
,
1
}
R
A
F
=
{
(
0
,
0
)
,
(
1
,
0
)
,
(
2
,
0
)
,
(
0
,
1
)
,
(
1
,
1
)
}
R
A
B
C
=
{
(
0
,
0
,
0
)
,
(
1
,
0
,
0
)
,
(
2
,
0
,
0
)
,
(
0
,
1
,
0
)
,
(
1
,
1
,
0
)
,
(
2
,
1
,
0
)
,
(
0
,
2
,
0
)
,
(
1
,
2
,
0
)
,
(
0
,
0
,
1
)
,
(
0
,
1
,
1
)
}
E
=
0
\begin{aligned} &R_D=\{0,1\} \\ &R_{AF}=\{(0,0),(1,0),(2,0),(0,1),(1,1)\} \\ &R_{ABC}=\{(0,0,0),(1,0,0),(2,0,0),(0,1,0),(1,1,0),(2,1,0),(0,2,0),(1,2,0),(0,0,1),(0,1,1)\} \\ &E=0 \\ \end{aligned}
RD={0,1}RAF={(0,0),(1,0),(2,0),(0,1),(1,1)}RABC={(0,0,0),(1,0,0),(2,0,0),(0,1,0),(1,1,0),(2,1,0),(0,2,0),(1,2,0),(0,0,1),(0,1,1)}E=0
又容易发现
D
D
D 仅在
R
D
R_D
RD 中,那么对于MILP问题来说,我们直接可以关注目标函数来确定最优的
D
D
D 值,于是
D
=
1
D=1
D=1 ,
R
A
F
=
{
(
0
,
0
)
,
(
1
,
0
)
,
(
2
,
0
)
,
(
0
,
1
)
,
(
1
,
1
)
}
R
A
B
C
=
{
(
0
,
0
,
0
)
,
(
1
,
0
,
0
)
,
(
2
,
0
,
0
)
,
(
0
,
1
,
0
)
,
(
1
,
1
,
0
)
,
(
2
,
1
,
0
)
,
(
0
,
2
,
0
)
,
(
1
,
2
,
0
)
,
(
0
,
0
,
1
)
,
(
0
,
1
,
1
)
}
D
=
1
E
=
0
\begin{aligned} &R_{AF}=\{(0,0),(1,0),(2,0),(0,1),(1,1)\} \\ &R_{ABC}=\{(0,0,0),(1,0,0),(2,0,0),(0,1,0),(1,1,0),(2,1,0),(0,2,0),(1,2,0),(0,0,1),(0,1,1)\} \\ &D=1 \\ &E=0 \\ \end{aligned}
RAF={(0,0),(1,0),(2,0),(0,1),(1,1)}RABC={(0,0,0),(1,0,0),(2,0,0),(0,1,0),(1,1,0),(2,1,0),(0,2,0),(1,2,0),(0,0,1),(0,1,1)}D=1E=0
同样的 F F F 仅在 R A F R_{AF} RAF 中, C C C 仅在 R A B C R_{ABC} RABC 中, B B B 仅在 R A B C R_{ABC} RABC 中:
R A F = { ( 2 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) } R A B C = { ( 2 , 1 , 0 ) , ( 0 , 2 , 0 ) , ( 1 , 2 , 0 ) , ( 0 , 1 , 1 ) } D = 1 E = 0 \begin{aligned} &R_{AF}=\{(2,0),(0,1),(1,1)\} \\ &R_{ABC}=\{(2,1,0),(0,2,0),(1,2,0),(0,1,1)\} \\ &D=1 \\ &E=0 \\ \end{aligned} RAF={(2,0),(0,1),(1,1)}RABC={(2,1,0),(0,2,0),(1,2,0),(0,1,1)}D=1E=0
这时候 Join-tree constraint graphs of a CSP 变成了:
至此,我们其实已经完成了推理过程。之后的方法有很多,也不是本用例的重点。
图形化表示(Graphical Representations)
待更新。。。