关联 CPLEX 约束中的两个变量

Correlate two variables in a CPLEX constraint

在处理线性程序时,我遇到了这个问题:可以关联两个 类 变量,例如 Xij(大于或等于零的变量集)和 Yij(决策变量)使得:

if Xij> 0 -> Yij = 1
if Xij == 0 -> Yij = 0

提前谢谢大家。

对于所有 CPLEX API,您可以使用逻辑约束。

例如“if then" in OPL CPLEX 你可以写

int nbKids=300;
float costBus40=500;
float costBus30=400;



dvar int+ nbBus40;
dvar int+ nbBus30;

minimize
 costBus40*nbBus40  +nbBus30*costBus30;

subject to
{
 40*nbBus40+nbBus30*30>=nbKids;

 // with if nb buses 40 more than 3  then nb buses30 more than 7

 (nbBus40>=3)=>(nbBus30>=7);
 //(nbBus40>=3)<=(nbBus30>=7); //equivalent
}

为了使我提出的解决方案起作用,首先,您需要定义值 Xij_minXij_max 来表示 Xij 变量的最小和最大限制,当它是Xij > 0.

Xij_min 可以小到你想要的或有意义的,而 Xij_max 可以任意高,如果你的变量没有物理限制。

然后加上下面两个约束就可以实现你想要的了:

Xij >= Xij_min * Yij
Xij <= Xij_max * Yij

为了这个例子,我假设 Xij_min = 0.1Xij_max = 1000。这将使约束:

Xij >= 0.1 * Yij
Xij <= 1000 * Yij

如果 Xij 取 0.1 到 1000 之间的值(我们将其定义为可行的正范围),则 Yij 必须为 1。

现在,如果 Xij 变为 0,那么为了使这些约束成立,Yij 需要为 0 才能拥有 Xij <= 0Xij >= 0