Quintiq file version 2.0
|
#parent: #root
|
Method InitConstraintsGoalsForServiceLevels (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
const RunContextForCapacityPlanning runcontext,
|
const LibOpt_Scope scope
|
) const
|
{
|
Description: 'Init constraints goals for service level'
|
TextBody:
|
[*
|
collectvaluesmodel := runcontext.IsMetaIteration();
|
|
totalfulfillmentvariablesvalue := 0.0;
|
scalefactor_ftvar := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalFulfillmentTargetVariable ) );
|
|
// The service level constraint is defined for the deterministic goal (Fulfillment target)
|
// slconst constraint UoM: This is equal value for each service level now.
|
sldetconst := program.TotalFulfillmentTargetConstraints().New();
|
sldetconst.Sense( '=' );
|
sldetconst.RHSValue( this.ScaleConstraintRHS( typeofexpression( sldetconst ), 0.0 ) );
|
// Term UoM: Monetary
|
sldetconst.NewTerm( 1.0 * this.ScaleConstraintTerm( typeof( MPTotalFulfillmentTargetVariable ), typeofexpression( sldetconst) )
|
, program.TotalFulfillmentTargetVariables().Get() );
|
|
scalefactor_servicelevelqty_slconst_det := this.ScaleConstraintTerm( typeof( MPFulfillmentTargetVariable ), typeofexpression( sldetconst ) );
|
|
// The service level constraint is also defined for the stoichastic goal (Inventory optimization)
|
// slconst constraint UoM: This is equal value for each service level now.
|
slstoconst := program.TotalServiceLevelConstraints().New();
|
slstoconst.Sense( '=' );
|
slstoconst.RHSValue( this.ScaleConstraintRHS( typeofexpression( slstoconst ), 0.0 ) );
|
// Term UoM: Monetary
|
slstoconst.NewTerm( 1.0 * this.ScaleConstraintTerm( typeof( MPTotalServiceLevelVariable ), typeofexpression( slstoconst ) )
|
, program.TotalServiceLevelVariables().Get() );
|
|
scalefactor_servicelevelqty_slconst_sto := this.ScaleConstraintTerm( typeof( MPServiceLevelQtyVariable ), typeofexpression( slstoconst ) );
|
|
metaoptimizer_isdefined := ( runcontext.IsMetaIteration()
|
and ( this.MacroPlan().OptimizerMetaEIS().ServiceLevelWeight() > 0
|
or this.MacroPlan().OptimizerMetaEIS().FulfillmentTargetWeight() > 0 ) );
|
|
if ( not runcontext.IsMetaIteration() or metaoptimizer_isdefined )
|
{
|
traverse( this, MacroPlan.AllServiceLevelBase, sl, sl.GetIsInOptimizerRun( scope ) )
|
{
|
sl_optimizer_used := ifexpr( sl.IsUsedForPlanningFulfillmentSystem(),
|
program.FulfillmentTargetFromSDQtyConstraints().Get( sl ).Enabled(),
|
program.ServiceLevelFromSDQtyConstraints().Get( sl ).Enabled() );
|
|
if ( sl_optimizer_used )
|
{
|
// If this is a fulfillment goal related service level then add the related constraints
|
if( sl.IsUsedForPlanningFulfillmentSystem() )
|
{
|
// Term: -1 * ServiceLevelQty variable
|
// UoM: [Default] * [Default]
|
sldetconst.NewTerm( -scalefactor_servicelevelqty_slconst_det, program.FulfillmentTargetVariables().Get( sl ) );
|
if ( collectvaluesmodel )
|
{
|
totalfulfillmentvariablesvalue := totalfulfillmentvariablesvalue +
|
minvalue( sl.TotalFulfilledQuantity(), sl.TotalDemandQuantity() * sl.TargetPercentage() / 100 ) * scalefactor_servicelevelqty_slconst_det / scalefactor_ftvar;
|
}
|
}
|
// Else if this is an inventory optimization related service level, add the related constraints
|
else if( sl.IsUsedForSafetyStockCalculation() )
|
{
|
// Term: -1 * ServiceLevelQty variable
|
// UoM: [Default] * [Default]
|
slstoconst.NewTerm( -scalefactor_servicelevelqty_slconst_sto, program.ServiceLevelQtyVariables().Get( sl ) );
|
}
|
}
|
}
|
}
|
|
// workaround because cannot write to attribute
|
this.StoreValueInProgram( program, 'collect_values_model_MPTotalFulfillmentTargetVariable', totalfulfillmentvariablesvalue );
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|