ULSAlgorithms v0.20.0 adds two public exact cut-and-solve strategies:
They share the normal IUlsSolver and IAsyncUlsSolver contracts.
Let:
\[d_{j,l}=\sum_{t=j}^{l}d_t, \qquad L=\{0,\ldots,l\}. \]
For every \(S\subseteq L\), the classical inequality is
\[\sum_{j\in S}x_j+ \sum_{j\in L\setminus S}d_{j,l}y_j \ge d_{0,l}. \]
These inequalities give the classical convex-hull description of ULS.
Primary references:
For fixed \(l\), each period contributes either:
\[x_j \]
or
\[d_{j,l}y_j. \]
Therefore the minimum left-hand side over all subsets \(S\) is
\[\sum_{j=0}^{l} \min\{x_j,d_{j,l}y_j\}. \]
The exact most-violated subset is thus
\[S_l^*= \{j\le l:x_j\le d_{j,l}y_j\}. \]
GeneralLsCutSeparator generates one exact separation candidate for every \(l\).
Complexity:
This separator is valid for the general cost structure represented by UlsProblem.
Under the no-speculative-motive condition
\[p_t+h_t\ge p_{t+1}, \]
Pochet and Wolsey show that the ULS polyhedral structure simplifies substantially.
The Wagner-Whitin specialization used here considers prefix sets
\[S=\{0,\ldots,k-1\}. \]
Using the inventory-balance equations, the canonical (l,S) inequality is equivalent to
\[I_{k-1}+ \sum_{j=k}^{l}d_{j,l}y_j \ge d_{k,l}. \]
WagnerWhitinLsCutSeparator evaluates every pair \((k,l)\) using prefix production sums and backward weighted-setup sums.
Complexity:
Primary reference:
Y. Pochet, L.A. Wolsey, Polyhedra for lot-sizing with Wagner-Whitin costs, Mathematical Programming 67 (1994), 297-323, DOI 10.1007/BF01582225.
Both public strategies use the same root-loop architecture:
The final MILP is solved with the same optimization engine selected during the first LP iteration. Automatic priority remains:
The final MILP guarantees exactness even if MaximumIterations stops the root-separation loop before complete closure.
Every separator candidate creates a CutRecord.
For each cut the result exposes:
Typical dispositions are:
CuttingPlaneUlsSolveResult exposes:
and the complete report is available through:
This directly answers which constraints were generated and which were actually added.