27 public string Name =>
"Chiu modified Least Unit Cost";
36 CancellationToken cancellationToken =
default)
38 ArgumentNullException.ThrowIfNull(problem);
39 cancellationToken.ThrowIfCancellationRequested();
43 var buffer = ArrayPool<int>.Shared.Rent(horizon);
47 var cycleEnds = buffer.AsSpan(0, horizon);
62 while (start < horizon)
64 cancellationToken.ThrowIfCancellationRequested();
67 var quantity = demands[start];
68 var accumulatedHolding = 0.0;
69 var previousUnitCost = setupCost / quantity;
71 for (var end = start + 1; end < horizon; end++)
78 quantity += demands[end];
80 if (!
double.IsFinite(accumulatedHolding) ||
81 !
double.IsFinite(quantity))
83 throw new ArithmeticException(
84 "Numerical overflow while evaluating modified LUC.");
88 (setupCost + accumulatedHolding) /
91 if (unitCost > previousUnitCost)
96 previousUnitCost = unitCost;
100 cycleEnds[start] = bestEnd;
108 cancellationToken.ThrowIfCancellationRequested();
122 ArrayPool<int>.Shared.Return(
Implements Chiu's modified Least Unit Cost heuristic.
string Name
Gets the stable human-readable name of the solver.
UlsSolveResult Solve(UlsProblem problem, CancellationToken cancellationToken=default)
Solves an uncapacitated lot-sizing problem.
UlsSolverKind Kind
Gets the broad family of the solver.
static bool IsApplicable(UlsProblem problem)
Shared applicability checks for classical stationary-cost lot-sizing heuristics.
static void ThrowIfNotStationary(UlsProblem problem, string solverName)
static bool HasStationaryRelevantCosts(UlsProblem problem)
static int FindNextPositiveDemand(ReadOnlySpan< double > demands, int start)
Builds and validates a zero-backlogging heuristic solution from a set of replenishment cycles.
static UlsSolveResult Build(UlsProblem problem, ReadOnlySpan< int > cycleEnds, string solverName, CancellationToken cancellationToken)
Applies the published final-lot merge test used by the modified LUC and modified PPB heuristics.
static bool TryMergeLastLot(UlsProblem problem, Span< int > cycleEnds)
Eliminates the final replenishment lot when moving its complete demand to the preceding replenishment...
Represents a validated classical uncapacitated lot-sizing problem.
int Horizon
Gets the number of planning periods.
ReadOnlySpan< double > HoldingCosts
Gets end-of-period unit holding costs by period.
ReadOnlySpan< double > Demands
Gets demand by period.
ReadOnlySpan< double > SetupCosts
Gets fixed setup costs by period.
Represents the outcome returned by a ULS solution strategy.
Defines the common strategy contract implemented by every ULS solver.
UlsSolverKind
Identifies the broad family of a ULS solution strategy.