LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
GlspSchedulingApplicabilityService.cs
Go to the documentation of this file.
1using LotSizingDataModel.Core.DecisionModel.Objectives;
2using LotSizingDataModel.Core.DecisionModel.Scheduling;
3using LotSizingDataModel.Core.Relationships;
4using LotSizingDataModel.Instance;
5using LotSizingDataModel.Instance.Classification;
6
8
10{
11 public bool CanBuild(LotSizingInstance instance)
12 {
13 if(instance is null||instance.PlanningHorizon<=0) return false;
14
16 instance,
17 out int plantId,
18 out var wc,
19 out ProductionSchedulingProfile? profile) ||
20 wc is null ||
21 profile is null) return false;
22
23 if(profile.BucketMode!=SchedulingBucketMode.MacroMicro ||
24 !profile.HasExplicitMicroPeriodGrid ||
25 profile.MicroPeriodLengthMode!=MicroPeriodLengthMode.Variable ||
26 profile.MicroPeriodAssignmentMode!=MicroPeriodAssignmentMode.SingleItem ||
27 profile.MicroPeriodCount is null ||
28 profile.MicroPeriodCount.PlanningHorizon!=instance.PlanningHorizon) return false;
29
30 for(int period=1;period<=instance.PlanningHorizon;period++)
31 {
32 if(profile.MicroPeriodCount.GetCount(period)<=0) return false;
33 }
34
35 if(profile.MaximumSetupCount is not null &&
36 profile.MaximumSetupCount.PlanningHorizon!=instance.PlanningHorizon) return false;
37
38 if(profile.MaximumProducedItemCount is not null &&
39 profile.MaximumProducedItemCount.PlanningHorizon!=instance.PlanningHorizon) return false;
40
41 var capacityConstraint=wc.CapacityConstraint;
42 if(capacityConstraint is null ||
43 capacityConstraint.PlanningHorizon!=instance.PlanningHorizon) return false;
44
45 if(wc.AdditionalCapacity is not null &&
46 wc.AdditionalCapacity.PlanningHorizon!=instance.PlanningHorizon) return false;
47
48 LotSizingProblemFeatures features;
49 try
50 {
51 features=LotSizingProblemFeatureExtractor.Extract(instance.SupplyChain);
52 }
53 catch(InvalidOperationException)
54 {
55 return false;
56 }
57
58 if(features.HasMinimumLotSizes ||
59 features.HasMaximumLotSizes ||
60 features.HasLotSizeMultiples ||
61 features.IsMultiSite) return false;
62
63 if(instance.SupplyChain.PeriodicOperatingExpenditureBudget is not null) return false;
64
65 if(instance.SupplyChain.ObjectivePolicy is not null &&
66 (instance.SupplyChain.ObjectivePolicy.AggregationMode!=ObjectiveAggregationMode.Single ||
67 instance.SupplyChain.ObjectivePolicy.PrimaryObjectiveKind!=OptimizationObjectiveKind.Economic)) return false;
68
69 var routings=GlspSchedulingData.GetRoutings(instance,plantId,wc.Id);
70 if(routings.Count<2 ||
71 routings.GroupBy(routing=>routing.ItemId).Any(group=>group.Count()!=1)) return false;
72
73 var itemIds=routings.Select(routing=>routing.ItemId).ToHashSet();
74
75 if(profile.HasInitialSetupState &&
76 !itemIds.Contains(profile.InitialSetupItemId)) return false;
77
78 foreach(ProductionRouting routing in routings)
79 {
80 if(routing.WorkCenters.Count!=1 ||
81 routing.WorkCenters[0].PlantId!=plantId ||
82 routing.WorkCenters[0].WorkCenterId!=wc.Id) return false;
83
84 if(routing.GroupingConstraint is not null &&
85 routing.GroupingConstraint.PlanningHorizon!=instance.PlanningHorizon) return false;
86
88 instance,
89 routing,
90 plantId,
91 wc.Id,
92 out ProductionCharacteristic? characteristic) ||
93 characteristic is null) return false;
94
95 var unitCapacityConsumption=characteristic.UnitCapacityConsumption;
96 if(unitCapacityConsumption is null ||
97 unitCapacityConsumption.PlanningHorizon!=instance.PlanningHorizon) return false;
98
99 if(characteristic.SetupTime is not null &&
100 characteristic.SetupTime.PlanningHorizon!=instance.PlanningHorizon) return false;
101
102 if(characteristic.FixedSetupCost is not null &&
103 characteristic.FixedSetupCost.PlanningHorizon!=instance.PlanningHorizon) return false;
104
105 if(characteristic.StartUpTime is not null &&
106 characteristic.StartUpTime.PlanningHorizon!=instance.PlanningHorizon) return false;
107
108 if(characteristic.StartUpCost is not null &&
109 characteristic.StartUpCost.PlanningHorizon!=instance.PlanningHorizon) return false;
110
111 for(int period=1;period<=instance.PlanningHorizon;period++)
112 {
113 double cap=capacityConstraint[period];
114 double consumption=unitCapacityConsumption[period];
115 double startUpTime=characteristic.StartUpTime?[period]??0.0;
116 double startUpCost=characteristic.StartUpCost?[period]??0.0;
117
118 if(!double.IsFinite(cap) ||
119 cap<0 ||
120 !double.IsFinite(consumption) ||
121 consumption<=0 ||
122 !double.IsFinite(startUpTime) ||
123 startUpTime<0 ||
124 !double.IsFinite(startUpCost) ||
125 startUpCost<0) return false;
126 }
127 }
128
129 if(profile.Changeovers.Any(
130 changeover =>
131 changeover.FromItemId==changeover.ToItemId ||
132 !itemIds.Contains(changeover.FromItemId) ||
133 !itemIds.Contains(changeover.ToItemId) ||
134 (changeover.ChangeoverTime is not null &&
135 changeover.ChangeoverTime.PlanningHorizon!=instance.PlanningHorizon) ||
136 (changeover.ChangeoverCost is not null &&
137 changeover.ChangeoverCost.PlanningHorizon!=instance.PlanningHorizon))) return false;
138
139 if(profile.Changeovers
140 .GroupBy(changeover=>(changeover.FromItemId,changeover.ToItemId))
141 .Any(group=>group.Count()>1)) return false;
142
143 return true;
144 }
145}
static bool TryGetCharacteristic(LotSizingInstance instance, ProductionRouting routing, int plantId, int workCenterId, out ProductionCharacteristic? characteristic)
static IReadOnlyList< ProductionRouting > GetRoutings(LotSizingInstance instance, int plantId, int workCenterId)
static bool TryGetSchedulingWorkCenter(LotSizingInstance instance, out int plantId, out WorkCenter? workCenter, out ProductionSchedulingProfile? profile)