Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method RunInventoryOptimization ( 
 | 
  Duration timelimitinventoryoptimization, 
 | 
  Boolean issingleiteration, 
 | 
  Boolean isselectbestiteration, 
 | 
  Boolean iscleanupolditerations, 
 | 
  Boolean isresetsimulations, 
 | 
  Number numberofsimulations, 
 | 
  Number numberofperiodsinwindow, 
 | 
  Strategy strategy, 
 | 
  Boolean overwritemanual 
 | 
) 
 | 
{ 
 | 
  Description: 'Runs the inventory optimization algorithm' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // We run the inventory optimization from the start of the planning horizon over the next X periods. 
 | 
    // After each optimizer run, both the start and end period move by 1. 
 | 
    // Once the end period is equal to the end of the horizon, the window will start to shrink. 
 | 
    periodstart := this.StartOfPlanningPeriod(); 
 | 
    periodend := this.DEPRECATED_InventoryOptimization().GetPeriodEndInventoryOptimization( periodstart ); 
 | 
       
 | 
    // Inventory optimization does not use smart plan 
 | 
    issmartplan := false; 
 | 
    issmartplanforperiodtask := false;  
 | 
    hastotalsupplyuser := false; 
 | 
    totalsupplyuser := 0.0; 
 | 
    smartplanpispip := null( ProductInStockingPointInPeriodPlannings ); 
 | 
    isupstreamsmartplan := false; 
 | 
    ismiddleoutsmartplan := false; 
 | 
    isonlyplanonestepupstream := false; 
 | 
     
 | 
     
 | 
    // This is an inventory optimization run 
 | 
    isinventoryoptimization := true; 
 | 
     
 | 
    // Save the settings of the inventory optimization 
 | 
    algorithm := this.DEPRECATED_InventoryOptimization(); 
 | 
    algorithm.StartInventoryOptimization( DateTime::ActualTime() ); 
 | 
    algorithm.TimeLimitInventoryOptimization( timelimitinventoryoptimization ); 
 | 
    algorithm.NumberOfSimulations( numberofsimulations ); 
 | 
    algorithm.NumberOfPeriodsWindowInventoryOptimization( numberofperiodsinwindow ); 
 | 
    algorithm.IsStopInventoryOptimization( false ); 
 | 
    algorithm.IsRunningInventoryOptimization( true ); 
 | 
    algorithm.IsSelectBestIteration( isselectbestiteration ); 
 | 
     
 | 
    // Clean up the old iterations if that option is selected 
 | 
    if( iscleanupolditerations ) 
 | 
    { 
 | 
      olditerations := selectset( algorithm, Iteration, iteration, true ); 
 | 
      Iteration::Delete( olditerations ); 
 | 
    } 
 | 
    // Otherwise make sure all old iterations are marked as not being part of the last run 
 | 
    else 
 | 
    { 
 | 
      traverse( algorithm, Iteration, iteration, iteration.IsPartOfLastRun() ) 
 | 
      { 
 | 
        iteration.IsPartOfLastRun( false ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
     
 | 
     
 | 
    // Create a new iteration 
 | 
    iteration := Iteration::Create( this.DEPRECATED_InventoryOptimization(), strategy.MaxActiveLevel() ); 
 | 
    iteration.Start( algorithm.StartInventoryOptimization() ); 
 | 
    iteration.IsStopAfterThisIteration( issingleiteration ); 
 | 
    iteration.IsEvaluation( issingleiteration ); 
 | 
     
 | 
    // If no previous iteration has been selected, select the current iteration 
 | 
    if( not exists( this, DEPRECATED_InventoryOptimization.Iteration, olditeration, olditeration.IsSelected() ) ) 
 | 
    { 
 | 
      iteration.IsSelected( true ); 
 | 
    } 
 | 
     
 | 
    // If the simulations should be reset 
 | 
    // Then we should generate new demand realizations 
 | 
    // So all existing sales demand realization should be deleted 
 | 
    if( isresetsimulations ) 
 | 
    { 
 | 
      traverse( this, SalesDemand.SimulationSalesDemand, simsalesdemand ) 
 | 
      { 
 | 
        SimulationSalesDemand::Delete( simsalesdemand ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
         
 | 
    // Generate the moves 
 | 
    algorithm.GenerateMoves(); 
 | 
     
 | 
    // Inventory optimization will not do postprocessing 
 | 
    ispostprocessing := false; 
 | 
     
 | 
    // No autoscaling during inventory optimization 
 | 
    isforcenoautoscaling := true; 
 | 
     
 | 
    this.RunOptimizer( issmartplan, 
 | 
                       issmartplanforperiodtask,  
 | 
                       hastotalsupplyuser, 
 | 
                       totalsupplyuser, 
 | 
                       smartplanpispip, 
 | 
                       isupstreamsmartplan, 
 | 
                       ismiddleoutsmartplan, 
 | 
                       isonlyplanonestepupstream, 
 | 
                       ispostprocessing, 
 | 
                       isforcenoautoscaling, 
 | 
                       strategy, 
 | 
                       overwritemanual, 
 | 
                       periodstart, periodend, 
 | 
                       isinventoryoptimization, false, null( Units ),  
 | 
                       null( Process_MP ),  
 | 
                       this.OptimizerPuzzleWorld() ); 
 | 
  *] 
 | 
} 
 |