Quintiq file version 2.0
|
#parent: #root
|
Method GetWindowCampaignSequenceOptimizer (
|
output Date earlieststart,
|
output Date lateststart,
|
Number windowsizenrperiods,
|
OptCampaignUnit ocunit,
|
LibOpt_Scope scope
|
)
|
{
|
TextBody:
|
[*
|
periods := selectsortedset( ocunit,
|
Unit.UnitPeriod,
|
up,
|
not up.IsPeriodFrozen()
|
and up.IsPlanning()
|
and not up.Period_MP().IsHistorical()
|
and up.Start() <= up.Unit().CampaignTypeRequirementHorizon()
|
and scope.Contains( up.UnitPeriodInOptimizerRun() ),
|
up.StartDate() );
|
|
if ( periods.Size() > 0 )
|
{
|
debuginfo( periods.Element( 0 ).StartDate(), periods.Element( periods.Size() - 1 ).StartDate(), periods.Size() );
|
if ( not earlieststart >= periods.Element( 0 ).StartDate() // check if we can re-use the shared window, if not then pick new one
|
or not lateststart <= periods.Element( periods.Size() - 1 ).StartDate() )
|
{
|
start := maxvalue( Number::Random( -windowsizenrperiods, periods.Size() - 1 ), 0 ); // give equal probability to first period by picking negative numbers also
|
end := minvalue( start + windowsizenrperiods, periods.Size() - 1 );
|
earlieststart := periods.Element( start ).StartDate();
|
lateststart := periods.Element( end ).StartDate();
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|