如何在Cplex约束中正确包含if语句和决策变量

时间:2019-07-15 12:49:18

标签: if-statement mathematical-optimization linear-programming cplex opl

这类似于从分散式系统转移到集中式系统的问题。因此,我想确定用作集中点的最佳位置以及需要关闭的位置。这些是我的二元决策变量Xi和Yj。 我有两个约束,包括带有决策变量的if语句。我已经读到在这种情况下,我必须使用逻辑约束,所以我做到了。

forall (i in Drives, j in Locations)(Y[j]==1 && Distance[j][i]<=20) => X[i]==0;

我想让这个约束说,如果选择了位置j(Yj = 1),并且如果i与j之间的距离小于20,那么=>我要关闭位置i(Xi = 0)

forall (j in Locations, k in Locations)(Y[j]==1 && Distance2[j][k]<=40) => Y[k]==0;

类似地,该约束条件表明如果选择位置j(Yj = 1),并且如果两个潜在位置之间的距离小于40,则我不想选择位置k(Yk = 0)

模型给出了结果,但是当我检查数字时,似乎忽略了这两个约束。因此,使用的术语无法正常工作。

1 个答案:

答案 0 :(得分:0)

这些限制对我来说似乎大部分都是正确的。在第二个约束中看起来有些可疑的是,您不排除j == k的情况。如果Y [j] == 1,则可能是Distance2[j][j]==0,因此第二个约束意味着Y [j] == 0。矛盾! 您确定CPLEX声称您的解决方案是最佳的吗?还是您可能正在寻找一个宽松的解决方案(然后才可以违反约束)?

假设Distance是数据而不是决策变量,则可以以更有效的方式编写约束。例如第一个:

forall(i in Drives)
   forall(j in Locations : Distance[j][i] <= 20)
      X[i] <= 1 - Y[j]; // If Y[j]==1 then the right-hand side becomes zero and forces X[i]==0

Similary,第二个约束可以写为

forall(j in Locations)
   forall(k in Locations : k != j && Distance2[j][k] <= 40)
      Y[k] <= 1 - Y[j]; // If Y[j]==1 then the right-hand side becomes zero and forces Y[k]==0

您可以尝试使用这些更明确的约束,还是至少排除第二个约束中j == k的情况?