[Cbc] Incorrect solution from Cbc with Clp

Kish Shen kisshen at cisco.com
Fri Nov 30 12:59:18 EST 2007


Hi,

This is actually a follow up to a problem I posted about a couple of 
weeks ago: a user of our system had some incorrect solutions to his 
problems, and with John Forrest's help, I was able to solve this problem 
by updating the trunk branch Cbc that I used, on 9 Nov. This gave 
correct solutions to our user's existing problems. He has since tried 
his program with newer data sets, and he has found another problem where 
one of the constraints of the problem is violated by the solution values 
returned by Cbc/Clp.

I ran some tests, and found that this only happen on the Linux, running 
on 32 bit x86 processors. The violated constraint is as follows:

cons565:  x225 + x226 + x227 + x228 + x229 + x230 + x231 + x232
           + x233 = 1

All the variables are integer variables, and have bounds of 0..1. The 
constraint is violated because all the solution values for the variables 
are 0.

In addition to updating the Cbc I was using, I also made another change 
to my code, because John suggested that I should not do the linear 
presolve when solving a MIP problem. To stop the linear presolve, I 
added the following to my code:

	lpd->lp->Solver->setHintParam(OsiDoPresolveInInitial, false, OsiHintDo, 
NULL);
	lpd->lp->Solver->setHintParam(OsiDoPresolveInResolve, false, OsiHintDo, 
NULL);


where lpd->lp->Solver is a OsiClpSolver *, where the problem is loaded into.

I found that when I removed these two lines, the above problem is solved 
correctly.

Any idea why this might be so? If required, I can produce the C/C++ 
program to reproduce this problem.

Thanks in advance for any help!

A different issue I noticed: the above constraint is taken from an lp 
file for the problem, which is produced after the problem was solved. I 
noticed that the bounds for the integer variables in this lp file are 
fixed to their solution values, e.g.

  0 <= x225 <= 0 

  0 <= x226 <= 0 

  0 <= x227 <= 0 

  0 <= x228 <= 0 

  0 <= x229 <= 0 

  0 <= x230 <= 0 

  0 <= x231 <= 0
  0 <= x232 <= 0
  0 <= x233 <= 0

I know that Cbc does fix the integer variables' bounds to their solution 
values, but in my code, I explicitly reset the bounds to their original 
values after solving the problem -- this is to allow the problem to be 
resolved again, and in the checking for the constraint violation, I also 
obtain the bounds of the variables, and the bounds return are 0 and 1, 
rather than the fixed values in the LP file.

Cheers,

Kish Shen


More information about the Cbc mailing list