30 "Standard lot-sizing solution-method catalog";
65 "LAGRANGIAN-CAPACITY";
129 "Operational catalog of mathematical " +
130 "programming methods, dynamic-programming " +
131 "procedures, relaxations and heuristics " +
132 "for lot-sizing problem instances.",
134 AllowUnknownFeatureCodes =
139 CreateWagnerWhitinDefinition());
142 CreateGenericMilpDefinition());
145 CreateLagrangianRelaxationDefinition());
148 CreateFixAndOptimizeDefinition());
151 CreateSilverMealDefinition());
153 catalog.EnsureValid();
159 CreateWagnerWhitinDefinition()
167 "Wagner-Whitin dynamic programming",
174 "DynamicProgramming",
175 "Dynamic_Programming",
179 "MathematicalProgramming",
188 "Exact dynamic-programming method for " +
189 "the deterministic, uncapacitated, " +
190 "single-item and single-level " +
191 "lot-sizing problem.",
196 SupportsAnyProblemFamily =
199 SupportsAnyProductStructure =
202 SupportsUnclassifiedProblems =
205 SupportsAmbiguousClassifications =
208 SupportsCompleteProblems =
211 SupportsRelaxations =
214 SupportsSubproblems =
217 CanProduceFeasibleSolution =
223 CanProvideLowerBound =
226 CanProvideUpperBound =
236 definition.ReplacePreferredProblemTypeCodes(
242 definition.ReplaceSupportedProductStructureTypes(
248 definition.ReplaceSupportedFeatureCodes(
252 "HasTimeVaryingDemand",
253 "HasInitialInventory"
256 definition.ReplacePreferredFeatureCodes(
260 "HasTimeVaryingDemand"
263 definition.ReplaceUnsupportedFeatureCodes(
264 GetClassicalSingleItemUnsupportedFeatureCodes());
267 "This definition represents the standard direct " +
268 "application of the Wagner-Whitin method. " +
269 "Specialized variants supporting additional " +
270 "features should be represented by separate " +
271 "method definitions.";
276 private static SolutionMethodDefinition
277 CreateSilverMealDefinition()
280 new SolutionMethodDefinition(
285 "Silver-Meal heuristic",
293 "ConstructiveHeuristic",
305 "Constructive heuristic for the " +
306 "deterministic, uncapacitated, " +
307 "single-item and single-level " +
308 "lot-sizing problem.",
313 SupportsAnyProblemFamily =
316 SupportsAnyProductStructure =
319 SupportsUnclassifiedProblems =
322 SupportsAmbiguousClassifications =
325 SupportsCompleteProblems =
328 SupportsRelaxations =
331 SupportsSubproblems =
334 CanProduceFeasibleSolution =
340 CanProvideLowerBound =
343 CanProvideUpperBound =
347 definition.ReplaceSupportedProblemTypeCodes(
353 definition.ReplacePreferredProblemTypeCodes(
359 definition.ReplaceSupportedProductStructureTypes(
362 ProductStructureType.IndependentItems
365 definition.ReplaceSupportedFeatureCodes(
369 "HasTimeVaryingDemand",
370 "HasInitialInventory"
373 definition.ReplacePreferredFeatureCodes(
376 "HasTimeVaryingDemand"
379 definition.ReplaceUnsupportedFeatureCodes(
380 GetClassicalSingleItemUnsupportedFeatureCodes());
383 "The standard Silver-Meal heuristic does not " +
384 "provide an optimality proof. Adapted variants " +
385 "should be represented by separate method " +
391 private static SolutionMethodDefinition
392 CreateGenericMilpDefinition()
395 new SolutionMethodDefinition(
400 "Generic mixed-integer linear formulation",
407 "MixedIntegerProgramming",
408 "MixedIntegerLinearProgramming",
409 "MathematicalProgramming",
421 "Generic mixed-integer linear formulation " +
422 "intended to represent single-level, " +
423 "multi-level, capacitated and " +
424 "supply-chain extensions when the " +
425 "corresponding variables and constraints " +
431 SupportsAnyProblemFamily =
434 SupportsAnyProductStructure =
437 SupportsUnclassifiedProblems =
440 SupportsAmbiguousClassifications =
443 SupportsCompleteProblems =
446 SupportsRelaxations =
449 SupportsSubproblems =
452 CanProduceFeasibleSolution =
458 CanProvideLowerBound =
461 CanProvideUpperBound =
465 definition.ReplaceSupportedFeatureCodes(
466 GetBroadlySupportedFeatureCodes());
468 definition.ReplacePreferredProblemTypeCodes(
478 "Practical tractability depends on the selected " +
479 "formulation, solver, parameterization, hardware " +
480 "and instance dimensions.";
485 private static SolutionMethodDefinition
486 CreateLagrangianRelaxationDefinition()
489 new SolutionMethodDefinition(
494 "Production-capacity Lagrangian " +
502 "LagrangianRelaxation",
516 "Lagrangian-relaxation template that " +
517 "dualizes production-capacity coupling " +
518 "constraints and solves the resulting " +
519 "structured subproblems.",
524 SupportsAnyProblemFamily =
527 SupportsAnyProductStructure =
530 SupportsUnclassifiedProblems =
533 SupportsAmbiguousClassifications =
536 SupportsCompleteProblems =
539 SupportsRelaxations =
542 SupportsSubproblems =
545 CanProduceFeasibleSolution =
551 CanProvideLowerBound =
554 CanProvideUpperBound =
558 definition.ReplaceSupportedProblemTypeCodes(
566 definition.ReplacePreferredProblemTypeCodes(
573 definition.ReplaceRequiredFeatureCodes(
576 "HasProductionCapacityConstraints"
579 definition.ReplaceSupportedFeatureCodes(
584 "HasProductionLeadTimes",
585 "HasMinimumLotSizes",
586 "HasLotSizeMultiples",
587 "HasSafetyStockRequirements",
589 "HasTimeVaryingDemand",
590 "HasTimeVaryingProductionCapacity",
591 "HasSharedProductionCapacity"
594 definition.ReplacePreferredFeatureCodes(
597 "HasSharedProductionCapacity",
598 "HasTimeVaryingProductionCapacity"
601 definition.ReplacePartiallySupportedFeatureCodes(
606 "HasSupplierCapacityConstraints",
607 "HasSupplierLeadTimes",
609 "HasTransportCapacityConstraints",
610 "HasTransportLeadTimes",
611 "HasWarehouseCapacityConstraints",
612 "HasAdditionalCapacity"
615 definition.ReplaceUnsupportedFeatureCodes(
620 "HasFinancialConstraints",
621 "HasMultipleObjectives"
625 "A complete algorithm normally requires a dual " +
626 "optimization procedure and, when a feasible " +
627 "solution is required, a primal recovery method.";
632 private static SolutionMethodDefinition
633 CreateFixAndOptimizeDefinition()
636 new SolutionMethodDefinition(
641 "Generic fix-and-optimize matheuristic",
652 "NeighborhoodSearch",
662 "Matheuristic that repeatedly fixes part " +
663 "of a mixed-integer solution and " +
664 "reoptimizes selected neighborhoods.",
669 SupportsAnyProblemFamily =
672 SupportsAnyProductStructure =
675 SupportsUnclassifiedProblems =
678 SupportsAmbiguousClassifications =
681 SupportsCompleteProblems =
684 SupportsRelaxations =
687 SupportsSubproblems =
690 CanProduceFeasibleSolution =
696 CanProvideLowerBound =
699 CanProvideUpperBound =
703 definition.ReplaceSupportedFeatureCodes(
704 GetBroadlySupportedFeatureCodes());
706 definition.ReplacePreferredProblemTypeCodes(
714 definition.ReplacePreferredFeatureCodes(
719 "HasProductionCapacityConstraints",
720 "HasSharedProductionCapacity"
724 "Compatibility assumes that a valid MILP " +
725 "formulation and an initial feasible solution or " +
726 "solution-construction procedure are available.";
731 private static IReadOnlyList<string>
732 GetClassicalSingleItemUnsupportedFeatureCodes()
736 "HasProductionCapacityConstraints",
737 "HasSharedProductionCapacity",
738 "HasTimeVaryingProductionCapacity",
739 "HasSafetyStockRequirements",
742 "HasProductionLeadTimes",
743 "HasMinimumLotSizes",
744 "HasMaximumLotSizes",
745 "HasLotSizeMultiples",
748 "HasAdditionalCapacity",
750 "HasSupplierCapacityConstraints",
751 "HasSupplierLeadTimes",
753 "HasTransportCapacityConstraints",
754 "HasTransportLeadTimes",
755 "HasWarehouseCapacityConstraints",
757 "HasFinancialConstraints",
758 "HasMultipleObjectives"
762 private static IReadOnlyList<string>
763 GetBroadlySupportedFeatureCodes()
768 "HasDeterministicDemand",
769 "HasTimeVaryingDemand",
770 "HasInitialInventory",
771 "HasSafetyStockRequirements",
775 "HasProductionCapacityConstraints",
776 "HasSharedProductionCapacity",
777 "HasTimeVaryingProductionCapacity",
781 "HasProductionLeadTimes",
782 "HasMinimumLotSizes",
783 "HasMaximumLotSizes",
784 "HasLotSizeMultiples",
785 "HasAdditionalCapacity",
787 "HasSupplierCapacityConstraints",
788 "HasSupplierLeadTimes",
790 "HasTransportCapacityConstraints",
791 "HasTransportLeadTimes",
792 "HasWarehouseCapacityConstraints",
794 "HasFinancialConstraints",
795 "HasMultipleObjectives",
804 private static SolutionMethodKind ResolveMethodKind(
805 SolutionMethodKind fallback,
806 params
string[] candidateNames)
808 ArgumentNullException.ThrowIfNull(
811 foreach (
string candidateName
in candidateNames)
813 if (
string.IsNullOrWhiteSpace(
820 candidateName.Trim(),
823 out SolutionMethodKind parsedValue) &&
825 typeof(SolutionMethodKind),