LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
TransportSpecificCapacityConstraintFamilyBuilder.cs
Go to the documentation of this file.
1using System;
2using System.Linq;
3using System.Threading;
4using System.Threading.Tasks;
5using LotSizingDataModel.Core.PhysicalModel;
6using LotSizingDataModel.Core.Relationships;
7using LotSizingDataModel.Instance;
11
13
14/// <summary>
15/// Builds item-specific transport capacity constraints.
16/// </summary>
19{
20 /// <summary>
21 /// Gets the unique constraint-family identifier.
22 /// </summary>
23 public override string ConstraintFamilyId =>
24 "transportSpecificCapacity";
25
26 /// <summary>
27 /// Determines whether item-specific transport capacities
28 /// exist.
29 /// </summary>
30 public override bool IsEnabled(
31 LotSizingInstance instance,
33 {
34 ArgumentNullException.ThrowIfNull(instance);
35 ArgumentNullException.ThrowIfNull(options);
36
37 return
38 options.IncludeTransport &&
39 instance.SupplyChain.TransportCharacteristics.Any(
40 characteristic =>
41 characteristic.CapacityConstraint is not null);
42 }
43
44 /// <summary>
45 /// Builds item-specific transport capacity constraints.
46 /// </summary>
47 protected override ValueTask BuildConstraintsAsync(
48 LotSizingInstance instance,
51 CancellationToken cancellationToken)
52 {
53 foreach (TransportCharacteristic characteristic
54 in instance.SupplyChain.TransportCharacteristics)
55 {
56 if (characteristic.CapacityConstraint is null)
57 {
58 continue;
59 }
60
61 TransportResource resource =
62 instance.SupplyChain.TransportResources
63 .First(
64 candidate =>
65 candidate.Id ==
66 characteristic.TransportResourceId);
67
68 for (int period = 1;
69 period <= instance.PlanningHorizon;
70 period++)
71 {
72 cancellationToken.ThrowIfCancellationRequested();
73
74 var expression =
76
77 var additionalAllocation = new LinearExpressionBuilder();
78 foreach (AssignedTransportLane lane in instance.SupplyChain.GetTransportLanes(resource.Id))
79 {
80 string transportKey =
81 CreateKey(
83 characteristic.ItemId,
84 resource.Id,
85 lane,
86 period);
87
88 expression.Add(
89 context.GetVariable(transportKey),
90 characteristic.UnitCapacityConsumption?[period] ??
91 1.0);
92
93 double setupTime =
94 characteristic.SetupTime?[period] ??
95 0.0;
96
97 if (setupTime > 0.0)
98 {
99 string setupKey =
100 CreateKey(
102 characteristic.ItemId,
103 resource.Id,
104 lane,
105 period);
106
107 if (context.VariableRegistry.TryGet(
108 setupKey,
109 out MathematicalVariable? setupVariable) &&
110 setupVariable is not null)
111 {
112 expression.Add(
113 setupVariable,
114 setupTime);
115 }
116 }
117
118 string additionalKey =
119 CreateKey(
121 .TransportAdditionalCapacity,
122 characteristic.ItemId,
123 resource.Id,
124 lane,
125 period);
126
127 if (context.VariableRegistry.TryGet(
128 additionalKey,
129 out MathematicalVariable? additionalVariable) &&
130 additionalVariable is not null)
131 {
132 expression.Subtract(
133 additionalVariable);
134 additionalAllocation.Add(additionalVariable);
135 }
136 }
137
138 if (characteristic.AdditionalCapacity is not null)
139 {
140 AddConstraint(context, $"transportAdditionalCapacityBudget_i{characteristic.ItemId}_r{resource.Id}_t{period}",
141 additionalAllocation.Build(), MathematicalConstraintSense.LessThanOrEqual,
142 characteristic.AdditionalCapacity[period], description: "Shared item-resource additional capacity across all assignments.");
143 }
144
146 context,
147 $"transportSpecificCapacity_i" +
148 $"{characteristic.ItemId}_r{resource.Id}_t{period}",
149 expression.Build(),
150 MathematicalConstraintSense.LessThanOrEqual,
151 characteristic.CapacityConstraint[period],
152 description:
153 "Item-specific transport capacity " +
154 "constraint.");
155 }
156 }
157
158 return ValueTask.CompletedTask;
159 }
160
161 private static string CreateKey(
162 string category,
163 int itemId,
164 int resourceId,
165 AssignedTransportLane lane,
166 int period)
167 {
168 var keyBuilder =
169 new MathematicalDomainKeyBuilder(category)
170 .Add(
172 itemId)
173 .Add(
175 resourceId);
176
178 keyBuilder,
179 lane.Origin);
180
182 keyBuilder,
183 lane.Destination);
184
185 return keyBuilder
186 .Add(
188 period)
189 .Build();
190 }
191}
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.
Creates canonical domain-key fragments shared by standard formulation builders and provides warehouse...
static MathematicalDomainKeyBuilder AddDestinationWarehouse(MathematicalDomainKeyBuilder builder, WarehouseReference warehouse)
Adds a destination warehouse reference.
static MathematicalDomainKeyBuilder AddOriginWarehouse(MathematicalDomainKeyBuilder builder, WarehouseReference warehouse)
Adds an origin warehouse reference.
Provides common validation and helper methods for one constraint family of the standard lot-sizing fo...
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.
override bool IsEnabled(LotSizingInstance instance, StandardLotSizingFormulationOptions options)
Determines whether item-specific transport capacities exist.
override ValueTask BuildConstraintsAsync(LotSizingInstance instance, MathematicalModelBuildContext context, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
Builds item-specific transport capacity constraints.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string Transport
Identifies transported-quantity decision variables.
const string TransportSetup
Identifies transport setup decision variables.
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...
const string TransportResource
Transport-resource identifier segment.
Represents one decision variable in a mathematical optimization model.
MathematicalConstraintSense
Identifies the relational sense of a mathematical constraint.