简体   繁体   中英

How to access solution for dual simplex solver?

I have an objective function with several hundreds of quadratic terms which I would like to minimize; in this case I try to minimize the absolute distance between several variables. So the structure of my problem looks like this (highly simplified):

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

I use the Python API to solve the problem in the following way:

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()

And for the above example I then receive (showing only iterations 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

so a and b are equal which makes sense since I try to minimize their distance and the constrains are clearly fulfilled.

However, my actual problem is far more complex and I receive:

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

I have now several questions regarding the output which are closely connected:

1) Clearly, it is not the objective value for the dual simplex printed. Why is that, since I set the solver to be the dual simplex?!

2) How do I now access the results for the dual simplex? As the objective value is smaller I would be more interested in these results.

3) Does the num_best status guarantee that all the constrains are met ie is the solution valid but just not guaranteed to be optimal?

4) Primal Obj and Dual Obj differ quite a lot. Is there any strategy to minimize their difference?

  1. To the best of my knowledge, get_objective_value always returns the best primal bound (regardless of the lpmethod).
  2. Information about the dual solution can be retrieved with get_dual_values .
  3. The num_best solution status means that a solution is available, but there is no proof of optimality (see here ). This is probably the most important point with regards to the rest of the questions here.
  4. You could try turning on the numerical emphasis parameter to see if that helps. There are also various tolerances you can adjust (eg, optimality tolerance ).

Note that all of the links I've used above are for the C Callable Library (which the Python API calls internally) for CPLEX 12.6.3.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM