LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
ProductionFamilySetupLinkConstraintFamilyBuilder.cs
Go to the documentation of this file.
1using System;
2using System.Linq;
3using System.Threading;
4using System.Threading.Tasks;
5using LotSizingDataModel.Core.Relationships;
6using LotSizingDataModel.Instance;
10
12
15{
16 public override string ConstraintFamilyId =>
17 "productionFamilySetupLink";
18
19 public override bool IsEnabled(
20 LotSizingInstance instance,
22 {
23 ArgumentNullException.ThrowIfNull(instance);
24 ArgumentNullException.ThrowIfNull(options);
25
26 return instance.SupplyChain.ProductionSetupFamilies.Count > 0;
27 }
28
29 protected override ValueTask BuildConstraintsAsync(
30 LotSizingInstance instance,
33 CancellationToken cancellationToken)
34 {
35 foreach (ProductionSetupFamily family
36 in instance.SupplyChain.ProductionSetupFamilies)
37 {
38 foreach (int itemId in family.MemberItemIds.Distinct())
39 {
40 ProductionRouting[] routings =
41 instance.SupplyChain.ProductionRoutings
42 .Where(routing =>
43 routing.ItemId == itemId &&
44 routing.WorkCenters.Any(reference =>
45 reference.PlantId ==
46 family.WorkCenter.PlantId &&
47 reference.WorkCenterId ==
48 family.WorkCenter.WorkCenterId))
49 .ToArray();
50
51 foreach (ProductionRouting routing in routings)
52 {
53 for (int period = 1;
54 period <= instance.PlanningHorizon;
55 period++)
56 {
57 string itemSetupKey =
60 .Add(
62 routing.Id)
63 .Add(
65 period)
66 .Build();
67
68 string familySetupKey =
71 .AuxiliaryProductionFamilySetup)
72 .Add(
74 family.Id)
75 .Add(
77 period)
78 .Build();
79
80 var expression = new LinearExpressionBuilder();
81
82 expression.Add(
83 context.GetVariable(itemSetupKey),
84 1.0);
85
86 expression.Add(
87 context.GetVariable(familySetupKey),
88 -1.0);
89
91 context,
92 $"productionFamilySetupLink_f{family.Id}" +
93 $"_r{routing.Id}_t{period}",
94 expression.Build(),
95 MathematicalConstraintSense.LessThanOrEqual,
96 0.0,
97 description:
98 "Item setup implies shared family setup.");
99 }
100 }
101 }
102 }
103
104 return ValueTask.CompletedTask;
105 }
106}
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.
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.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
const string Setup
Identifies production setup decision variables.
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...
MathematicalConstraintSense
Identifies the relational sense of a mathematical constraint.