Skip to content

RENS - #1719

Open
nguidotti wants to merge 10 commits into
root-heuristicsfrom
rens
Open

RENS#1719
nguidotti wants to merge 10 commits into
root-heuristicsfrom
rens

Conversation

@nguidotti

@nguidottinguidotti commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

This PR implements RENS (Relaxation Enforced Neighborhood Search, see [1, 2]) heuristic. RENS construct and then solve the following sub-MIP:

$$\begin{align} & z^* = \min \, \vec{c}^T \vec{x} \\ & \text{subject to} & \mathbf{A} \vec{x} = \vec{b} \\ & & l_i \leq x_i \leq u_i, \forall i \in \mathcal{N} \setminus \mathcal{I} \\ & & \lfloor \check{x}_j \rfloor \leq x_i \leq \lceil \check{x}_j \rceil, \forall i \in \mathcal{I} \\ & & \vec{x} \in \mathbb{R}^n \\ & & x_j \in \mathbb{Z}, \forall j \in \mathcal{I} \end{align}$$

where $\mathcal{N}$ is the set of all variables and $\mathcal{I}$ is the set of integer values. In essence, all integer variables with integral values are fixed, while the ones with fractional values are restricted to be rounded up or down.

This re-use the same infrastructure as RINS, i.e., it passes through presolve and can recurse. It requires some refactoring of the sub-MIP code to support these additional features.

Closes#1584.

Results

MIPLIB2017, GH200, 10min

================================================================================
root-heuristics-1 (1) vs rens-1 (2)
================================================================================
------------------------------------------------------------------------------------------------------------------------------
| | Run 1 | Run 2 | Abs. Diff. | Rel. Diff. (%) |
------------------------------------------------------------------------------------------------------------------------------
| Imported 240 240 +0 --- |
| Feasible 227 227 +0 --- |
| Optimal 87 92 +5 --- |
| Solutions with <0.1% primal gap 145 144 -1 --- |
| Nodes explored (mean) 1.366e+07 1.309e+07 -5.731e+05 -4.19 |
| Nodes explored (shifted geomean) 8947 5351 -3596 -40.2 |
| Relative MIP gap (mean) 0.2709 0.248 -0.02291 -8.45 |
| Relative MIP gap (shifted geomean) 0.08762 0.087 -0.0006245 -0.713 |
| Solve time (mean) 419 405.6 -13.35 -3.19 |
| Solve time (shifted geomean) 189.4 176 -13.38 -7.06 |
| Primal gap (mean) 9.237 9.634 +0.3963 +4.29 |
| Primal gap (shifted geomean) 0.3752 0.3633 -0.01198 -3.19 |
| Primal integral (mean) 20.14 20.08 -0.06726 -0.334 |
| Primal integral (shifted geomean) 2.071 1.978 -0.09335 -4.51 |
------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------
| Name | status 1 | status 2 |
----------------------------------------------------------------------
| app1-2 feasible optimal |
| cbs-cta feasible optimal |
| glass-sc feasible optimal |
| mzzv11 feasible optimal |
| n2seq36q feasible optimal |
| neos-5093327-huahum optimal feasible |
| triptim1 feasible optimal |
----------------------------------------------------------------------
================================================================================
root-heuristics-2 (1) vs rens-2 (2)
================================================================================
------------------------------------------------------------------------------------------------------------------------------
| | Run 1 | Run 2 | Abs. Diff. | Rel. Diff. (%) |
------------------------------------------------------------------------------------------------------------------------------
| Imported 240 240 +0 --- |
| Feasible 225 228 +3 --- |
| Optimal 87 91 +4 --- |
| Solutions with <0.1% primal gap 143 145 +2 --- |
| Nodes explored (mean) 1.322e+07 1.306e+07 -1.595e+05 -1.21 |
| Nodes explored (shifted geomean) 8201 6479 -1722 -21 |
| Relative MIP gap (mean) 0.2695 0.2752 +0.005638 +2.09 |
| Relative MIP gap (shifted geomean) 0.0867 0.08533 -0.001362 -1.57 |
| Solve time (mean) 415.6 407.4 -8.174 -1.97 |
| Solve time (shifted geomean) 179.6 175.6 -4.007 -2.23 |
| Primal gap (mean) 10.28 9.136 -1.141 -11.1 |
| Primal gap (shifted geomean) 0.4062 0.3614 -0.04481 -11 |
| Primal integral (mean) 22.11 19.93 -2.177 -9.85 |
| Primal integral (shifted geomean) 2.074 1.961 -0.1133 -5.46 |
------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------
| Name | status 1 | status 2 |
----------------------------------------------------------------------
| app1-2 feasible optimal |
| cmflsp50-24-8-8 feasible optimal |
| glass-sc feasible optimal |
| neos-3216931-puriri timeout feasible |
| neos-5104907-jarama timeout feasible |
| peg-solitaire-a3 timeout optimal |
----------------------------------------------------------------------

References

[1] T. Berthold, “RENS: The optimal rounding,” Math. Prog. Comp., vol. 6, no. 1, pp. 33–54, Mar. 2014, doi: 10.1007/s12532-013-0060-9.
[2] T. Achterberg, “Constraint Integer Programming,” PhD, Technischen Universität Berlin, Berlin, 2007. doi: 10.14279/depositonce-1634.

Checklist

  • I am familiar with the Contributing Guidelines.
  • Testing
    • New or existing tests cover these changes
    • Added tests
    • Created an issue to follow-up
    • NA
  • Documentation
    • The documentation is up to date with these changes
    • Added new documentation
    • NA

@nguidottinguidotti added this to the 26.10 milestone Aug 14, 2026
@nguidottinguidotti self-assigned this Aug 14, 2026
@nguidottinguidotti added non-breaking Introduces a non-breaking change improvement Improves an existing functionality mip labels Aug 14, 2026
@copy-pr-bot

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

Comment threadcpp/src/branch_and_bound/branch_and_bound.cpp Outdated
@nguidotti

nguidotti commented Aug 14, 2026

Copy link
Copy Markdown
ContributorAuthor

/ok to test 7a9e5f4

@github-actions

github-actionsBot commented Aug 14, 2026

Copy link
Copy Markdown

CI Test Summary

⏭️ All 5 test job(s) skipped.

@nguidotti
nguidotti marked this pull request as ready for review August 15, 2026 08:10
@nguidotti
nguidotti requested a review from a team as a code ownerAugust 15, 2026 08:10
@nguidotti
nguidotti requested review from aliceb-nv, chris-maes, kaatish and rg20 and removed request for kaatish and rg20August 15, 2026 08:10
@nguidotti
nguidottiforce-pushed the rens branch 3 times, most recently from 5783f9d to f03ad85CompareAugust 20, 2026 12:25
@nguidotti
nguidottiforce-pushed the rens branch 4 times, most recently from 699975c to d006e2dCompareAugust 21, 2026 11:33
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…ll variables to be picked.
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…messages. infeasible is not counted during construction. fixed incorrect trigger for extension. refine progress tracking during construction.
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…g construction.
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvementImproves an existing functionalitymipnon-breakingIntroduces a non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEA] RENS

3 participants

@nguidotti@akifcorduk@aliceb-nv