【发布时间】:2016-04-18 13:18:27
【问题描述】:
我有一个包含数百个二次项的目标函数,我想将其最小化;在这种情况下,我尝试最小化几个变量之间的绝对距离。所以我的问题的结构看起来像这样(高度简化):
Minimize
obj: [ a^2 - 2 a * b + b^2 ] / 2
Subject To
c1: a + b >= 10
c2: a <= 100
End
我使用Python API通过以下方式解决问题:
import cplex
cpx = cplex.Cplex()
cpx.read('quadratic_obj_so.lp')
# use the dual simplex
cpx.parameters.lpmethod.set(cpx.parameters.lpmethod.values.dual)
cpx.solve()
print cpx.solution.get_values()[0:15]
print cpx.solution.status[cpx.solution.get_status()]
print cpx.solution.get_objective_value()
然后对于上面的示例,我收到(仅显示迭代 16-18):
Itn Primal Obj Dual Obj Prim Inf Upper Inf Dual Inf
16 1.4492800e-19 -1.0579911e-07 3.81e-14 7.11e-15 5.17e-25
17 9.0580247e-21 -2.6449779e-08 1.91e-14 3.55e-15 2.33e-25
18 5.6612645e-22 -6.6124446e-09 5.45e-14 7.11e-15 6.46e-27
[73.11695794600045, 73.11695794603409]
optimal
0.0
所以a 和b 是相等的,这是有道理的,因为我尝试将它们的距离最小化并且显然满足了约束。
但是,我的实际问题要复杂得多,我收到了:
Itn Primal Obj Dual Obj Prim Inf Upper Inf Dual Inf
92 1.4468496e+06 1.2138985e+06 1.80e+02 2.64e-12 5.17e-02
93 1.4468523e+06 1.2138969e+06 2.23e+02 2.17e-12 1.08e-02
94 1.4468541e+06 1.2138945e+06 2.93e+02 2.31e-12 5.62e-02
* 1.4457132e+06 1.2138598e+06 7.75e+00 7.61e-09 2.76e-02
num_best
1445714.46525
我现在有几个与输出密切相关的问题:
1) 显然,这不是对偶单纯形打印的目标值。为什么会这样,因为我将求解器设置为对偶单纯形?!
2) 我现在如何访问对偶单纯形法的结果?由于目标值较小,我会对这些结果更感兴趣。
3) num_best 状态是否保证满足所有约束,即解决方案是否有效但不能保证是最优的?
4) Primal Obj 和 Dual Obj 差别很大。有什么策略可以最小化它们的差异吗?
【问题讨论】:
-
我不认为这个日志来自对偶单纯形法,而是来自障碍法。另请注意,求解 QP 通常不是使用 Simplex LP 方法完成的。
-
@ErwinKalvelagen:感谢您的评论!你会推荐什么?
-
我会先看看一些可能的重新表述。尝试将尽可能多的逻辑从目标移到线性约束中(例如,(x+y)^2 可以写成 z^2,z=x+y)。还要看缩放。试试 Cplex 选项
numericalEmphasis。 -
这是个好主意,谢谢!
标签: python linear-programming cplex constraint-programming