LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
TransportAdditionalCapacityVariableFamilyBuilder.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;
10
12
13/// <summary>
14/// Builds item-specific additional transport-capacity variables.
15/// </summary>
18{
19 /// <summary>
20 /// Gets the item-specific transport additional-capacity
21 /// variable-family identifier.
22 /// </summary>
23 public override string FamilyId =>
25
26 /// <summary>
27 /// Determines whether item-specific additional transport
28 /// capacity variables are enabled.
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 options.IncludeAdditionalCapacity &&
40 instance.SupplyChain.TransportCharacteristics.Any(
41 characteristic =>
42 characteristic.AdditionalCapacity is not null);
43 }
44
45 /// <summary>
46 /// Builds item-specific additional-capacity variables.
47 /// </summary>
48 protected override ValueTask BuildFamilyAsync(
49 LotSizingInstance instance,
52 CancellationToken cancellationToken)
53 {
54 int planningHorizon =
55 instance.PlanningHorizon;
56
57 foreach (
58 TransportCharacteristic characteristic
59 in instance.SupplyChain.TransportCharacteristics)
60 {
61 if (characteristic.AdditionalCapacity is null)
62 {
63 continue;
64 }
65
66 TransportResource resource =
67 instance.SupplyChain.TransportResources
68 .FirstOrDefault(
69 candidate =>
70 candidate.Id ==
71 characteristic.TransportResourceId)
72 ?? throw new InvalidOperationException(
73 $"Transport resource " +
74 $"{characteristic.TransportResourceId} " +
75 "does not exist.");
76
77 foreach (
78 AssignedTransportLane lane
79 in instance.SupplyChain.GetTransportLanes(resource.Id))
80 {
81 for (
82 int period = 1;
83 period <= planningHorizon;
84 period++)
85 {
86 cancellationToken.ThrowIfCancellationRequested();
87
88 double upperBound =
89 characteristic.AdditionalCapacity[period];
90
92 upperBound,
93 options))
94 {
95 continue;
96 }
97
98 string domainKey =
99 CreateTransportKey(
101 .TransportAdditionalCapacity,
102 characteristic.ItemId,
103 resource,
104 lane)
105 .Add(
107 period)
108 .Build();
109
111 context,
112 $"OT_i{characteristic.ItemId}_r{resource.Id}" +
113 $"_l{lane.Id}_t{period}",
114 domainKey,
115 upperBound,
116 $"Additional transport capacity for item " +
117 $"{characteristic.ItemId}, resource " +
118 $"{resource.Id}, period {period}.");
119 }
120 }
121 }
122
123 return ValueTask.CompletedTask;
124 }
125
126
127 private static MathematicalDomainKeyBuilder CreateTransportKey(
128 string category,
129 int itemId,
130 TransportResource resource,
131 AssignedTransportLane lane)
132 {
133 var keyBuilder =
135 category)
136 .Add(
138 itemId)
139 .Add(
141 resource.Id);
142
144 keyBuilder,
145 lane.Origin);
146
148 keyBuilder,
149 lane.Destination);
150
151 return keyBuilder;
152 }
153
154}
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.
Configures the standard solver-independent mixed-integer lot-sizing formulation.
Provides common validation and variable-registration helpers for one variable family of the standard ...
static bool IsStructurallyZero(double upperBound, StandardLotSizingFormulationOptions options)
Determines whether a finite non-negative upper bound is structurally equal to zero according to the f...
static MathematicalVariable AddNonNegativeContinuousVariable(MathematicalModelBuildContext context, string name, string domainKey, double upperBound=double.PositiveInfinity, string description="")
Creates and registers one continuous non-negative variable.
override ValueTask BuildFamilyAsync(LotSizingInstance instance, MathematicalModelBuildContext context, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
Builds item-specific additional-capacity variables.
override bool IsEnabled(LotSizingInstance instance, StandardLotSizingFormulationOptions options)
Determines whether item-specific additional transport capacity variables are enabled.
override string FamilyId
Gets the item-specific transport additional-capacity variable-family identifier.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string TransportAdditionalCapacity
Identifies item-specific additional transport-capacity decision variables.
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...
const string TransportResource
Transport-resource identifier segment.