Quintiq file version 2.0
|
#parent: #root
|
Method InitConstraintsForShiftPatterns (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
const RunContextForCapacityPlanning runcontext,
|
const LibOpt_Scope scope
|
) const
|
{
|
Description: 'Initialize constraints for shift pattern optimization'
|
TextBody:
|
[*
|
if( runcontext.UseShiftOptimization() )
|
{
|
constname1 := typeof( MPFirstPeriodStartOfPlanningConstraint );
|
constname2 := typeof( MPFirstPeriodShiftOnUnitConstraint );
|
constname3 := typeof( MPFirstPeriodShiftNotUsedConstraint );
|
constname4 := typeof( MPFirstPeriodShiftAlreadyUsedConstraint );
|
|
scalefactor_spisused_const1 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constname1 );
|
scalefactor_spisfirst_const1 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsFirstVariable ), constname1 );
|
scalefactor_spisused_const2 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constname2 );
|
scalefactor_spisfirst_const2 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsFirstVariable ), constname2 );
|
scalefactor_spisused_const3 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constname3 );
|
scalefactor_spisfirst_const3 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsFirstVariable ), constname3 );
|
scalefactor_spisfirst_const4 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsFirstVariable ), constname4 );
|
scalefactor_spisused_const4 := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constname4 );
|
|
scalefactor_rhs_const2 := this.ScaleConstraintRHS( constname2, 1.0 );
|
scalefactor_rhs_const3 := this.ScaleConstraintRHS( constname3, 1.0 );
|
scalefactor_rhs_const4 := this.ScaleConstraintRHS( constname4, 1.0 );
|
|
constnamemin := typeof( MPMinShiftPatternDurationConstraint );
|
scalefactor_spisused_constmin := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constnamemin );
|
scalefactor_spisfirst_constmin := this.ScaleConstraintTerm( typeof( MPShiftPatternIsFirstVariable ), constnamemin );
|
scalefactor_mindurationslack_constmin := this.ScaleConstraintTerm( typeof( MPShiftPatternDurationSlackVariable ), constnamemin );
|
|
scalefactor_rhs_minimumdurationconstr := this.ScaleConstraintRHS( constnamemin, 1.0 );
|
|
constnameone := typeof( MPOneShiftPatternPerUnitPeriodConstraint );
|
scalefactor_spisused_constone := this.ScaleConstraintTerm( typeof( MPShiftPatternIsUsedVariable ), constnameone );
|
scalefactor_rhs_constone := this.ScaleConstraintRHS( constnameone, 1.0 );
|
|
traverse( scope.GetUnitInOptimizerRunConst(), Elements, parentunit, parentunit.GetUseShiftOptimization() )
|
{
|
this.InitConstraintsForShiftPatternTotalChanges( program, scope, parentunit );
|
|
traverse( parentunit.GetUnitForShiftOptimization(), Elements, unit )
|
{
|
// Get every shift pattern allowed on a unit.
|
traverse( unit, UnitShiftPatternAllowed.ShiftPattern, sp )
|
{
|
traverse( unit, UnitPeriod.astype(UnitPeriodTime), up, up.IsInScopeForShiftOptimization( scope ) )
|
{
|
this.InitConstraintsForShiftPatternFirstPeriod( program,
|
scope,
|
up,
|
sp,
|
scalefactor_spisused_const1,
|
scalefactor_spisfirst_const1,
|
scalefactor_spisused_const2,
|
scalefactor_spisfirst_const2,
|
scalefactor_spisused_const3,
|
scalefactor_spisfirst_const3,
|
scalefactor_spisfirst_const4,
|
scalefactor_spisused_const4,
|
scalefactor_rhs_const2,
|
scalefactor_rhs_const3,
|
scalefactor_rhs_const4 );
|
this.InitConstraintsForShiftPatternMinDuration( program,
|
scope,
|
up,
|
sp,
|
scalefactor_spisused_constmin,
|
scalefactor_spisfirst_constmin,
|
scalefactor_mindurationslack_constmin,
|
scalefactor_rhs_minimumdurationconstr );
|
|
// Create constraints for unit periods not in scope that directly follow a unit period in scope.
|
nextup := up.NextPlanningUnitPeriod();
|
if( not isnull( nextup ) and not nextup.IsInScopeForShiftOptimization( scope ) )
|
{
|
this.InitConstraintsForShiftPatternFirstPeriod( program,
|
scope,
|
nextup.astype( UnitPeriodTime ),
|
sp,
|
scalefactor_spisused_const1,
|
scalefactor_spisfirst_const1,
|
scalefactor_spisused_const2,
|
scalefactor_spisfirst_const2,
|
scalefactor_spisused_const3,
|
scalefactor_spisfirst_const3,
|
scalefactor_spisfirst_const4,
|
scalefactor_spisused_const4,
|
scalefactor_rhs_const2,
|
scalefactor_rhs_const3,
|
scalefactor_rhs_const4 );
|
this.InitConstraintsForShiftPatternMinDuration( program,
|
scope,
|
nextup.astype( UnitPeriodTime ),
|
sp,
|
scalefactor_spisused_constmin,
|
scalefactor_spisfirst_constmin,
|
scalefactor_mindurationslack_constmin,
|
scalefactor_rhs_minimumdurationconstr );
|
}
|
}
|
}
|
|
traverse( unit, UnitPeriod.astype(UnitPeriodTime), up, up.IsInScopeForShiftOptimization( scope ) )
|
{
|
this.InitConstraintsForShiftPatternOnePerPeriod( program,
|
up,
|
scalefactor_spisused_constone,
|
scalefactor_rhs_constone );
|
|
// Create minimum duration constraints for unit periods not in scope that precede a unit period in scope.
|
if( guard( not up.PreviousPlanningUnitPeriod().IsInScopeForShiftOptimization( scope ), false ) )
|
{
|
this.InitConstraintsForShiftPatternMinDurationOutsideScope( program,
|
scope,
|
up,
|
scalefactor_spisused_constmin,
|
scalefactor_spisfirst_constmin,
|
scalefactor_mindurationslack_constmin,
|
scalefactor_rhs_minimumdurationconstr );
|
}
|
}
|
}
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|