[Cbc] branchAndBound() malfunction

John Forrest john.forrest at fastercoin.com
Thu Jun 11 13:20:33 EDT 2015


Alessio,

I would not use OsiCbc.

To avoid Cbc getting confused, it is probably best to create a clean 
CbcModel from the master CoinModel each time - that way bounds won't be 
preset.

John Forrest
On 10/06/15 19:49, Alessio Melosi wrote:
> Hello, I have some problem with my c++ code for the resolution of the 
> capacitated facility location problem (CFL) with the Benders method. 
> It is an iterative method that at each step has to solve a continuous 
> subproblem, generate a new constraint for the master problem (which 
> has one continuous variable and m-1 binary variables), solve the 
> master problem and use the master solution to update the 
> righthandsides of the subproblem for the next iteration. Here is the 
> pseudo-code of my algorithm:
>
> *****************************************************************
> BEGIN
> read the input;
> create a model for the master problem using CoinModel;
> add variables and rows to the master CoinModel according to the input;
> create a model for the subproblem using CoinModel;
> add variables and rows to the subproblem CoinModel according to the input;
> create the solver for the master problem using OsiCbcSolverInterface;
> create the solver for the subproblem using OsiClpSolverInterface;
> FOR( iter = 0 ; iter < maxiter ; iter++)
>   load the subproblem CoinModel into the OsiClpSolverInterface;
>   solve the subproblem with initialSolve() and update the LB;
>   IF( UB - LB < eps ) break;
>   get the new constraint and add it to the master CoinModel;
>   load the master CoinModel into the OsiCbcSolverInterface;
>   solve the master problem with branchAndBound() and update the UB;
>   update the righthandsides of the subproblem CoinModel;
> ENDFOR
> END
> ******************************************************************
>
> Initially the master problem has no rows. At the first iteration the 
> first row is added to the master problem and so on. The problem is the 
> following: at the first iteration branchAndBound() solves the master, 
> but at the second iteration it doesn't, in the sense that at the 
> second iteration the binary variables are blocked to the values of the 
> previous iteration, and the solver works only with the (only one) 
> continuous variable. Because of it the program makes only two 
> iterations. Before running branchAndBound in the second iteration, a 
> simple instance of the CFL gives the following master problem in lp 
> format:
>
> \Problem name:
>
> Minimize
> obj: 1500 x0 + 1500 x1 + x2
> Subject To
> cons0:  1000000 x0 + 1000000 x1 >= 500000
> cons1:  40000 x1 + x2 >= 25000
> Bounds
>  0 <= x0 <= 1
>  0 <= x1 <= 1
> Integers
> x0 x1
> End
>
>
> clearly the opt. solution is x0=0, x1=1, x2=0, but branchAndBound() 
> x0=1, x1=0, x2=25000. At the first iteration the constraint cons1 
> wasn't there, and branchAndBound() in that case gave the right 
> opt.solution x0=1, x1=0, x2=0. As I said before It seems that the 
> binary variables are blocked at the values of the first iteration, 
> even if the lp file says 0 <= x0 <= 1 & 0 <= x1 <= 1.
> Gdb says that during the call to branchAndBound() in the second 
> iteration, the program receives signal of
> SIGTRAP, Trace/breakpoint trap
> 0x08089194 in CbcModel::setPointers(OsiSolverInterface const*) ()
>
>
> and Valgrind in that point gives an invalid read:
>
>
> ==3989== Invalid read of size 4
> ==3989==    at 0x8089194: CbcModel::setPointers(OsiSolverInterface const*)
> (in /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x80AE664: CbcModel::branchAndBound(int) (in
> /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x80800EF: OsiCbcSolverInterface::branchAndBound() (in
> /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x8051AB4: main (cwl8.cpp:657)
> ==3989==  Address 0x4a17570 is 40 bytes inside a block of size 52 free'd
> ==3989==    at 0x402D7B8: operator delete(void*) (in
> /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==3989==    by 0x82C2986: OsiSolverInterface::~OsiSolverInterface() (in
> /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x80712FD: OsiClpSolverInterface::~OsiClpSolverInterface()
> (in /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x80AE64B: CbcModel::branchAndBound(int) (in
> /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x80800EF: OsiCbcSolverInterface::branchAndBound() (in
> /home/alessio/Documenti/CWL/cwl8/cwl8)
> ==3989==    by 0x8051AB4: main (cwl8.cpp:657)
>
>
> what can i do? Thanks in advance for your help,
>
> Alessio  
>
>
> _______________________________________________
> Cbc mailing list
> Cbc at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cbc

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/cbc/attachments/20150611/04fbc82b/attachment.html>


More information about the Cbc mailing list