Answers:
逻辑AND:使用线性约束,,,,其中被限制为一个整数。这加强了所需的关系。(很整洁,您可以只用线性不等式做到这一点,是吧?)
逻辑OR:使用线性约束,,,,其中被限制为一个整数。
逻辑非:使用。
逻辑蕴涵:为了表达(即,),我们可以调整为逻辑或的结构。特别地,使用线性约束,,,,其中被限制为一个整数。
强制逻辑蕴涵:以表达必须持有,只需使用线性约束(假设和都已经约束到布尔值)。
XOR:为了表达(异或的和),则使用线性不等式,,,,,其中被约束为一个整数。
另外,还有一种技巧是,在制定包含零一(布尔)变量和整数变量混合的问题时,通常可以提供帮助:
投给布尔(版本1):假设有一个整数变量和要定义使得如果和如果。如果附加地知道,则可以使用线性不等式,, ; 但是,这仅在您知道上限和下限时才有效。或者,如果您知道。(即)对于某一常数,那么你可以使用所描述的方法在这里。仅当您知道 |的上限时,才适用 x |
转换为布尔值(版本2):让我们考虑相同的目标,但是现在我们不知道的上限。但是,假设我们知道。这就是在线性系统中表达约束的方式。首先,引入一个新的整数变量。添加不等式,,。然后,选择目标函数,以使最小。仅当您还没有目标函数时,这才有效。如果你有非负整数变量并希望所有的人都投以布尔值,使,如果和,如果,那么您能介绍变量与不等式,,并定义目标函数以最小化。同样,这仅适用于定义目标函数的其他操作(如果除了对布尔值进行强制转换之外,您还打算仅检查所得ILP的可行性,而不是尝试最小化/最大化变量的某些功能)。
对于一些优秀的实践问题和可行的示例,我建议制定整数线性程序:A Rogues'Gallery。
可以在一个范围约束而不是三个约束中建模逻辑与关系(就像在另一种解决方案中一样)。因此,不是将三个约束 它可以使用单范围约束被写入 0 ≤ X 1 + X 2 - 2 ý 1 ≤ 1
如果不是,则没有这样的改进。
通常,对于(Ñ -WAY AND)的约束将是: 0 ≤ Σ X 我 - ñ Ÿ ≤ ñ - 1 类似地,对于OR: 0 ≤ Ñ ý - Σ X 我 ≤ ñ - 1