[Coin-discuss] addCol / resolve problem with OsiClpSolverInterface?

Tobias Achterberg achterberg at zib.de
Fri Mar 17 03:11:10 EST 2006


Hi Stefan,

I see nothing wrong in the dual solution. Probably you are confused
about the definition of the dual LP.

Here again is your primal LP (with the corresponding dual multipliers
in brackets):

Min  68 x0 + 8 x1 + 7 x2 + 6 x3 + 10 x4
s.t.    x0 +   x1               +    x4  = 1  (y0)
        x0 +          x2        +    x4  = 1  (y1)
        x0 +                 x3          = 1  (y2)
        x0                              <= 1  (r0)
               x1                       <= 1  (r1)
                      x2                <= 1  (r2)
                             x3         <= 1  (r3)
                                     x4 <= 1  (r4)
        x0,    x1,    x2,    x3         >= 0

The common mistake is that one forgets about the upper bounds in the
dual. Here is the dual:

Max   y0 + y1 + y2 + r0 + r1 + r2 + r3 + r4
s.t.  y0 + y1 + y2 + r0                      <= 68  (x0)
      y0                + r1                 <=  8  (x1)
           y1                + r2            <=  7  (x2)
                y2                + r3       <=  6  (x3)
      y0 + y1                          + r4  <= 10  (x4)
      y0,  y1,  y2  free variables
                     r0,  r1,  r2,  r3,  r4  <=  0

As far as I understood, the dual solution you obtained was y0=8, y1=7,
y2=6, r0=r1=r2=r3=0, r4=-5. This is a feasible dual solution, and its
objective value is indeed 8+7+6-5 = 16.


Best regards,  Tobias


Stefan R0pke wrote:
> Hello,
> 
> I ran into a problem when using OsiClpSolverInterface. To illustrate the
> problem, consider the following LP:
> 
> Minimize
>  68 x0 + 8 x1 + 7 x2 + 6 x3
> Subject To
>     x0 +   x1                = 1
>     x0 +          x2         = 1
>     x0 +                 x3  = 1
> Bounds
>  0 <= x0 <= 1
>  0 <= x1 <= 1
>  0 <= x2 <= 1
>  0 <= x3 <= 1
> End
> 
> I solve the problem using OsiClpSolverInterface and get the solution x1
> = x2 = x3 = 1 as expected. Then I add an extra variable (x4) to the
> problem to get
> 
> Minimize
>  68 x0 + 8 x1 + 7 x2 + 6 x3 + 10 x4
> Subject To
>     x0 +   x1               +    x4  = 1
>     x0 +          x2        +    x4  = 1
>     x0 +                 x3          = 1
> 
> I do this with the addCol method on OsiClpSolverInterface. After calling
> resolve on OsiClpSolverInterface I get the expected solution x3=x4=1 but
> the reduced costs and dual variables appear to be wrong.
> OsiClpSolverInterface reports that the reduced cost of x4 is -5 (I had
> expected it to be zero) and the dual variables are 8, 7 and 6 which
> doesn't add up to 16 as I expected.
>  If I try to resolve the problem from scratch then I get the expected
> values.
>  Am I doing something wrong?
> 
> Below is sample code to illustrate the problem
> 
> Best regards,
> Stefan
> 
> ----------- main.cpp -----------
> 
> #include <OsiClpSolverInterface.hpp>
> #include <CoinPackedVector.hpp>
> 
> using namespace std;
> 
> void printVector(const string &strHeader, const string &strVarName,
> const double *pVec, int iNElements)
> {
>     int i;
>     cout << strHeader << ": ";
>     for (i=0; i < iNElements; i++)
>         cout << strVarName << i << "=" << pVec[i] << "  ";
>     cout << endl;
> }
> 
> void printSolution(const OsiSolverInterface &osiSolver)
> {
>     cout << "LP value: " << osiSolver.getObjValue() << endl;
>     printVector("Solution", "x", osiSolver.getColSolution(),
> osiSolver.getNumCols());
>     printVector("Reduced cost", "r", osiSolver.getReducedCost(),
> osiSolver.getNumCols());
>     printVector("Dual variables", "d", osiSolver.getRowPrice(),
> osiSolver.getNumRows());
> }
> 
> int main(void)
> {
>     OsiClpSolverInterface osiSolver;
> 
>     // read LP
>     osiSolver.readLp("test.lp");
>     osiSolver.setObjSense(1);
>     osiSolver.initialSolve();
>     cout << "**** Initial problem: ****" << endl;
>     printSolution(osiSolver);
> 
>     // Add a column with cost 10, covering row 0 and 1.
>     CoinPackedVector column;
>     column.insert(0,1);
>     column.insert(1,1);
>     osiSolver.addCol(column, 0, 1, 10);
>     osiSolver.resolve();
>     cout << "**** After adding column and resolve: ****" << endl;
>     printSolution(osiSolver);
> 
>     // Solve from scratch:
>     CoinWarmStart *pWarmStart = osiSolver.getEmptyWarmStart();
>     osiSolver.setWarmStart(pWarmStart);
>     delete pWarmStart;
>     osiSolver.resolve();
>     cout << "**** Solved from scratch: ****" << endl;
>     printSolution(osiSolver);
>     return 0;
> }
> 
> ----------- test.lp -----------
> 
> Minimize
>  68 x0 + 8 x1 + 7 x2 + 6 x3
> Subject To
>  x0 + x1 = 1
>  x0 + x2 = 1
>  x0 + x3 = 1
> Bounds
>  0 <= x0 <= 1
>  0 <= x1 <= 1
>  0 <= x2 <= 1
>  0 <= x3 <= 1
> End
> 
> 
> _______________________________________________
> Coin-discuss mailing list
> Coin-discuss at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/coin-discuss

-- 
Tobias Achterberg          Konrad-Zuse-Zentrum fuer
                           Informationstechnik Berlin
Tel: +49 (0)30 84185-301   Takustr. 7
Email: achterberg at zib.de   D-14195 Berlin, Germany



More information about the Coin-discuss mailing list