3using System.Threading.Tasks;
4using LotSizingDataModel.Core.Relationships;
5using LotSizingDataModel.Instance;
49 "productionSetupGrouping";
73 LotSizingInstance instance,
76 ArgumentNullException.ThrowIfNull(
79 ArgumentNullException.ThrowIfNull(
82 bool hasGroupingConstraint =
86 ProductionRouting routing
87 in instance.SupplyChain.ProductionRoutings)
89 if (routing.GroupingConstraint is not
null)
91 hasGroupingConstraint =
98 if (hasGroupingConstraint &&
99 !options.IncludeProductionSetups)
101 throw new InvalidOperationException(
102 "Production grouping constraints require " +
103 "production setup variables. Enable " +
104 "IncludeProductionSetups before building the " +
105 "standard formulation.");
108 return hasGroupingConstraint;
130 LotSizingInstance instance,
133 CancellationToken cancellationToken)
135 int planningHorizon =
136 instance.PlanningHorizon;
139 ProductionRouting routing
140 in instance.SupplyChain.ProductionRoutings)
142 if (routing.GroupingConstraint is
null)
149 setupPeriod <= planningHorizon;
152 cancellationToken.ThrowIfCancellationRequested();
155 routing.GroupingConstraint[setupPeriod];
157 if (minimumSpacing <= 0)
159 throw new InvalidOperationException(
160 $
"Grouping constraint for routing " +
161 $
"{routing.Id}, period {setupPeriod}, " +
162 "must be strictly positive.");
165 if (minimumSpacing == 1)
176 int lastForbiddenPeriod =
184 int forbiddenPeriod = setupPeriod + 1;
185 forbiddenPeriod <= lastForbiddenPeriod;
188 cancellationToken.ThrowIfCancellationRequested();
205 $
"grouping_r{routing.Id}" +
207 $
"_k{forbiddenPeriod}",
212 $
"A setup in period {setupPeriod} " +
213 $
"for routing {routing.Id} forbids " +
214 $
"another setup before period " +
215 $
"{setupPeriod + minimumSpacing}.");
220 return ValueTask.CompletedTask;
Provides a fluent builder for linear expressions.
LinearExpressionBuilder Add(MathematicalVariable variable, double coefficient=1.0)
Adds a variable term to the expression.
Builds stable business-domain keys for mathematical variables and constraints.
string Build()
Builds the immutable domain-key text.
MathematicalDomainKeyBuilder Add(string name, string value)
Adds a text segment.
Provides the shared state required while constructing a solver-independent mathematical model.
MathematicalVariable GetVariable(string domainKey)
Gets a required mathematical variable from its business-domain key.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string Setup
Identifies production setup decision variables.
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...
const string Routing
Routing identifier segment.
const string Period
Period index segment.
Represents one decision variable in a mathematical optimization model.
MathematicalConstraintSense
Identifies the relational sense of a mathematical constraint.