LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
SmallBucketSchedulingCapacityConstraintFamilyBuilder.cs
Go to the documentation of this file.
1using LotSizingDataModel.Core.Relationships;
2using LotSizingDataModel.Instance;
6
8
9/// <summary>
10/// Builds CSLP/PLSP capacity with additive production, setup-start and
11/// start-up time contributions.
12/// </summary>
15{
16 public override string ConstraintFamilyId =>
17 "smallBucketSchedulingCapacity";
18
19 protected override ValueTask BuildConstraintsAsync(
20 LotSizingInstance instance,
23 CancellationToken cancellationToken)
24 {
25 var entry =
26 instance.SupplyChain.Plants
27 .SelectMany(
28 plant =>
29 plant.WorkCenters.Select(
30 workCenter =>
31 (PlantId:plant.Id,WorkCenter:workCenter)))
32 .Single(
33 candidate =>
34 candidate.WorkCenter.SchedulingProfile is not null);
35
36 var profile =
37 entry.WorkCenter.SchedulingProfile!;
38
39 for (int period=1;
40 period<=instance.PlanningHorizon;
41 period++)
42 {
43 var expression =
45
46 foreach (ProductionRouting routing
47 in instance.SupplyChain.ProductionRoutings)
48 {
49 var reference =
50 routing.WorkCenters.Single();
51
52 ProductionCharacteristic characteristic =
53 instance.SupplyChain.ProductionCharacteristics.Single(
54 candidate =>
55 candidate.ItemId==routing.ItemId &&
56 candidate.WorkCenter.PlantId==reference.PlantId &&
57 candidate.WorkCenter.WorkCenterId==reference.WorkCenterId);
58
59 string productionKey =
64 .Build();
65
66 expression.Add(
67 GetVariable(context,productionKey),
68 characteristic.UnitCapacityConsumption![period]);
69
70 double setupTime =
71 characteristic.SetupTime?[period] ?? 0.0;
72
73 if(setupTime>0.0)
74 {
75 expression.Add(
77 context,
79 profile,
80 routing,
81 period)),
82 setupTime);
83 }
84
85 double startUpTime =
86 characteristic.StartUpTime?[period] ?? 0.0;
87
88 if(startUpTime>0.0)
89 {
90 expression.Add(
92 context,
94 profile,
95 routing,
96 period)),
97 startUpTime);
98 }
99 }
100
101 string additionalKey =
105 .Add(MathematicalDomainKeySegment.WorkCenter,entry.WorkCenter.Id)
107 .Build();
108
109 if(context.VariableRegistry.TryGet(
110 additionalKey,
111 out MathematicalVariable? additional) &&
112 additional is not null)
113 {
114 expression.Subtract(additional);
115 }
116
118 context,
119 $"smallBucketCapacity_p{entry.PlantId}_w{entry.WorkCenter.Id}_t{period}",
120 expression.Build(),
121 MathematicalConstraintSense.LessThanOrEqual,
122 entry.WorkCenter.CapacityConstraint![period]);
123 }
124
125 return ValueTask.CompletedTask;
126 }
127}
Provides a fluent builder for linear expressions.
Builds stable business-domain keys for mathematical variables and constraints.
MathematicalDomainKeyBuilder Add(string name, string value)
Adds a text segment.
Provides the shared state required while constructing a solver-independent mathematical model.
MathematicalModel Build(bool clone=true)
Builds and validates the mathematical model.
MathematicalVariableRegistry VariableRegistry
Gets the registry that maps business-domain keys to mathematical variables.
bool TryGet(string domainKey, out MathematicalVariable? variable)
Attempts to get the variable registered for a domain key.
Builds canonical mathematical domain keys for production start-up events.
static string CreateSmallBucketKey(ProductionSchedulingProfile profile, ProductionRouting routing, int period)
Builds CSLP/PLSP capacity with additive production, setup-start and start-up time contributions.
override ValueTask BuildConstraintsAsync(LotSizingInstance instance, MathematicalModelBuildContext context, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
static string CreateSetupStartKey(ProductionSchedulingProfile profile, ProductionRouting routing, int period)
Provides common validation and helper methods for one constraint family of the standard lot-sizing fo...
static MathematicalVariable GetVariable(MathematicalModelBuildContext context, string domainKey)
Resolves a required variable from its canonical domain key.
static void AddConstraint(MathematicalModelBuildContext context, string name, LinearExpression expression, MathematicalConstraintSense sense, double rightHandSide, string domainKey="", string description="")
Adds one linear constraint to the mathematical model.
Configures the standard solver-independent mixed-integer lot-sizing formulation.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string WorkCenterAdditionalCapacity
Identifies additional work-center-capacity decision variables.
const string Production
Identifies production-quantity decision variables.
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...
Represents one decision variable in a mathematical optimization model.
MathematicalConstraintSense
Identifies the relational sense of a mathematical constraint.