MATLAB中CPLEX“cplexmilp”函数的奇怪结果

根据
my previous question,我想使用二进制整数线性编程(所有变量都是二进制)来优化目标函数,如下所示:

Minimize f = (c1*x1) + (c2*x2) + MAX((c3*x3),(c4*x4)) + (c5*x5)
Subject to: some equality and inequality constraints

对于MAX运算符,我使用辅助变量x6并将x6> =(c3 * x3)和x6> =(c4 * x4)约束添加到问题中,因此问题变为:

Minimize f = (c1*x1) + (c2*x2) + x6 + (c5*x5),  with added constraints.

我使用CPLEX API for MATLAB来优化目标函数.
因为所有变量都是二进制的,除了一个((x6)是连续的)并且系数具有双值,问题变成混合整数线性编程,所以我使用了cplexmilp函数和这个配置:

>变量类型:ctype =’BBBBBC'(B:二进制,C:连续)
>下限:lb = [0 0 0 0 0 0]
>上限:ub = [0 0 0 0 0 inf]
>功能调用:
[fval] = cplexmilp(f,Aineq,bineq,Aeq,beq,[],[],[],lb,ub,ctype)

但有时在结果中我看到x3和x4有连续值(0到1之间)和x3 x4 = 1.
所以我的问题是:

>任何人都可以告诉我x3和x4有什么问题吗?
>是否存在不使用辅助变量并使用cplexbilp解决此优化问题的解决方案?

提前致谢

[UPDATE]:
我的代码的一部分有逻辑错误我修复了它们,现在在x3和x4都不是二进制的所有情况下我们都有x3 *(1-x3)< 10 ^( – 5),x4 *(1-x4)< 10 ^( – 5)和x3 x4 = 1,所以@David Nehme是对的(根据他的有用评论),但我的第二个问题仍然存在!

最佳答案 大卫的解决方案向您展示了为什么您的配方已经线性化但非二元化.您还可以尝试以LP或MPS格式打印问题以查看所有结果约束.

你问过一个继续纯粹是二元的配方.这是一种方法:

将其转换为纯二元配方

这是一种方法来保持Max()也是二进制的问题.它涉及额外的辅助.变量,但是一旦你应用标准的if-then IP技巧,它就相对简单了.

首先,让我们在一个简单的表中列出四种可能的情况,并查看max()项可以采用的值.这些案件是互相排斥的.

  x3 | x4 | max (c3.x4, c4.x3)
 -------------------------------
  0   | 0 | 0
  1   | 0 | c3
  0   | 1 | c4
  1   | 1 | max(c3, c4) - a constant

现在,让C34成为最大值(c3,c4).请注意,C34是一个数字,而不是问题中的变量.我们需要这个用于新的Objective功能.

引入新的二进制变量

对于上述四种情况中的每一种,我们引入一个辅助BINARY变量.为清楚起见,将它们称为y0,y3,y4,y34.

上表中只有一个案例可以容纳,因此我们添加:

y0 + y3 + y4 + y34 = 1 
yi are BINARY

现在,剩下的就是添加链接约束,以确保:

 If x3=0 AND x4=0 then y0=1
 If x3=1 AND x4=0 then y3=1
 If x3=0 AND x4=1 then y4=1
 If x3=1 AND x4=1 then y34=1

我们可以通过为上述每个条件添加一对线性约束来确保.

   2 y0 <= (1- x3) + (1 -x4)
  (1-x3) + (1-x4) <= y0 + 1

   2 y3 <= x3 + (1-x4)
  x3+(1-x4) <= y3 + 1

   2 y4 <= x4 + (1-x3)
  x4+(1-x3) <= y4 + 1

   2 y34 <= x3 + x4
  x3+x4 <= y34 + 1

新的目标函数现在变为:

   Minimize f = (c1*x1) + (c2*x2) + (c5*x5) + 0*Y0 + C3*Y3 + C4*Y4 + C34*Y34

请注意,我们在目标函数中不再具有Max()项.并且所有x和y变量都是二进制的.应包括所有原始约束加上上面的新约束(8 1 = 9).一旦你这样做,你可以使用cplexbilp,因为它是一个纯粹的BILP问题.

希望有所帮助.

点赞