If statement 如何在cplex约束中正确包含带有决策变量的if语句

If statement 如何在cplex约束中正确包含带有决策变量的if语句,if-statement,mathematical-optimization,linear-programming,cplex,opl,If Statement,Mathematical Optimization,Linear Programming,Cplex,Opl,这类似于从分散系统转移到集中系统的问题。因此,我想确定用作集中点的最佳位置以及需要关闭的位置。这些是我的二元决策变量席和YJ。 我有两个约束,包括带有决策变量的if语句。我已经读到,在这种情况下,我必须使用逻辑约束,所以我这样做了 forall (i in Drives, j in Locations)(Y[j]==1 && Distance[j][i]<=20) => X[i]==0; forall(i在驱动器中,j在位置中)(Y[j]==1和距离[j][i]X[

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

forall (i in Drives, j in Locations)(Y[j]==1 && Distance[j][i]<=20) => X[i]==0;
forall(i在驱动器中,j在位置中)(Y[j]==1和距离[j][i]X[i]==0;
我想让这个约束说明,如果选择了位置j(Yj=1),并且如果I和j之间的距离小于20,那么=>我想关闭位置I(Xi=0)

forall(j在位置中,k在位置中)(Y[j]==1和&distance 2[j][k]Y[k]==0;
类似地,该约束表示,如果选择了位置j(Yj=1),并且如果两个潜在位置之间的距离小于40,则我不想选择位置k(Yk=0)


该模型给出了一个结果,但当我检查数字时,它似乎忽略了这两个约束。因此,在所使用的术语中有些不正常。

这些约束在我看来基本上是正确的。第二个约束看起来有点可疑的是,你没有排除情况j==k。如果Y[j]==1,那么可能
Distance2[j][j]==0
因此,第二个约束意味着Y[j]==0。这是一个矛盾! 您确定CPLEX声称您的解决方案是最优的吗?或者您可能正在寻找一个宽松的解决方案(这样就可以违反约束)

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

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
forall(驱动器中的i)

对于所有(j在位置:距离[j][i]的约束在我看来基本正确。在第二个约束中看起来有点可疑的是,你没有排除情况j==k。如果Y[j]=1,那么可能
Distance2[j][j]==0
,因此第二个约束意味着Y[j]==0。一个矛盾! 您确定CPLEX声称您的解决方案是最优的吗?或者您可能正在寻找一个宽松的解决方案(这样就可以违反约束)

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

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
forall(驱动器中的i)

forall(j in Locations:Distance[j][i]谢谢。我使用了您建议的约束格式,它们似乎有效。但是,出现了另一个问题,我不太确定它是否与这些约束相关。也许您可以告诉我您的见解:X[i]属于一组从1到715的位置,而Y[j]属于从1到78的一组位置。结果i只考虑我的x[i]中的前78个点。而不是整个列表。我无法识别问题,也不确定它是否是由这两个约束条件引起的。这听起来像是您在某个位置使用了错误的索引集。请仔细检查您是否始终在所有位置使用正确的
位置
驱动器
。如果找不到问题,请创建一个new提问并附上您的完整模型。谢谢。我使用了您建议的约束格式,它们似乎有效。但是,出现了另一个问题,我不确定它是否与这些约束相关。也许您可以告诉我您的见解:X[I]属于从1到715和Y[j]的一组位置属于从1到78的一组位置。结果i只考虑我的x[i]中的前78个点。而不是整个列表。我无法识别问题,也不确定它是否是由这两个约束条件引起的。这听起来像是您在某个位置使用了错误的索引集。请仔细检查您是否始终在所有位置使用正确的
位置
驱动器
。如果找不到问题,请创建一个new问题并附上您的完整模型。
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