LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
GlspGroupingConstraintFamilyBuilder.cs
Go to the documentation of this file.
1using LotSizingDataModel.Core.Relationships;
2using LotSizingDataModel.Instance;
5using LotSizingDataModel.Core.DecisionModel.Scheduling;
8{
9 public override string ConstraintFamilyId=>"glspSetupGrouping";
10 public override bool IsEnabled(LotSizingInstance instance,StandardLotSizingFormulationOptions options){ArgumentNullException.ThrowIfNull(instance);ArgumentNullException.ThrowIfNull(options);return instance.SupplyChain.ProductionRoutings.Any(r=>r.GroupingConstraint is not null);}
11 protected override ValueTask BuildConstraintsAsync(LotSizingInstance instance,MathematicalModelBuildContext context,StandardLotSizingFormulationOptions options,CancellationToken cancellationToken)
12 {
13 var (plantId,wc,profile)=GlspSchedulingData.GetSchedulingWorkCenter(instance);var routings=GlspSchedulingData.GetRoutings(instance,plantId,wc.Id);var ordered=profile.EnumerateMicroPeriods().ToArray();
14 foreach(var r in routings){if(r.GroupingConstraint is null)continue;for(int t=1;t<=instance.PlanningHorizon;t++){int g=r.GroupingConstraint.GetGroupingPeriodCount(t);int last=Math.Min(instance.PlanningHorizon,t+g-1);for(int k=t+1;k<=last;k++){var first=ordered.Select((m,i)=>(m,i)).Where(x=>x.m.MacroPeriod==t).ToArray();var later=ordered.Select((m,i)=>(m,i)).Where(x=>x.m.MacroPeriod==k).ToArray();foreach(var a in first)foreach(var b in later)AddConstraint(context,$"glspGrouping_r{r.Id}_t{t}_s{a.m.MicroPeriodIndex}_k{k}_v{b.m.MicroPeriodIndex}",new LinearExpressionBuilder().Add(Start(context,profile,ordered,a.i,r,plantId,wc.Id)).Add(Start(context,profile,ordered,b.i,r,plantId,wc.Id)).Build(),MathematicalConstraintSense.LessThanOrEqual,1.0);}}}
15 return ValueTask.CompletedTask;
16 }
17 private static MathematicalVariable Start(MathematicalModelBuildContext context,ProductionSchedulingProfile profile,ProductionMicroPeriodReference[] ordered,int i,ProductionRouting r,int plantId,int wcId){int from=GlspSequenceSemantics.GetFixedPredecessorItemId(profile,i);bool reset=i>0&&GlspSequenceSemantics.IsResetBoundary(profile,ordered[i-1],ordered[i]);return context.GetVariable(GlspFormulationVariableKeyFactory.CreateMicroSetupStartKey(plantId,wcId,r.Id,r.ItemId,ordered[i],from,reset));}
18}
Provides a fluent builder for linear expressions.
LinearExpressionBuilder Add(MathematicalVariable variable, double coefficient=1.0)
Adds a variable term to the expression.
LinearExpression Build(bool clone=true)
Builds and validates the linear expression.
Provides the shared state required while constructing a solver-independent mathematical model.
MathematicalVariable GetVariable(string domainKey)
Gets a required mathematical variable from its business-domain key.
static string CreateMicroSetupStartKey(int plantId, int workCenterId, int routingId, int itemId, ProductionMicroPeriodReference microPeriod, int fixedPredecessorItemId, bool resetBoundary)
override bool IsEnabled(LotSizingInstance instance, StandardLotSizingFormulationOptions options)
Determines whether this constraint family is enabled.
override string ConstraintFamilyId
Gets the unique identifier of the constraint family.
override ValueTask BuildConstraintsAsync(LotSizingInstance instance, MathematicalModelBuildContext context, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
static int WorkCenter ProductionSchedulingProfile Profile GetSchedulingWorkCenter(LotSizingInstance instance)
static IReadOnlyList< ProductionRouting > GetRoutings(LotSizingInstance instance, int plantId, int workCenterId)
static bool IsResetBoundary(ProductionSchedulingProfile profile, ProductionMicroPeriodReference previous, ProductionMicroPeriodReference current)
static int GetFixedPredecessorItemId(ProductionSchedulingProfile profile, int index)
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.
Represents one decision variable in a mathematical optimization model.
MathematicalConstraintSense
Identifies the relational sense of a mathematical constraint.