如何访问对偶单纯形求解器的解决方案?

How to access solution for dual simplex solver?

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

Minimize
obj: [ a^2 - 2 a * b + b^2 ] / 2
Subject To
c1: a + b >= 10
c2: a <= 100
End

我使用PythonAPI解决问题的方式如下:

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) 显然,它不是打印的对偶单纯形的 objective 值。为什么会这样,因为我将求解器设置为对偶单纯形?!

2) 我现在如何访问对偶单纯形的结果?由于 objective 值较小,我会对这些结果更感兴趣。

3) num_best 状态是否保证满足所有约束,即解决方案是否有效但不能保证是最优的?

4) Primal ObjDual Obj 差别很大。有什么策略可以减少它们的差异吗?

  1. 据我所知,get_objective_value 总是 returns 最好的原始边界(不管 lpmethod 是什么)。
  2. 可以使用 get_dual_values 检索有关对偶解的信息。
  3. num_best 解决方案状态意味着解决方案可用,但没有最优性证明(参见 here)。关于这里的其余问题,这可能是最重要的一点。
  4. 您可以尝试打开 numerical emphasis parameter to see if that helps. There are also various tolerances you can adjust (e.g., optimality tolerance)。

请注意,我在上面使用的所有链接都是针对 CPLEX 12.6.3 的 C 可调用库(Python API 在内部调用)。