[BCP] BCP 1.2.0 question, BCP_vg_user vs. BCP_tm_user::generate_vars_in_lp
Laszlo Ladanyi
ladanyi at us.ibm.com
Thu Oct 23 11:45:59 EDT 2008
On Wed, 22 Oct 2008, Laszlo Ladanyi wrote:
> Hi Sebastian,
>>
>> LinearProgram::generate_vars_in_lp, fathom 0
>> LP: Number of vars received from VG: 0
>> LP: Total number of vars in local pool: 0
>> LP: In iteration 1 BCP generated 0 cuts , 0 vars before calling branch()
>>
>> then Bcp continues, and fails with:
>> LP: Default select_branching_candidates() executed.
>> BM: Couldn't branch!
>>
>> Which could be legit but is still strange as the core variables/columns
>> I added ensure feasibility and the root node solution is integral.
>> (Hence without added columns it should be recognized as optimal solution.)
>
> Hmmm..., this is odd. Is there any output beforehand that indicates that a
> feasible solution is found? You should get the "Couldn't branch" message
> only if the current node is not integral feasible, no vars/cuts are added
> and yet every var that's declared integer has an integer value. One
> possibility is that feasibility checking has a different zero tolerance
> than the branching (hence a solution might not be found feasible but then
> later no branching var can be selected), but I think I have rooted out all
> such problems. Can you share the code with me? I could try to look into what's
> going on.
>
I was wrong... You should get the "Couldn't branch" message if BCP thinks that
it must branch, but couldn't. How can this happen? Why does BCP think that it
must branch? Well, it must branch if the current upper bound is higher than
the current lower bound (forget about various gaps for now). In your case the
upper bound is the feas solution found, but what is the lower bound? The lower
bound is *NOT* te value of the LP relaxation. That would be the lb if no
columns were generated, but you have specified that you will generate columns.
So column generation code will work properly only if the compute_lower_bound()
method is implemented properly which should return a true lower bound (one
that's correct no matter what cols could still be generated) for the current
node. By default this routine returns the old lower bound if columns are to be
generated. The starting lb is -inf, so if you have not implemented this
method then the lb stays -inf forever, so BCP will want to keep branching.
A related question is how to generate a true lower bound. Well, that's not
trivial :-). Usually what happens is that the columns that can be generated
form several cliques so in any solution you can have at most one column from
any of the cliques. Then if you can estimate the most negative reduced cost
for every clique then a true lower bound is the current LP relaxation value
plus the sum of those most negative reduced costs.
I hope this describes the problem clearly and you can get going.
Cheers,
--Laci
>>
>> Thanks a lot,
>> Sebastian
>>
>> PS: The .hpp documentation of Bcp is quite detailed and understandable,
>> I am positively surprised!
>
> Hey! I'm positively surprised that someone finds the docs understandable! :-)
>
>> _______________________________________________
>> BCP mailing list
>> BCP at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/bcp
>>
>
> Thanks,
> --Laci
> _______________________________________________
> BCP mailing list
> BCP at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/bcp
>
More information about the BCP
mailing list