Skip to content

Add single machine scheduling separator#2990

Open
Opt-Mucca wants to merge 5 commits intolatestfrom
machine-schedule-sepa
Open

Add single machine scheduling separator#2990
Opt-Mucca wants to merge 5 commits intolatestfrom
machine-schedule-sepa

Conversation

@Opt-Mucca
Copy link
Copy Markdown
Collaborator

This PR implements identification of natural-date single-machine scheduling subproblems and derives valid inequalities. See the description of highs/mip/HighsMachineSchedSeparator.h for the exact description.

Motivation: The instance neos-3046615-murg from MIPLIB 2017 benchmark now solves well within time limit, and neos-3046601-motu from MIPLIB 2017 collection now solves in a second or two (both were previously unsolvable within a few hours). This change should introduce some tiny epsilon and very positively affect some instances.

Changes:

  • Add highs/mip/HighsMachineSchedSeparator.h and highs/mip/HighsMachineSchedSeparator.cpp. Currently the separator is only called once, and the cuts are only added to the pool. This is efficient, and I noticed no real change by trying to separate more frequently.
  • I have removed some presolve code that shifts integer columns to have a lower bound of zero. Such a shift completely destroys any structure of this subproblem and makes it impossible to efficiently find. I've tested this change in isolation locally, and there was only some (positive) performance noise. I don't believe it is done for any purpose other than cosmetics + potentially making it easier to transform the LP when generating cuts, so it should be fine to remove. @fwesselm I may be missing something obvious there....

Potential improvements that I don't think need to be made:

  • Someone could model jobs from [-inf, 0] instead of [0, inf]. I'd currently not spot these. I'd also not spot a row where both binary columns share the same coefficient value (different signs), although I think presolve is going to scale these rows most of the time already.
  • Computing these inequalities requires finding a clique. I implemented the most naive greedy approach possible. I don't think we have any max-clique code outside of HighsCliqueTable, which I don't think was efficient to use in this case (could be wrong). There's likely going to be some instances that this code could improve but fails to because of this naive approach, however it ensures near-zero overhead is added to all other instances. An example: I suspect supportcase26 could be improved with some better detection.

This should not be merged until a more thorough performance check has been made! @fwesselm This is a way lower priority than the MIP Worker Refactor to review / test.

@Opt-Mucca Opt-Mucca requested a review from fwesselm April 23, 2026 10:02
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 23, 2026

Codecov Report

❌ Patch coverage is 52.66272% with 80 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.18%. Comparing base (073b504) to head (b1b8bb5).
⚠️ Report is 51 commits behind head on latest.

Files with missing lines Patch % Lines
highs/mip/HighsMachineSchedSeparator.cpp 48.71% 80 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           latest    #2990      +/-   ##
==========================================
- Coverage   81.29%   81.18%   -0.12%     
==========================================
  Files         358      361       +3     
  Lines       88753    89019     +266     
==========================================
+ Hits        72151    72269     +118     
- Misses      16602    16750     +148     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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

Successfully merging this pull request may close these issues.

1 participant