Quintiq file version 2.0
|
#parent: #root
|
Method InitConstraintsForShiftPatternTotalChanges (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
const LibOpt_Scope scope,
|
const Unit unit
|
) const
|
{
|
Description: 'Represents the number of times a shift pattern is changed on a unit.'
|
TextBody:
|
[*
|
constname := typeof( MPTotalShiftPatternChangesConstraint );
|
|
scalefactor_nrshiftchanges_const := this.ScaleConstraintTerm( typeof( MPNrShiftPatternChangesVariable ), constname );
|
scalefactor_spisfirst_const := this.ScaleConstraintTerm( typeof( MPShiftPatternIsFirstVariable ), constname );
|
|
// Constraint: total number of shift pattern changes
|
totalspchangesconstr := program.TotalShiftPatternChangesConstraints().New( unit );
|
totalspchangesconstr.Sense( "=" );
|
totalspchangesconstr.RHSValue( 0.0 );
|
|
totalspchangesconstr.NewTerm( 1.0 * scalefactor_nrshiftchanges_const, program.NrShiftPatternChangesVariables().Get( unit ) );
|
|
// Traverse leaf units (of capacity type Time)
|
traverse( unit.GetUnitForShiftOptimization(), Elements, childunit )
|
{
|
traverse( childunit, UnitShiftPatternAllowed.ShiftPattern, sp )
|
{
|
traverse( childunit, UnitPeriod.astype(UnitPeriodTime), up, up.IsInScopeForShiftOptimization( scope ) )
|
{
|
totalspchangesconstr.NewTerm( -1.0 * scalefactor_spisfirst_const, program.ShiftPatternIsFirstVariables().Get( sp, up ) );
|
|
// Also include variables representing periods not in scope that directly follow unit periods in scope.
|
nextup := guard( up.NextPlanningUnitPeriod().astype( UnitPeriodTime ), null( UnitPeriodTime ) );
|
if( not isnull( nextup ) and not nextup.IsInScopeForShiftOptimization( scope ) )
|
{
|
totalspchangesconstr.NewTerm( -1.0 * scalefactor_spisfirst_const, program.ShiftPatternIsFirstVariables().Get( sp, nextup ) );
|
}
|
}
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|