基础数学&计算数学,从事优化领域5年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法
在过去的几十年里,出现了两种主要的约束处理方案——一种基于 conditioning 或者 search,,另一种基于 inference 或者 derivation.。约束满足的 search 采用深度优先回溯的形式,而 inference 则通过变量消除和树聚类算法或有界局部一致性强制来执行。与人类解决问题的技术相比,conditioning 类似于猜测(一个变量的值),或者通过假设进行推理。然后将问题划分为子问题,以变量子集的实例化为条件,每个子问题都应得到解决。另一方面,inference 对应于对手头问题的重新解释或演绎。基于 inference 的算法派生并记录新信息,生成等价的问题表示,从而更容易地解决问题。
如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑
我们先看一个简单的约束满足问题(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 变成了:
至此,我们其实已经完成了推理过程。之后的方法有很多,也不是本用例的重点。
待更新。。。