[Cbc] getting solution to original problem from Cbc/Clp

Kish Shen kisshen at cisco.com
Thu Nov 8 12:58:34 EST 2007


Hi John,

I have not had time to look into my problem again in detail until now, 
so sorry for the delay in this follow-up...

John J Forrest wrote:
> 
> Kish,
> 
> It sounds as if you are using presolve rather than CglPreProcess.  This 
> could give wrong results as you describe.
> 
> Look at Cbc/examples/sample2.cpp and try with PREPROCESS defined to 1 or 
> 2 to see two ways of using CglPreProcess.
> 
> As to your questions.
> 
> 1)  The solver can in some circumstances not have an integer solution - 
> bestSolution is what is needed but it must go through post processing.


I think it is best if I actually show what exactly I am doing in my 
code. Here is a brief outline of what I do:

Types of variables used:

OsiClpSolverInterface * lpd->lp->Solver   <--- the original problem

OsiSolverInterface *    mipsolver
CbcModel *              lpd->lp->mipmodel
CbcModel *              model
CglPreProcess		process

1. I first preprocess the original problem:

	mipsolver = process.preProcess(*lpd->lp->Solver, false, 5);

2. I then put this preprocessed problem into a CbcModel (unless 
preprocess failed, in which case I abort):

	lpd->lp->mipmodel = new CbcModel(static_cast<OsiSolverInterface 
&>(*mipsolver));
         CbcModel* model = lpd->lp->mipmodel;

The lpd->lp->mipmodel is to allow me to access the model later in the 
code, whereas model is used locally..

3. this is followed by some more optimisations etc., based on the 
example2 code, and then branchAndBound is called:

     model->branchAndBound();

In some cases, the branchAndBound may time-out early, because a timeout 
is set.

4. the problem is post-processed (this is always done, even if the 
problem was timed out, or is infeasible):

	process.postProcess(*model->solver());

looking at the comment of example2, this will put the post-processed 
solution back into lpd->lp->Solver. I then subsequently access this via 
lpd->lp->Solver->getColSolution().

My user have reported that the solution returned may sometimes be wrong 
because it seems to violate some the constraints in the original 
problem. This is why I thought I may be returning a relaxed solution 
from a node in the branch and bound (e.g. when the problem was timed 
out), rather than the best integer solution. This is why I want to use 
bestSolution to return the solution.

However, bestSolution is a method for CbcModel, and not OSI, I think, 
and the solution in the CbcModel (the one in model in my code) is still 
the preprocessed problem, rather than the original problem, even after 
the postProcess call in 4. I checked this by returning the column number 
for model before and after the post-processing, and it is the same (and 
less than the original problem's).

Is there any way I can be certain I am getting the best integer solution
found by the branchAndBound, in the original problem form, rather than 
the preprocessed one?

In checking the column numbers, I was somewhat surprised that I got an 
error in the second call to getNumCols:

	std::cout<< "before:"<<mipsolver->getNumCols()<<std::endl;
	process.postProcess(*model->solver());
 >>>	std::cout<< "after:"<<mipsolver->getNumCols()<<std::endl;

here is the output from running this:

before:16
pure virtual method called
after:Signal 6

I am not sure this is directly related to my problem, but is this 
expected behaviour?

I think I am using a Cbc that I download in June this year.

Thanks in advance for any information/help!

Cheers,

Kish




> 2) The result should be correct for problem with all integer variables 
> fixed to correct values.
> 
> 
> John Forrest
> 
> 
> *Kish Shen <kisshen at cisco.com>*
> Sent by: cbc-bounces at list.coin-or.org
> 
> 10/19/2007 12:03 PM
> 
> 	
> To
> 	cbc at list.coin-or.org
> cc
> 	
> Subject
> 	[Cbc] getting solution to original problem from Cbc/Clp
> 
> 
> 	
> 
> 
> 
> 
> 
> Hi,
> 
> I am using CBC with CLP as the linear solver. CLP is accessed via OSI
> i.e. OsiClpSolverInterface), but CBC is accessed directly, instead of
> via OSI.
> 
> I have been obtaining the solution state for MIP problems via the OSI
> calls, e.g. getColSolution(), getRowPrice(), etc.. One of our users
> reported that some of the solution is incorrect, e.g. variables that
> should be integers are not, and some constraints are violated.
> 
> I suspected that this is because the OSI calls are via
> OsiClpSolverInterface, and so I am obtaining the state from the most
> recent LP relaxation, rather than the most recent MIP solution. I
> therefore changed the code to obtain the solution state via Cbc calls,
> for example, bestSolution() of CbcModel instead of getColSolution().
> 
> Unfortunately, in this case, the number of columnssiz in the problem
> seems to be much smaller: in one example, the original problem had 945
> columns, and the MIP solution of the problem has only  205 columns. I
> assume this is because presolve reduced the problem, and bestSolution()
> returns the solution for the presolved matrix.
> 
> Questions:
> 
> 1) Am I correct that OSIClpSolverInterface's methods, such as
> getColSolution(), is returning the state from the LP relaxation, rather
> than the MIP solution? [If not, then there is something wrong with the
> MIP solution produced]
> 
> 2) How can I obtain the MIP solution state (solution values, row price,
> row activity, reduced cost [and basis status for the LP relaxation that
> produced the MIP solution, if this is available], for the original
> problem (and not the presolved problem)?
> 
> Thanks in advance for any help/information!
> 
> Cheers,
> 
> Kish Shen
> _______________________________________________
> Cbc mailing list
> Cbc at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cbc
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Cbc mailing list
> Cbc at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cbc


More information about the Cbc mailing list