如何将二次转换为线性程序?

时间:2015-06-11 07:25:38

标签: mathematical-optimization linear-programming integer-programming quadratic-programming

我有一个优化问题,在目标函数2中有多个变量,使模型成为二次方。

我目前正在使用zimpl来解析模型,并使用glpk来解决它。由于它们不支持二次编程,我需要将其转换为MILP。

。第一个变量是实数,在[0,1]范围内,第二个变量是实数,范围从0到inf。这个可以没有问题是整数。

目标函数中的关键部分如下所示:

max ... + var1 * var2 + ...

我在约束中遇到了类似的问题,但它们很容易解决。

我怎样才能在目标函数中解决这类问题?

1 个答案:

答案 0 :(得分:13)

此形式的模型实际上称为双线性优化问题。线性化双线性项的典型方法是通过称为McCormick包络的方法。

考虑变量x和y,在最大化问题的目标中需要x*y。如果我们假设x和y受xL <= x <= xUyL <= y <= yU限制,那么我们可以将x*y替换为w,数量的上限,具有以下约束(您可以看到派生here):

w <= xU*y + x*yL - xU*yL
w <= x*yU + xL*y - xL*yU
xL <= x <= xU
yL <= y <= yL

请注意,这些约束在决策变量中都是线性的。 McCormick信封中有相应的下限,但由于你最大化它们在你的情况下并不重要。

如果你想在x*y上更紧密地绑定,你可以将其中一个变量(我将在这里使用x)的间隔分成范围[xL1,xU1],[xL2,xU2] ,. ..,[xLn,xUn],引入辅助连续变量{x1,x2,...,xn}和{w1,w2,...,wn}以及辅助二元变量{z1,z2,... ,zn},它将指示选择了哪个x值范围。上面的约束可以替换为(我将显示索引1的情况,但是对于所有n个索引你需要这些):

w1 <= xU1*y + x1*yL - xU1*yL*z1
w1 <= x1*yU + xL1*y - xL1*yU*z1
xL*z1 <= x1 <= xU*z1

基本上,只要z1 = 0(也就是未选择范围的这一部分),你将有x1 = 0和w1 <= 0,如果z1 = 1,你将拥有正常的McCormick包络(也就是这部分范围被选中)。

最后一步是从这些变量的范围特定版本中生成x和w。这可以通过以下方式完成:

x = x1 + x2 + ... + xn
w = w1 + w2 + ... + wn

你制作的n越大,你对双线性项的估计就越准确。但是,大的n值会影响求解模型的易处理性。

最后一个注意事项 - 你指出你的一个变量是无界的,但麦考密克包络需要两个变量的界限。你应该修复边界,求解,如果你的最佳值在边界,那么你应该用不同的边界重新求解。