[在处理线性程序时,我遇到了这个问题:可以将两类变量关联起来,例如Xij(大于或等于零的变量集)和Yij(决策变量),这样:
if Xij> 0 -> Yij = 1
if Xij == 0 -> Yij = 0
谢谢大家。
对于所有CPLEX API,您可以使用逻辑约束。
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_min
和Xij_max
来表示Xij
变量的最小和最大限制?如果变量没有物理限制,则Xij > 0
可以根据需要设置为较小或有意义,并且Xij_min
可以为任意高。然后通过添加以下两个约束,可以实现您想要的:
Xij_max
为了便于说明,我假设Xij >= Xij_min * Yij
Xij <= Xij_max * Yij
和Xij_min = 0.1
。这将产生约束:
Xij_max = 1000
如果Xij >= 0.1 * Yij
Xij <= 1000 * Yij
取值介于0.1和1000之间(我们将其定义为可行的正范围),则Xij
必须为1。
现在,如果Yij
变为0,则为了使这些约束保持为Xij
,必须具有0以具有Yij
和Xij <= 0
。