Quintiq file version 2.0
|
#parent: #root
|
Method AddTermsForCapacityUsage (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
MPConstraint minconst,
|
MPConstraint maxconst,
|
const LibOpt_Scope scope,
|
const CapacityPlanningSuboptimizer subopt,
|
const UnitPeriod unitperiodforconstraint,
|
Real scalefactor_periodtaskqty_minconst,
|
Real scalefactor_periodtaskqty_maxconst,
|
Real scalefactor_tripnewsupply_minconst,
|
Real scalefactor_tripnewsupply_maxconst,
|
output Real bound
|
) const
|
{
|
Description: 'Add the capacity usage terms for this unit period.'
|
TextBody:
|
[*
|
// Capacity usage = Sum of PTQty * Process.QuantityToProcessFactor
|
// For time based, we need extra logic to convert to duration needed
|
operations := subopt.GetOperationsForUnitPeriod( scope, this );
|
traverse( operations, Elements, operation )
|
{
|
coeff := operation.GetCapacityUsagePerQuantity( unitperiodforconstraint );
|
var := program.PTQtyVariables().Get( operation, unitperiodforconstraint.Period_MP() );
|
|
// Term: coeff * PTQty variable
|
// UoM: [-] [Unit]
|
maxconst.NewTerm( coeff * scalefactor_periodtaskqty_maxconst, var );
|
minconst.NewTerm( coeff * scalefactor_periodtaskqty_minconst, var );
|
|
bound := bound + coeff * var.LowerBound();
|
}
|
|
traverse( this, PeriodTask_MP.astype( PeriodTaskLaneLeg ), ptll,
|
scope.Contains( ptll.Trip().TripInOptimizerRun() ) ) // Only if the trip is part of this optimizer run)
|
{
|
traverse( ptll, Trip.ProductInTrip, productintrip,
|
scope.Contains( productintrip.ProductInTripInOptimizerRun() ) ) // Only if the productintrip is part of this optimizer run
|
{
|
uomconversion := productintrip.UnitConversionFactor();
|
factor := ptll.DurationInTrip().DaysAsReal() * ptll.Process_MP().GetCapacityUsagePerQuantity( unitperiodforconstraint );
|
var := program.TripNewSupplyVariables().Get( productintrip );
|
|
// Term: uomconversion * factor * TripNewSupply variable
|
// UoM: [Output PISP to Unit] * [days] [Output PISP] //For transport the capacity is defined per day so the trip duration in days accounts for that
|
maxconst.NewTerm( uomconversion * factor * scalefactor_tripnewsupply_maxconst, var );
|
minconst.NewTerm( uomconversion * factor * scalefactor_tripnewsupply_minconst, var );
|
|
bound := bound + factor * var.LowerBound();
|
}
|
}
|
|
traverse( this, ChildOfUnitDimension, childunitperiod )
|
{
|
childunitperiod.AddTermsForCapacityUsage( program,
|
minconst,
|
maxconst,
|
scope,
|
subopt,
|
unitperiodforconstraint,
|
scalefactor_periodtaskqty_minconst,
|
scalefactor_periodtaskqty_maxconst,
|
scalefactor_tripnewsupply_minconst,
|
scalefactor_tripnewsupply_maxconst,
|
bound );
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|