关联 CPLEX 约束中的两个变量
Correlate two variables in a CPLEX constraint
在处理线性程序时,我遇到了这个问题:可以关联两个 类 变量,例如 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
如果 Xij
取 0.1 到 1000 之间的值(我们将其定义为可行的正范围),则 Yij
必须为 1。
现在,如果 Xij
变为 0,那么为了使这些约束成立,Yij
需要为 0 才能拥有 Xij <= 0
和 Xij >= 0
。
在处理线性程序时,我遇到了这个问题:可以关联两个 类 变量,例如 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
如果 Xij
取 0.1 到 1000 之间的值(我们将其定义为可行的正范围),则 Yij
必须为 1。
现在,如果 Xij
变为 0,那么为了使这些约束成立,Yij
需要为 0 才能拥有 Xij <= 0
和 Xij >= 0
。