我有一个具有数百个二次项的目标函数,我想最小化;在这种情况下,我尝试最小化几个变量之间的绝对距离。所以我的问题的结构看起来像这样(高度简化):
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
差异很大。是否有任何策略可以最大限度地减少差异?
答案 0 :(得分:1)
请注意,我上面使用的所有链接都是针对CPLEX 12.6.3的C Callable Library(Python API内部调用)。