当我们最大化时,如何在目标函数中转换最大值?

时间:2014-02-09 23:35:12

标签: mathematical-optimization linear-programming cplex gurobi

如何重写程序

maximize max(2x, 3y)
s.t 0 <= x, y <= 1

这样LP / MILP可以解决它吗?

我的实际目标函数是 enter image description here

我是LP的新手,我不太清楚如何使用'二进制约束'。

我正在学习PuLPGLPK 在我的生产代码中,我将使用CPLEXGurobi 那些这两个支持'最大化最大化'开箱即用?

2 个答案:

答案 0 :(得分:2)

“最大化最大化”本质上是非凸的。你需要在这里使用MIP技巧。并且你必须能够获得最大值的物体的下限和上限才能这样做。任何有限的界限都可以,但更清晰的边界会给予更紧密的放松,这可能会更快地解决并在数值上更好。

假设您遇到以下问题,这个问题比您给出的问题稍微宽泛一点:

maximize max(3x, 2y)
s.t.  0 <= x <= A, 0 <= y <= B.

请注意,3x0之下,而在3A之上。同样,2y0以下,2B以上。现在你引入两个二进制变量c_1c_2,你要求其中只有一个是1c_1对应于3xmax的选择,c_2对应2ymax的选择。然后你写

maximize z_1 + z_2
s.t.  z_1 <= 3A c_1
      z_1 <= 3x
      z_2 <= 2B c_2
      z_2 <= 2y
      c_1 + c_2 = 1
      0 <= x <= A, 0 <= y <= B
      c_1, c_2 binary

第一个约束“关闭”z_1,如果最大值达到2y,则它的贡献为零。在z_1达到最大值的情况下,第二个约束限制3x 3x

答案 1 :(得分:1)

如果目标是最小化,您可以使用辅助变量,如下所示:

minimize z
s.t. z >= 2x, z >= 3y, 0 <= x, y <= 1

如果是最大化,则下面应该有效,

M是一个足够大的数字;

u_{1,2}_{1,2}是一组辅助变量,表示对2x和3y进行排序的“排列”。

maximize (z_1_2 + z_2_2)
s.t. 
z_1 = 2x
z_2 = 3y

z_1 = z_1_1 + z_1_2
z_2 = z_2_1 + z_2_2

u_1_1 + u_1_2=1
u_2_1 + u_2_2=1
u_1_1 + u_2_1=1
u_1_2 + u_2_2=1

z_1_1 <= M*u_1_1
z_1_2 <= M*u_1_2
z_2_1 <= M*u_2_1
z_2_2 <= M*u_2_2

z_1_1 + z_2_1 <= z_2_1 + z_2_2


0 <= x, y <= 1
u_{1,2}_{1,2} in {0,1}   //u_i_k are binary variables.
与sum不同,

一组数字的最小值和最大值不是线性形式,我认为CPLEX或MILP通常没有特殊的形式。在这个特定的例子中,较少数量的二进制辅助变量可能就足够了(而不是u_{1,2}_{1,2}),但一般来说,这样的排列变量会给出一系列数字的顺序,并允许您选择任何一个他们按等级(在你的情况下是最大的项目)。