yanweiyuan3
2023-08-09 588bc7829387dfc761cc25f06f77d4c81818bd10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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' }
}