12 LotSizingInstance instance,
15 if(instance is
null || instance.PlanningHorizon<=0)
return false;
18 instance.SupplyChain.Plants
21 plant.WorkCenters.Select(
23 (PlantId:plant.Id,WorkCenter:workCenter)))
24 .Where(entry=>entry.WorkCenter.SchedulingProfile is not
null)
28 if(entries.Length!=1)
return false;
30 int plantId=entries[0].PlantId;
31 WorkCenter wc=entries[0].WorkCenter;
32 ProductionSchedulingProfile profile=wc.SchedulingProfile!;
34 if(profile.BucketMode!=SchedulingBucketMode.SmallBucket ||
35 profile.MaximumProducedItemCount is
null ||
36 profile.MaximumProducedItemCount.PlanningHorizon!=instance.PlanningHorizon ||
37 profile.HasSequenceDependentChangeoverTimes ||
38 profile.HasSequenceDependentChangeoverCosts ||
39 profile.Changeovers.Count>0)
return false;
42 profile.SetupCarryOverPolicy==SetupCarryOverPolicy.Forbidden)
return false;
44 if(!ValidCore(profile,instance.PlanningHorizon,kind))
return false;
46 var capacityConstraint=wc.CapacityConstraint;
47 if(capacityConstraint is
null ||
48 capacityConstraint.PlanningHorizon!=instance.PlanningHorizon)
return false;
50 if(wc.AdditionalCapacity is not
null &&
52 wc.AdditionalCapacity.PlanningHorizon!=instance.PlanningHorizon))
return false;
54 LotSizingProblemFeatures features;
57 features=LotSizingProblemFeatureExtractor.Extract(instance.SupplyChain);
59 catch(InvalidOperationException)
64 if(features.HasMinimumLotSizes ||
65 features.HasMaximumLotSizes ||
66 features.HasLotSizeMultiples ||
67 features.IsMultiSite)
return false;
72 (features.HasSetupTimes ||
73 features.HasStartUpTimes ||
74 features.HasAdditionalProductionCapacity))
return false;
76 var routings=instance.SupplyChain.ProductionRoutings.ToArray();
77 if(routings.Length==0 ||
78 routings.GroupBy(routing=>routing.ItemId).Any(group=>group.Count()!=1))
return false;
80 var itemIds=routings.Select(routing=>routing.ItemId).ToHashSet();
81 if(profile.HasInitialSetupState &&
82 !itemIds.Contains(profile.InitialSetupItemId))
return false;
84 if(profile.MaximumSetupCount is not
null &&
85 profile.MaximumSetupCount.PlanningHorizon!=instance.PlanningHorizon)
return false;
87 foreach(ProductionRouting routing
in routings)
89 if(routing.WorkCenters.Count!=1 ||
90 routing.WorkCenters[0].PlantId!=plantId ||
91 routing.WorkCenters[0].WorkCenterId!=wc.Id)
return false;
93 if(routing.GroupingConstraint is not
null &&
94 routing.GroupingConstraint.PlanningHorizon!=instance.PlanningHorizon)
return false;
97 instance.SupplyChain.ProductionCharacteristics
100 characteristic.ItemId==routing.ItemId &&
101 characteristic.WorkCenter.PlantId==plantId &&
102 characteristic.WorkCenter.WorkCenterId==wc.Id)
106 if(matches.Length!=1)
return false;
108 var characteristic=matches[0];
109 var unitCapacityConsumption=characteristic.UnitCapacityConsumption;
111 if(unitCapacityConsumption is
null ||
112 unitCapacityConsumption.PlanningHorizon!=instance.PlanningHorizon)
return false;
114 if(characteristic.SetupTime is not
null &&
115 characteristic.SetupTime.PlanningHorizon!=instance.PlanningHorizon)
return false;
117 if(characteristic.FixedSetupCost is not
null &&
118 characteristic.FixedSetupCost.PlanningHorizon!=instance.PlanningHorizon)
return false;
120 if(characteristic.StartUpTime is not
null &&
121 characteristic.StartUpTime.PlanningHorizon!=instance.PlanningHorizon)
return false;
123 if(characteristic.StartUpCost is not
null &&
124 characteristic.StartUpCost.PlanningHorizon!=instance.PlanningHorizon)
return false;
127 period<=instance.PlanningHorizon;
130 double cap=capacityConstraint[period];
131 double consumption=unitCapacityConsumption[period];
133 if(!
double.IsFinite(cap) ||
135 !
double.IsFinite(consumption) ||
136 consumption<=0)
return false;
138 double startUpTime=characteristic.StartUpTime?[period]??0.0;
139 double startUpCost=characteristic.StartUpCost?[period]??0.0;
141 if(!
double.IsFinite(startUpTime) ||
143 !
double.IsFinite(startUpCost) ||
144 startUpCost<0)
return false;