我需要将以下 if-else 语句转换为线性约束:
x = 1, if R > 0
x = 0, otherwise
其中,x是二进制数,R是实数决策变量。
使用 R 的上限 M,我尝试了以下线性约束:
-M(1-x) <= R <= Mx
此方法有效,但当 R = 0 时,x 可以为 0 或 1。我的求解器不接受“<" or ">”类型约束。当 R = 0 时如何严格得到 x = 0?
一种方法是引入一个非常小的正数 ε (epsilon),它代表
R
可以取的最小正值。这里,ε 应选择足够小,以使其实际上是与当前问题相关的 0 以上 R
的最小增量。该值将严格不等式转变为非严格不等式,因为它表明对于 R
的任何正值,即使是最小的,x
也必须为 1。
约束可以写为:
R <= Mx
(和以前一样)-M(1 - x) <= R - ε
这样,如果
R
恰好为 0,则第二个约束变为 -M(1 - x) <= -ε
,这对于 x = 1
来说是不可能的,除非 M
也非常小,而这不应该是这样。上限 M
应设置为至少与 R
的最大可能值(即其上限)一样大的值。
实际上,当
R
正好为 0 时,第二个约束强制 x
为 0。当 R
为正时,即使是最小的正值,x
也必须为 1 才能满足第二个约束。
仅当您的求解器和问题上下文能够以不干扰问题其他方面的方式处理此类 ε 的引入时,此方法才有效。 ε 的选择可能很棘手,因为它必须足够小,不会被认为对于
R
的值很重要,但又不能小到导致求解器出现数值问题。