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

时间:2014-01-02 03:12:32

标签: matlab mathematical-optimization linear-programming cplex

根据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)是连续的)并且系数具有double值,问题变成混合整数线性规划所以我用{{ 1}}具有此配置的功能:

  • 变量类型:cplexmilp B :二进制, C :连续)
  • 下限:ctype='BBBBBC'
  • 上限: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有连续值(0到1之间)和x4。 所以我的问题是:

  1. 任何人都可以告诉我x3+x4=1x3有什么问题吗?
  2. 是否存在不使用辅助变量并使用x4解决此优化问题的解决方案?
  3. 提前致谢

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

2 个答案:

答案 0 :(得分:1)

在您的情况下,需要辅助变量x6,因为“MAX”函数不是线性的(它具有不连续的梯度,其中c3 * x3 == c4 * x4)。通过添加附加变量和约束,您将使用与原始非线性问题等效的解决方案创建问题的线性版本。权衡是如果c3或c4的值不是0或1,那么你的问题不是纯二进制问题。这是一个非常好的权衡,特别是如果你使用一个好的MIP求解器。

答案 1 :(得分:1)

David的解决方案向您展示了为什么您的配方已经线性化但非二元化。您也可以尝试以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是一个数字,而不是问题中的变量。我们需要这个用于新的目标函数。

引入新的二进制变量

对于上述四种情况中的每一种,我们引入一个辅助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问题。

希望有所帮助。