Skip to content

Multi-objective Pareto-frontier examples (workforce + portfolio)#151

Draft
cafzal wants to merge 6 commits into
NVIDIA:mainfrom
cafzal:multi-objective-examples
Draft

Multi-objective Pareto-frontier examples (workforce + portfolio)#151
cafzal wants to merge 6 commits into
NVIDIA:mainfrom
cafzal:multi-objective-examples

Conversation

@cafzal
Copy link
Copy Markdown

@cafzal cafzal commented Jun 1, 2026

Multi-objective (Pareto frontier) examples — companion to the cuOpt skill PR

Two examples that extend existing folders to demonstrate multi-objective Pareto-frontier exploration with cuOpt — the workflow proposed as the cuopt-multi-objective-exploration skill in NVIDIA/cuopt#1355 (discussion NVIDIA/cuopt#1351).

  • workforce_optimization/workforce_optimization_multiobjective.ipynb (MILP) — turns the cost-minimizing workforce model into a tradeoff surface: cost vs. coverage (relax coverage == required and sweep a coverage floor) and cost vs. fairness (promote the base model's fixed max_shifts cap to a swept ε-constraint — a fixed constraint treated as a candidate objective). Reads the frontier as an exchange rate (marginal $ per shift), caps every MILP solve with a time_limit, and shows that an integer program has no constraint duals. ε-constraint is the default; weighted-sum is a one-line method note, not a demo.

workforce: cost vs. coverage frontier (left) and cost vs. fairness (right)

  • portfolio_optimization/QP_portfolio_frontier_duals.ipynb (QP) — recognizes the base QP notebook's hand-coded target-return loop as the ε-constraint method, rebuilds it as the named workflow, and adds the piece the manual sweep omits: the return-constraint dual (shadow price d(variance)/d(return)) along the efficient frontier, with the PDLP-tolerance caveat.
portfolio_frontier_and_shadow_price

Both reuse the base notebooks' data, run on cuOpt alone (Colab GPU), and follow the repo's notebook idiom (GPU check → cuopt-cu12 install → solve). Notebooks ship output-stripped (repo convention — every existing cuopt-examples notebook has 0 cell outputs); the run evidence is below.

User testing

Both notebooks were built by following the skill, then run end-to-end on Colab T4, cuOpt 26.4.0 — clean, no API errors:

  • Workforce — cost vs. coverage (MILP). Cheapest full-coverage plan = $468 (all 51 shifts staffed). The ε-constraint sweep traces a 52-point frontier (coverage 0–51); the marginal cost read off the curve rises ~$8 → $12 per added shift; all 52 solved to Optimal (0 FeasibleFound). A single solve was only ever the right-most point.
  • Workforce — cost vs. fairness (MILP). Sweeping the max_shifts cap (the constraint-as-objective move): full coverage holds at $468 down to a cap of 11, then $470 / $473 / $484 at caps 10 / 9 / 8, and goes infeasible at ≤ 7 — a clean price-of-fairness curve plus a feasibility cliff.
  • Portfolio (QP). The efficient frontier plus the return-constraint dual, which rises ~0 → 13.2 as the required return climbs (the marginal risk cost of return). All points solved to Optimal (0 PrimalFeasible), so the PDLP-tolerance caveat is mild here.

Notes

  • Synthetic/toy data — same as the base notebooks; this demonstrates the method, not a staffing or investment study.
  • MILP points all solved to Optimal (0 FeasibleFound) — optimal to cuOpt's gap tolerance (exact here, since labor cost is integer-valued); the per-solve time_limit is a guard that didn't bind.
  • QP duals are optimal to PDLP tolerance (first-order solver); any PrimalFeasible point is flagged (none here).

Draft — cross-linked to the skill PR NVIDIA/cuopt#1355; no reviewers pinged yet. pre-commit / CI to run before un-drafting.

…io QP duals)

Signed-off-by: cafzal <cameron.afzal@gmail.com>
cafzal added 5 commits June 1, 2026 11:00
…-sum gotcha demo)

Signed-off-by: cafzal <cameron.afzal@gmail.com>
…older READMEs

Signed-off-by: cafzal <cameron.afzal@gmail.com>
… sweeps

Signed-off-by: cafzal <cameron.afzal@gmail.com>
Signed-off-by: cafzal <cameron.afzal@gmail.com>
…onvention)

Signed-off-by: cafzal <cameron.afzal@gmail.com>
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