LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
TransportResourceCapacityConstraintFamilyBuilder.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 global transport-resource capacity constraints.
16/// </summary>
19{
20 /// <summary>
21 /// Gets the unique constraint-family identifier.
22 /// </summary>
23 public override string ConstraintFamilyId =>
24 "transportResourceCapacity";
25
26 /// <summary>
27 /// Determines whether at least one transport resource is
28 /// globally capacitated.
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.TransportResources.Any(
40 resource =>
41 resource.CapacityConstraint is not null);
42 }
43
44 /// <summary>
45 /// Builds global transport-resource capacity constraints.
46 /// </summary>
47 protected override ValueTask BuildConstraintsAsync(
48 LotSizingInstance instance,
51 CancellationToken cancellationToken)
52 {
53 foreach (TransportResource resource
54 in instance.SupplyChain.TransportResources)
55 {
56 if (resource.CapacityConstraint is null)
57 {
58 continue;
59 }
60
61 TransportCharacteristic[] characteristics =
62 instance.SupplyChain.TransportCharacteristics
63 .Where(
64 characteristic =>
65 characteristic.TransportResourceId ==
66 resource.Id)
67 .ToArray();
68
69 for (int period = 1;
70 period <= instance.PlanningHorizon;
71 period++)
72 {
73 cancellationToken.ThrowIfCancellationRequested();
74
75 var expression =
77
78 foreach (TransportCharacteristic characteristic
79 in characteristics)
80 {
81 foreach (AssignedTransportLane lane in instance.SupplyChain.GetTransportLanes(resource.Id))
82 {
83 string transportKey =
84 CreateKey(
86 characteristic.ItemId,
87 resource.Id,
88 lane,
89 period);
90
91 expression.Add(
92 context.GetVariable(transportKey),
93 characteristic.UnitCapacityConsumption?[period] ??
94 1.0);
95
96 double setupTime =
97 characteristic.SetupTime?[period] ??
98 0.0;
99
100 if (setupTime > 0.0)
101 {
102 string setupKey =
103 CreateKey(
105 .TransportSetup,
106 characteristic.ItemId,
107 resource.Id,
108 lane,
109 period);
110
111 if (context.VariableRegistry.TryGet(
112 setupKey,
113 out MathematicalVariable? setupVariable) &&
114 setupVariable is not null)
115 {
116 expression.Add(
117 setupVariable,
118 setupTime);
119 }
120 }
121 }
122 }
123
124 string additionalKey =
127 .TransportResourceAdditionalCapacity)
128 .Add(
130 resource.Id)
131 .Add(
133 period)
134 .Build();
135
136 if (context.VariableRegistry.TryGet(
137 additionalKey,
138 out MathematicalVariable? additionalVariable) &&
139 additionalVariable is not null)
140 {
141 expression.Subtract(
142 additionalVariable);
143 }
144
146 context,
147 $"transportResourceCapacity_r{resource.Id}" +
148 $"_t{period}",
149 expression.Build(),
150 MathematicalConstraintSense.LessThanOrEqual,
151 resource.CapacityConstraint[period],
152 description:
153 "Global transport-resource 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 at least one transport resource is globally capacitated.
override ValueTask BuildConstraintsAsync(LotSizingInstance instance, MathematicalModelBuildContext context, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
Builds global transport-resource capacity constraints.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string Transport
Identifies transported-quantity 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.