在零一整数线性编程(ILP)中表达布尔逻辑运算


58

我有一个带有一些表示布尔值的变量的整数线性程序(ILP)X一世。的X一世的被约束为整数并保持0或1(0X一世1个)。

我想使用线性约束对这些0/1值的变量表示布尔运算。我怎样才能做到这一点?

更具体而言,我想设置(布尔AND),ÿ 2 = X 1X 2(布尔OR),和ÿ 3 = ¬ X 1(布尔非)。我使用0/1的明显解释为布尔值:0 =否,1 =否。如何编写ILP约束以确保y ix i相关联?ÿ1个=X1个X2ÿ2=X1个X2ÿ3=¬X1个ÿ一世X一世

(这可以被视为要求将CircuitSAT简化为ILP,或者要求将SAT表示为ILP的方法,但是在这里,我想看到一种编码上述逻辑运算的显式方法。)

Answers:


66

逻辑AND:使用线性约束ÿ1个X1个+X2-1个ÿ1个X1个ÿ1个X20ÿ1个1个,其中ÿ1个被限制为一个整数。这加强了所需的关系。(很整洁,您可以只用线性不等式做到这一点,是吧?)

逻辑OR:使用线性约束ÿ2X1个+X2ÿ2X1个ÿ2X20ÿ21个,其中ÿ2被限制为一个整数。

逻辑非:使用ÿ3=1个-X1个

逻辑蕴涵:为了表达ÿ4=X1个X2(即,ÿ4=¬X1个X2),我们可以调整为逻辑或的结构。特别地,使用线性约束ÿ41个-X1个+X2ÿ41个-X1个ÿ4X20ÿ41个,其中ÿ4被限制为一个整数。

强制逻辑蕴涵:以表达X1个X2必须持有,只需使用线性约束X1个X2(假设X1个X2都已经约束到布尔值)。

XOR:为了表达ÿ5=X1个X2(异或的X1个X2),则使用线性不等式ÿ5X1个+X2ÿ5X1个-X2ÿ5X2-X1个ÿ52-X1个-X20ÿ51个,其中ÿ5被约束为一个整数。


另外,还有一种技巧是,在制定包含零一(布尔)变量和整数变量混合的问题时,通常可以提供帮助:

投给布尔(版本1):假设有一个整数变量X和要定义ÿ使得ÿ=1个如果X0ÿ=0如果X=0。如果附加地知道0Xü,则可以使用线性不等式0ÿ1个ÿXXüÿ ; 但是,这仅在您知道上限和下限时才有效X。或者,如果您知道|X|ü。(即-üXü)对于某一常数ü,那么你可以使用所描述的方法在这里。仅当您知道 |的上限时,才适用 x ||X|

转换为布尔值(版本2):让我们考虑相同的目标,但是现在我们不知道X的上限。但是,假设我们知道X0。这就是在线性系统中表达约束的方式。首先,引入一个新的整数变量Ť。添加不等式0ÿ1个ÿXŤ=X-ÿ。然后,选择目标函数,以使Ť最小。仅当您还没有目标函数时,这才有效。如果你有ñ非负整数变量X1个Xñ并希望所有的人都投以布尔值,使ÿ一世=1个,如果X一世1个ÿ一世=0,如果X一世=0,那么您能介绍ñ变量Ť1个Ťñ与不等式0ÿ一世1个ÿ一世X一世Ť一世=X一世-ÿ一世并定义目标函数以最小化Ť1个++Ťñ。同样,这仅适用于定义目标函数的其他操作(如果除了对布尔值进行强制转换之外,您还打算仅检查所得ILP的可行性,而不是尝试最小化/最大化变量的某些功能)。


对于一些优秀的实践问题和可行的示例,我建议制定整数线性程序:A Rogues'Gallery


哪个线性规划求解器可以解决这个问题?因为采用* .lp或* .mps格式,约束的一侧必须是固定整数而不是变量。
boxi 2015年

4
@boxi,我对* .lp或* .mps格式一无所知,但是每个整数线性编程求解器都应该能够解决这个问题。请注意,如果您有类似,这相当于Ÿ - X 0,这可能是你想要的格式。Xÿyx0
DW

-我再次检查。lp_solve可以解决它,但是例如qsopt不能解决。我不知道为什么。但感谢<3
boxi 2015年

@boxi,我刚查了QSopt在线小程序GUI,一旦我改变了它可以处理这类约束的X - Ÿ 0,所以我不知道发生了什么事。(我使用* .lp格式。)如果任何ILP求解器无法处理这些系统,我都会感到惊讶。如果您对QSopt有其他疑问,则应该将其带到QSopt支持论坛。XÿX-ÿ0
DW

1
@Pramod,好收获!感谢您发现该错误。你是绝对正确的。我问了一个有关如何为该案例建模的新问题,当我们得到一个答案时,我将更新此答案。
DW

19

可以在一个范围约束而不是三个约束中建模逻辑与关系(就像在另一种解决方案中一样)。因此,不是将三个约束 它可以使用单范围约束被写入 0 X 1 + X 2 - 2 ý 11

ÿ1个X1个+X2-1个ÿ1个X1个ÿ1个X2
类似地,对于逻辑OR: 0 2 ý 1 - X 1 - X 21
0X1个+X2-2ÿ1个1个
02ÿ1个-X1个-X21个

如果不是,则没有这样的改进。

通常,对于Ñ -WAY AND)的约束将是: 0 &Sigma; X - ñ Ÿ ñ - 1ÿ=X1个X2Xññ 类似地,对于OR: 0 Ñ ý - Σ X ñ - 1

0X一世-ñÿñ-1个
0ñÿ-X一世ñ-1个

本文中有一个非常类似的方法:ncbi.nlm.nih.gov/pmc/articles/PMC1865583
Abdelmonem Mahmoud Amer

3

我发现XOR y =x1⊕x2的更短解决方案(x和y是二进制0、1)

仅一行:x1 + x2-2 * z = y(z是任意整数)


要表达ILP中的相等性,您需要两个不相等性。此外,为避免解X1个=1个X2=0ž=200ÿ=-1990ÿ1个

b
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.