Quintiq file version 2.0
|
#parent: #root
|
Method Evaluate
|
{
|
Description: 'Evaluate whether this iteration is better than the previous best iteration'
|
TextBody:
|
[*
|
// edz1 Sep-2-2016 (created)
|
|
// Mark the iteration as complete
|
this.IsFinished( true );
|
|
isfirstiteration := this.Start() = this.DEPRECATED_InventoryOptimization().StartInventoryOptimization();
|
|
// Correct the total KPI value for the service level (Inventory Optimization KPI)
|
traverse( this, IterationLevel, iterationlevel )
|
{
|
iterationlevel.SetCorrectedExpectedTotalKPIValue();
|
}
|
|
// If this is the first iteration, then it is the best iteration
|
if( isfirstiteration )
|
{
|
this.SetAsBestIteration();
|
}
|
// Otherwise we will evaluate the iteration
|
else
|
{
|
// Select the previous best iteration
|
prevbestiteration := select( this, DEPRECATED_InventoryOptimization.Iteration, iteration, iteration.IsBestIteration() );
|
|
if( this.GetIsImprovement() )
|
{
|
// If this is an improvement, it is the best iteration
|
this.SetAsBestIteration();
|
|
// Since this is an improvement, reset the number of consecutive failures
|
traverse( this, Move, move )
|
{
|
move.NumberOfConsecutiveRejections( 0 );
|
}
|
|
// Since we have found an improvement, all other moves that had previously already been tried may now give an improvement again
|
// So we no longer mark them as has been tried
|
traverse( this, DEPRECATED_InventoryOptimization.Move, move, move.HasBeenTried() )
|
{
|
move.HasBeenTried( false );
|
}
|
}
|
// Otherwise undo the move and mark it as has been tried
|
else
|
{
|
traverse( this, Move, move )
|
{
|
move.UndoMove();
|
}
|
}
|
|
// Update the benefit of the latest attempt for the step moves
|
traverse( this, Move.astype( MoveStep ), move )
|
{
|
previousavgservicelevel := average( move, InventorySpecification.InventorySpecificationInServiceLevel.ServiceLevelBase.IterationServiceLevel, itsl,
|
itsl.Iteration() = prevbestiteration,
|
itsl.AchievedServiceLevel() );
|
// Update the achieved service levels of the current iteration
|
traverse( this, IterationServiceLevel, itsl )
|
{
|
traverse( itsl, IterationPISPIP, itpispip )
|
{
|
itpispip.CalcTotalDemand();
|
itpispip.CalcAchievedServiceLevel();
|
}
|
itsl.CalcAchievedServiceLevel();
|
}
|
|
newavgservicelevel := average( move, InventorySpecification.InventorySpecificationInServiceLevel.ServiceLevelBase.IterationServiceLevel, itsl,
|
itsl.Iteration() = this,
|
itsl.AchievedServiceLevel() );
|
|
benefit := 0.0;
|
if( move.QuantityForUndo() > 0 )
|
{
|
benefit := ( newavgservicelevel - previousavgservicelevel ) / move.QuantityForUndo();
|
}
|
|
if( not move.IsIncrease() )
|
{
|
benefit := -benefit;
|
}
|
move.BenefitPerQtyLatestAttempt( benefit );
|
}
|
}
|
|
// If this is the best iteration and we should automatically select the best iteration
|
// Then select this iteration and update the expected KPIs on the PISPs
|
if( this.IsBestIteration() and this.DEPRECATED_InventoryOptimization().IsSelectBestIteration() )
|
{
|
this.SelectIterationAndInventorySpecifications();
|
}
|
*]
|
}
|