如何重写程序
maximize max(2x, 3y)
s.t 0 <= x, y <= 1
这样LP / MILP可以解决它吗?
我的实际目标函数是
我是LP的新手,我不太清楚如何使用'二进制约束'。
我正在学习PuLP
和GLPK
在我的生产代码中,我将使用CPLEX
或Gurobi
那些这两个支持'最大化最大化'开箱即用?
答案 0 :(得分:2)
“最大化最大化”本质上是非凸的。你需要在这里使用MIP技巧。并且你必须能够获得最大值的物体的下限和上限才能这样做。任何有限的界限都可以,但更清晰的边界会给予更紧密的放松,这可能会更快地解决并在数值上更好。
假设您遇到以下问题,这个问题比您给出的问题稍微宽泛一点:
maximize max(3x, 2y)
s.t. 0 <= x <= A, 0 <= y <= B.
请注意,3x
在0
之下,而在3A
之上。同样,2y
在0
以下,2B
以上。现在你引入两个二进制变量c_1
和c_2
,你要求其中只有一个是1
。 c_1
对应于3x
中max
的选择,c_2
对应2y
中max
的选择。然后你写
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}
),但一般来说,这样的排列变量会给出一系列数字的顺序,并允许您选择任何一个他们按等级(在你的情况下是最大的项目)。