我对 AMPL 建模有疑问。你能帮我定义一个二进制变量 u,当另一个变量 x 也等于 0 时,它假设等于 0,而当 x 不等于 0 时,它等于 1?
我试图使用逻辑表达式,但我正在使用的求解器(cplex 和 minos)不允许它。
我的想法是:
subject to:
u || x != u && x
我对 AMPL 建模有疑问。你能帮我定义一个二进制变量 u,当另一个变量 x 也等于 0 时,它假设等于 0,而当 x 不等于 0 时,它等于 1?
我试图使用逻辑表达式,但我正在使用的求解器(cplex 和 minos)不允许它。
我的想法是:
subject to:
u || x != u && x
取M
一个“大”常数,例如x < M
保持,并假设x
是一个整数(或者x >= 1
如果x
是连续的)。您可以使用两个约束:
u <= x (if x=0, then u=0)
x <= M*u (if x>0, then u=1)
带有u
二进制变量。
如果 nowx
是连续的且不一定大于 1,则必须调整上述约束(例如,此处的第一个约束不会使用x=0.3
and验证u=1
)。
a
一般的想法是,您可以(在许多情况下)用不等式替换这些逻辑约束,使用 if和b
是布尔变量的事实,那么语句“a
蕴含b
”可以写为b>=a
(if a=1
, then b=1
)。