LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
WorkCenterAdditionalCapacityCostObjectiveTermBuilder.cs
Go to the documentation of this file.
1using System;
2using System.Threading;
3using System.Threading.Tasks;
4using LotSizingDataModel.Instance;
7
9
10/// <summary>
11/// Adds global additional work-center capacity costs.
12/// </summary>
15{
16 /// <summary>
17 /// Gets the objective-term family identifier.
18 /// </summary>
19 public override string TermFamilyId =>
20 "workCenterAdditionalCapacityCost";
21
22 /// <summary>
23 /// Determines whether these costs are enabled.
24 /// </summary>
25 public override bool IsEnabled(
26 LotSizingInstance instance,
28 {
29 ArgumentNullException.ThrowIfNull(instance);
30 ArgumentNullException.ThrowIfNull(options);
31
32 return options.IncludeAdditionalCapacity;
33 }
34
35 /// <summary>
36 /// Builds additional work-center capacity cost terms.
37 /// </summary>
38 protected override ValueTask BuildTermsAsync(
39 LotSizingInstance instance,
41 LinearExpressionBuilder expressionBuilder,
43 CancellationToken cancellationToken)
44 {
45 foreach (
46 var entry
48 .EnumerateWorkCenters(
49 instance.SupplyChain))
50 {
51 if (entry.WorkCenter.AdditionalCapacity is null)
52 {
53 continue;
54 }
55
56 for (
57 int period = 1;
58 period <= instance.PlanningHorizon;
59 period++)
60 {
61 cancellationToken.ThrowIfCancellationRequested();
62
63 double upperBound =
64 entry.WorkCenter.AdditionalCapacity[period];
65
66 if (options.RemoveStructurallyZeroVariables &&
67 double.IsFinite(upperBound) &&
68 upperBound <= options.StructuralZeroTolerance)
69 {
70 continue;
71 }
72
73 string domainKey =
76 .WorkCenterAdditionalCapacity)
77 .Add(
79 entry.PlantId)
80 .Add(
82 entry.WorkCenter.Id)
83 .Add(
85 period)
86 .Build();
87
89 context,
90 expressionBuilder,
91 domainKey,
92 entry.WorkCenter.AdditionalCapacityCost?[period] ??
93 0.0);
94 }
95 }
96
97 return ValueTask.CompletedTask;
98 }
99}
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.
Enumerates physical resources together with the canonical references required by the mathematical for...
Configures the standard solver-independent mixed-integer lot-sizing formulation.
bool IncludeAdditionalCapacity
Gets or sets whether additional capacities are included.
Provides common validation and helper methods for one objective-term family of the standard lot-sizin...
static void AddCostTerm(MathematicalModelBuildContext context, LinearExpressionBuilder expressionBuilder, string domainKey, double coefficient)
Adds one variable cost term to the shared objective.
override ValueTask BuildTermsAsync(LotSizingInstance instance, MathematicalModelBuildContext context, LinearExpressionBuilder expressionBuilder, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
Builds additional work-center capacity cost terms.
override bool IsEnabled(LotSizingInstance instance, StandardLotSizingFormulationOptions options)
Determines whether these costs are enabled.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...