Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Branch-and-bound node incorrectly pruned by infeasibility #338

Open
akazachk opened this issue Sep 24, 2020 · 3 comments
Open

Branch-and-bound node incorrectly pruned by infeasibility #338

akazachk opened this issue Sep 24, 2020 · 3 comments

Comments

@akazachk
Copy link

Dear all, I am having some difficulty debugging a somewhat hard-to-trace issue in a cut generation code that I am writing and testing with the Cbc master branch. I believe that I have an instance in which a node of the branch-and-bound tree is incorrectly declared infeasible by Clp called from within Cbc, but this only happens within my code, and not when I try to produce a minimal example.

I have documented the issue (along with a link to the instance and code for my attempt at a minimal example) on my repository: akazachk/vpc#24, but I want to post here in case anyone can offer insights into what might be going wrong, or what I can do to fix it.

This is a somewhat critical bug for me, because I use a partial branch-and-bound tree as the source of a disjunction for cut generation, and if the disjunction is invalid (which would happen when a feasible subtree is incorrectly pruned), then my cuts may be invalid.

Perhaps it is important to say that I set up a custom event handler in my code, and I set some particular options that are intended to improve the partial tree with respect to the eventual cuts I obtain. These options are documented in the bb_example code linked in the issue on my repo, but generally include things like turning off presolve and cuts, as well as employing the CbcBranchDefaultDecision and CbcCompareObjective classes.

Thank you in advance for your help.

@akazachk
Copy link
Author

On a possibly related note, I am curious about what Cbc reports as the objective value at branch-and-bound nodes (in the status messages): I notice that it can be rather different from the objective value that Clp (or Gurobi) obtains for those same nodes when invoked outside of Cbc.

I assume that Cbc does something approximate like this intentionally to speed up computations, but I am wondering if it is related to the issue I am encountering.

@jjhforrest
Copy link
Contributor

jjhforrest commented Sep 24, 2020 via email

@akazachk
Copy link
Author

I agree, numerics are an issue here. This is a presolved-by-Gurobi version of bc1 from MIPLIB 2017, which is part of the "numerics" set. I will try the updated code you send.

I find it curious that I am unable to recreate the "infeasible node" with my small example having seemingly identical settings to the ones used in my cut generation code ("vpc" code). Up to node 31, the bb_example code seems to generate a partial tree that is identical to the one in the vpc code, but clearly this is not the case. I first notice a difference in iteration 460 when solving node 31, though maybe there are differences between the two solution processes even earlier than I am detecting them. I am not sure if I am missing a setting, or what else is happening.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants