LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
DeliveryVariableFamilyBuilder.cs
Go to the documentation of this file.
1using System;
2using System.Threading;
3using System.Threading.Tasks;
4using LotSizingDataModel.Core.Relationships;
5using LotSizingDataModel.Instance;
8
10
11/// <summary>
12/// Builds delivered-quantity variables from configured
13/// distribution-center sourcing relationships.
14/// </summary>
15public sealed class DeliveryVariableFamilyBuilder :
17{
18 /// <summary>
19 /// Gets the delivery variable-family identifier.
20 /// </summary>
21 public override string FamilyId =>
23
24 /// <summary>
25 /// Determines whether delivery variables are required.
26 /// </summary>
27 public override bool IsEnabled(
28 LotSizingInstance instance,
30 {
31 ArgumentNullException.ThrowIfNull(
32 instance);
33
34 ArgumentNullException.ThrowIfNull(
35 options);
36
37 return
38 instance.SupplyChain
39 .DistributionCenterSourcings.Count > 0;
40 }
41
42 /// <summary>
43 /// Builds delivered-quantity variables.
44 /// </summary>
45 protected override ValueTask BuildFamilyAsync(
46 LotSizingInstance instance,
49 CancellationToken cancellationToken)
50 {
51 int planningHorizon =
52 instance.PlanningHorizon;
53
54 foreach (
55 DistributionCenterSourcing sourcing
56 in instance.SupplyChain.DistributionCenterSourcings)
57 {
58 cancellationToken.ThrowIfCancellationRequested();
59
60 for (
61 int period = 1;
62 period <= planningHorizon;
63 period++)
64 {
65 var keyBuilder =
68 .Add(
70 sourcing.DistributionCenterId)
71 .Add(
73 sourcing.ItemId);
74
76 keyBuilder,
77 sourcing.Warehouse);
78
79 string domainKey =
80 keyBuilder
81 .Add(
83 period)
84 .Build();
85
87 context,
88 $"D_c{sourcing.DistributionCenterId}" +
89 $"_i{sourcing.ItemId}_w" +
90 $"{sourcing.Warehouse.ReferenceId}_t{period}",
91 domainKey,
92 double.PositiveInfinity,
93 $"Delivered quantity to distribution center " +
94 $"{sourcing.DistributionCenterId} for item " +
95 $"{sourcing.ItemId} in period {period}.");
96 }
97 }
98
99 return ValueTask.CompletedTask;
100 }
101}
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.
Builds delivered-quantity variables from configured distribution-center sourcing relationships.
override string FamilyId
Gets the delivery variable-family identifier.
override ValueTask BuildFamilyAsync(LotSizingInstance instance, MathematicalModelBuildContext context, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
Builds delivered-quantity variables.
override bool IsEnabled(LotSizingInstance instance, StandardLotSizingFormulationOptions options)
Determines whether delivery variables are required.
Creates canonical domain-key fragments shared by standard formulation builders and provides warehouse...
static MathematicalDomainKeyBuilder AddWarehouse(MathematicalDomainKeyBuilder builder, WarehouseReference warehouse)
Adds a warehouse reference using the generic warehouse or plant segment.
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 MathematicalVariable AddNonNegativeContinuousVariable(MathematicalModelBuildContext context, string name, string domainKey, double upperBound=double.PositiveInfinity, string description="")
Creates and registers one continuous non-negative variable.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string Delivery
Identifies delivered-quantity decision variables.
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...
const string DistributionCenter
Distribution-center identifier segment.