[Coin-discuss] OSI branchAndBound vs CBC

Matthew Galati magh at lehigh.edu
Sat May 23 19:45:46 EDT 2009


Thanks All.

This
   const char *args[] = {"Cbc_Test", "-solve", "-quit"};
   CbcModel model(*solver.getRealSolverPtr());
   CbcMain0(model);
   CbcMain1(3, args, model);

seems to work much better than OsiCbc::branchAndBound( ) !

This is a very odd construction. Maybe I asked this before, but why don't we
just have a CbcModel::model.solve( ) method? Why is there not some simple
API like this for solving a MILP with CBC?

Moreover - for OSI users, why don't we have an OsiCbc::solveMilp( ) method?
The base class can have solveMilp( ) virtual and for those OsiXxx's that can
solve MILPs (OsiCpx, OsiXpr, OsiCbc, ...), it gets derived, else it returns
an error. I understand the reluctance to add MILP support in OSI when OSI2
was being discussed -- but that was many years ago. As an "interim" fix, can
we at least make OSI work for MILPs - since many people are already using
them to define and (try to) solve MILPs.

Thanks,
Matt



Hi,
>
> > I have a similar problem, which you helped me with previously:
> > http://list.coin-or.org/pipermail/cbc/2008-February/thread.html#99
> >
> > Just a quick summary: I have a model in OSI and need to get solution
> > there as well:
> >   OsiCbcSolverInterface solver;
>
> Better use "OsiClpSolverInterface solver;" here.
> I think Cbc do some special stuff if the instance comes as an OsiClp
> object.
>
> >   const char *args[] = {"Cbc_Test", "-solve", "-quit"};
> >
> > One option is to create a new CbcModel and solve it:
> >   CbcModel model(*solver.getRealSolverPtr());
> >   CbcMain0(model);
> >   CbcMain1(3, args, model);
> > This works fine, but how do I get copy the solution to the OSI object?
> > (I tried solver->getModelPtr()->setBestSolution and
> > solver->getModelPtr()->setObjValue, using the values from model, but it
> > does not work - it does not update the "best possible solution", so even
> > if solver knows about the optimal solution, it does not know it is
> > optimal..)
>
> CbcModel creates a copy of the Osi interface that you give to it and
> works on this one. So maybe using the OsiSolverInterface* from
> model.solver() will work?
> Or you fix integer variables to the solution in your Osi, try to copy
> the basis from model.solver() as well, and do a resolve() in your Osi.
>
> > The other option is to work directly on the CbcModel of the OSI object:
> >   CbcMain0(*solver.getModelPtr());
> >   CbcMain1(3, args, *solver.getModelPtr());
> > In works fine in the sense that solver now has the optimal solution (and
> > knows it is optimal).
> > The problem with this version is that the CbcMain1 function takes more
> > than 3 times longer and in the first option - any idea why and how to
> > fix it?
>
> Maybe the way the CbcModel is setup in OsiCbc is different.
>
> Stefan
>
> --
> Stefan Vigerske
> Humboldt University Berlin, Numerical Mathematics
> http://www.math.hu-berlin.de/~stefan<http://www.math.hu-berlin.de/%7Estefan>
>
> _______________________________________________
> Coin-discuss mailing list
> Coin-discuss at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/coin-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/coin-discuss/attachments/20090523/930e3137/attachment.html>


More information about the Coin-discuss mailing list