根据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
。
所以我的问题是:
x3+x4=1
和x3
有什么问题吗? x4
解决此优化问题的解决方案? 提前致谢
[更新]:
我的代码的一部分有逻辑错误我修复了它们,现在在x3和x4都不是二进制的所有情况下我们都有x3 *(1-x3)< 10 ^( - 5),x4 *(1-x4)< 10 ^( - 5)和x3 + x4 = 1,所以@David Nehme是对的(根据他的有用评论),但我的第二个问题仍然存在!
答案 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问题。
希望有所帮助。