<div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div><div><div>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:<br><br>*****************************************************************<br>BEGIN<br>read the input;<br>create a model for the master problem using CoinModel;<br></div></div></div><div>add variables and rows to the master CoinModel according to the input;<br></div>create a model for the subproblem using CoinModel;<br></div><div>add variables and rows to the subproblem CoinModel according to the input;<br></div>create the solver for the master problem using OsiCbcSolverInterface;<br></div>create the solver for the subproblem using OsiClpSolverInterface;<br></div>FOR( iter = 0 ; iter &lt; maxiter ; iter++) <br></div>  load the subproblem CoinModel into the OsiClpSolverInterface;<br></div>  solve the subproblem with initialSolve() and update the LB;<br></div><div>  IF( UB - LB &lt; eps ) break;<br></div>  get the new constraint and add it to the master CoinModel;<br></div>  load the master CoinModel into the OsiCbcSolverInterface;<br></div>  solve the master problem with branchAndBound() and update the UB;<br></div>  update the righthandsides of the subproblem CoinModel;<br></div>ENDFOR<br></div><div>END<br></div><div>******************************************************************<br><br></div><div>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&#39;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:<br><br>\Problem name: <br><br>Minimize<br>obj: 1500 x0 + 1500 x1 + x2<br>Subject To<br>cons0:  1000000 x0 + 1000000 x1 &gt;= 500000<br>cons1:  40000 x1 + x2 &gt;= 25000<br>Bounds<br> 0 &lt;= x0 &lt;= 1<br> 0 &lt;= x1 &lt;= 1<br>Integers<br>x0 x1 <br>End<br><br></div><div><br></div><div>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&#39;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 &lt;= x0 &lt;= 1 &amp; 0 &lt;= x1 &lt;= 1.<br></div><div>Gdb says that during the call to branchAndBound() in the second iteration, the program receives signal of <br><pre><span style="font-family:arial,helvetica,sans-serif">SIGTRAP, Trace/breakpoint trap
0x08089194 in CbcModel::setPointers(OsiSolverInterface const*) ()</span><br><br><br></pre><pre><font face="arial,helvetica,sans-serif">and Valgrind in that point gives an invalid read:<br><br></font><br><span style="font-family:arial,helvetica,sans-serif">==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&#39;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)</span><br><br><br></pre><pre><font face="arial,helvetica,sans-serif">what can i do? Thanks in advance for your help,<br><br></font></pre><pre><font face="arial,helvetica,sans-serif">Alessio</font> <br></pre><pre><br></pre></div></div>