MindtPy: maintain a valid dual bound in each iteration when no-good c… - #4038
Open
ZedongPeng wants to merge 2 commits into
Open
MindtPy: maintain a valid dual bound in each iteration when no-good c…#4038ZedongPeng wants to merge 2 commits into
ZedongPeng wants to merge 2 commits into
Conversation
Contributor
Author
Close the bound gap when certified integer exclusions exhaust the main problem, including single-tree solves. Retain the preceding dual bound after an unresolved fixed NLP so exclusions cannot certify false optimality or infeasibility. Add solver-backed regressions for both objective senses and document the assumptions behind the bound calculation.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes # .
Summary/Motivation:
When no-good cuts or the tabu list are active (always the case for GOA), the MILP main problem is not a relaxation of the original MINLP, so its objective value alone is not a valid dual bound. MindtPy currently corrects this after termination by deactivating the no-good cuts added after the incumbent was found and re-solving the main problem (
fix_dual_bound). This extra solve is unnecessary: the no-good cuts only exclude integer combinations whose NLP subproblems were already solved to (global) optimality or proven infeasible, so the incumbent is the exact optimum over the explored combinations, while the main problem bound remains valid for the unexplored ones. A valid dual bound is therefore simplymin(UB, v)for minimization, wherevis the main problem bound. This PR maintains that bound directly inupdate_dual_boundin every iteration, so no extra MIP/NLP solve is needed. The sequence of explored integer combinations and the termination point are unchanged.Changes proposed in this PR:
update_dual_boundwhenadd_no_good_cutsoruse_tabu_listis activefix_dual_bound(re-solved the main problem and possibly one extra NLP subproblem after termination) and its support machinery:deactivate_no_good_cuts_when_fixing_bound,num_no_good_cuts_added,last_iter_cuts, and the single-treestored_boundmechanismAI-Use Disclosure
AI tools contributed to the development of this PR
Review process (select ONE):
Notes for reviewers (optional): The dual bound shown during iterations is now the clamped valid bound, and single-tree GOA reports the clamped B&B tree bound instead of the stored bound from one iteration before the incumbent. Existing GOA and LP/NLP tests cover these paths.
Legal Acknowledgement
By contributing to this software project, I have read the contribution guide and agree to the following terms and conditions for my contribution: