如何访问双单纯解算器的解?

时间:2016-04-18 13:18:28

标签: python linear-programming cplex constraint-programming

我有一个具有数百个二次项的目标函数,我想最小化;在这种情况下,我尝试最小化几个变量之间的绝对距离。所以我的问题的结构看起来像这样(高度简化):

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

所以ab是相同的,这是有道理的,因为我试图最小化它们的距离,并且明确地满足约束。

然而,我的实际问题要复杂得多,我收到了:

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 ObjDual Obj差异很大。是否有任何策略可以最大限度地减少差异?

1 个答案:

答案 0 :(得分:1)

  1. 据我所知,get_objective_value总是返回最佳原始界限(不论lpmethod)。
  2. 可以使用get_dual_values检索有关双重解决方案的信息。
  3. num_best解决方案状态表示解决方案可用,但没有最佳证明(请参阅here)。对于其他问题,这可能是最重要的一点。
  4. 您可以尝试启用numerical emphasis参数,看看是否有帮助。您还可以调整各种容差(例如optimality tolerance)。
  5. 请注意,我上面使用的所有链接都是针对CPLEX 12.6.3的C Callable Library(Python API内部调用)。