【问题标题】:How to access solution for dual simplex solver?如何访问对偶单纯形求解器的解决方案?
【发布时间】: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

所以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 差别很大。有什么策略可以最小化它们的差异吗?

【问题讨论】:

  • 我不认为这个日志来自对偶单纯形法,而是来自障碍法。另请注意,求解 QP 通常不是使用 Simplex LP 方法完成的。
  • @ErwinKalvelagen:感谢您的评论!你会推荐什么?
  • 我会先看看一些可能的重新表述。尝试将尽可能多的逻辑从目标移到线性约束中(例如,(x+y)^2 可以写成 z^2,z=x+y)。还要看缩放。试试 Cplex 选项numericalEmphasis
  • 这是个好主意,谢谢!

标签: python linear-programming cplex constraint-programming


【解决方案1】:
  1. 据我所知,get_objective_value 始终返回最佳原始界限(无论 lp 方法如何)。
  2. 可以通过get_dual_values 检索有关双重解决方案的信息。
  3. num_best 解决方案状态表示解决方案可用,但没有最优性证明(请参阅here)。对于这里的其余问题,这可能是最重要的一点。
  4. 您可以尝试打开numerical emphasis 参数,看看是否有帮助。您还可以调整各种容差(例如,optimality tolerance)。

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

【讨论】:

  • 感谢您的详细回复(我赞成并稍后接受)!关于第 3 点,只是为了确保:返回的解决方案是有效的(没有违反任何界限),但无法证明它是否是最优解决方案。它是否正确?到目前为止,我认为将变量之间的差异表达为(x1 - x2)^2 + (x2-x3)^2 + ... 而不是abs(x1-x2) + abs(x2-x3) + ... 可能会更好。当然,后面的表达式需要线性化。您知道任何将绝对差之和最小化的例子吗?
  • 不,在 num_best 解决方案状态下,我认为您不能假设解决方案是有效的。如果我理解正确,您可能会发现 this 关于绝对值的博客很有趣。在面向对象的 API(C++、Java、.NET)中,您可以使用 abs 方法。
  • 我四处询问并使用回调和设置迭代限制进行了一些测试。我相信第 1) 点是正确的,并且我在这方面的陈述更加有力。
  • IloModeler.abs 方法的更新链接可以在here 找到。如果它再次过时,可以通过导航到 CPLEX Java 参考手册 > ilog.concert > 接口 > IloModeler > abs 来找到它。
  • 虽然abs 在 CPLEX Python API(一种低级 API)中不可用,但它DOcplex(一种位于顶层的 Python 建模语言)中可用的 CPLEX Python API,或可用于在云上求解)。请参阅 docplex.mp.model.abs 方法here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多