Quintiq file version 2.0
|
#parent: #root
|
Method RunSmartPlanForBenchmarking (
|
LibOBT_RunTask runtask,
|
Strategy strategy,
|
LibOBT_RunTaskSetting setting
|
)
|
{
|
TextBody:
|
[*
|
// Update the optimizer status to running
|
sm := Util::GetScenarioManagerStream();
|
sm->UpdateScenarioOptimizerStatus( this.MDSID(), Translations::MP_GlobalParameters_GetOptimizerRunningStatus(), "", "" );
|
|
// Run smartplan for benchmarking
|
// We will call the method directly instead of via MacroPlan::JobRunSmartPlan( company, strategy, runtask, setting );
|
// So that the job will queue before reporting ReportRunTaskFinish
|
// Initialize variables
|
hastotalsupplyuser := false;
|
totalsupplyuser := 0.0;
|
isupstreamsmartplan := false;
|
ismiddleoutsmartplan := false;
|
isonlyplanonestepupstream := false;
|
isoverridemanualplanning := true;
|
isusingselectedunits := false;
|
periodstart := this.FirstPlanningPeriod();
|
periodend := this.LastPlanningPeriod();
|
units := selectset( this, Unit, units, true ); //all units
|
|
smartplanpispips := construct( ProductInStockingPointInPeriodPlannings );
|
|
// pispip: Quibi in DC - 3 pispips
|
pispip_quibidc := selectset( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::DCID() );
|
// pispip: Quibi in DC in January
|
pispip_quibidcjanuary := minobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::DCID(), pispip.Start() );
|
// pispip: Quibi in DC in March
|
pispip_quibidcmarch := maxobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::DCID(), pispip.Start() );
|
// pispip: Quibi in Warehouse in January
|
pispip_quibiwarehousejanuary := minobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::WarehouseID(), pispip.Start() );
|
// pispip: Pulp in Warehouse in January
|
pispip_pulpwarehousejanuary := minobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::PulpProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::WarehouseID(), pispip.Start() );
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 1 ), 0 ) > -1 )
|
{
|
isupstreamsmartplan := true; // Direction: Upstream
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 2 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 2500;
|
isupstreamsmartplan := true; // Direction: Upstream
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 3 ), 0 ) > -1 )
|
{
|
// Direction: Downstream. Default values are false, meaning that direction is downstream
|
smartplanpispips.Add( pispip_pulpwarehousejanuary ); // Pulp in Warehouse in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 4 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 5000;
|
// Direction: Downstream. Default values are false, meaning that direction is downstream
|
smartplanpispips.Add( pispip_pulpwarehousejanuary ); // Pulp in Warehouse in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 5 ), 0 ) > -1 )
|
{
|
ismiddleoutsmartplan := true; // Direction: Middle-Out
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 6 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 5000;
|
ismiddleoutsmartplan := true; // Direction: Middle-Out
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 7 ), 0 ) > -1 )
|
{
|
isupstreamsmartplan := true; // Direction: Upstream
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
|
// have manual plan, planner created a trip from warehouse to DC carry 500 Quibi.
|
laneleg := select( this, Unit.Lane.LaneLeg, laneleg, laneleg.LaneID()= LaneLeg::TransportTransportLaneID() and laneleg.Name() = LaneLeg::WarehouseToDCName() );
|
product := select( this, Product_MP, product, product.Name() = Product_MP::QuibiProductID() );
|
trip := Trip::Create( laneleg, periodstart );
|
trip.AddProduct( product, 250.0 , true ); // 3rd parameter has to be true which represents user input
|
Transaction::Transaction().PropagateAll( typeof( Trip ) );
|
Transaction::Transaction().PropagateAll( typeof( ProductInTrip ) );
|
Transaction::Transaction().Propagate( attribute( Trip, HasUserQuantity ) );
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 8 ), 0 ) > -1 )
|
{
|
isoverridemanualplanning := false;
|
isupstreamsmartplan := true; // Direction: Upstream
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
|
// first delete all trips so test is repeatable
|
traverse( this, Unit.Lane.LaneLeg.Trip, t )
|
{
|
t.Delete();
|
}
|
// have manual plan, planner created a trip from warehouse to DC carry 500 Quibi.
|
laneleg := select( this, Unit.Lane.LaneLeg, laneleg, laneleg.LaneID()= LaneLeg::TransportTransportLaneID() and laneleg.Name() = LaneLeg::WarehouseToDCName() );
|
product := select( this, Product_MP, product, product.Name() = Product_MP::QuibiProductID() );
|
trip := Trip::Create( laneleg, periodstart );
|
trip.AddProduct( product, 250.0 , true ); // 3rd parameter has to be true which represents user input
|
Transaction::Transaction().PropagateAll( typeof( Trip ) );
|
Transaction::Transaction().PropagateAll( typeof( ProductInTrip ) );
|
Transaction::Transaction().Propagate( attribute( Trip, HasUserQuantity ) );
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 9 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 500;
|
isupstreamsmartplan := true; // Direction: Upstream
|
isonlyplanonestepupstream := true;
|
smartplanpispips.Add( pispip_quibiwarehousejanuary ); // Quibi in Warehouse in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 10 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 2500;
|
isupstreamsmartplan := true; // Direction: Upstream
|
isusingselectedunits := true;
|
units := selectset( this, Unit, unit, unit.Name() <> Unit::Supplier2UnitName() ); // Supplier 2 excluded
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 11 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 2500;
|
isupstreamsmartplan := true; // Direction: Upstream
|
isusingselectedunits := true; // All units are selected at the beginning.
|
smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 12 ), 0 ) > -1 )
|
{
|
hastotalsupplyuser := true;
|
totalsupplyuser := 15000;
|
isupstreamsmartplan := true; // Direction: Upstream
|
smartplanpispips.Add( pispip_quibidcmarch ); // Quibi DC in March is selected
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 13 ), 0 ) > -1 )
|
{
|
isupstreamsmartplan := true; // Direction: Upstream
|
traverse( pispip_quibidc, Elements, pispip ) // pispip_quibidc contains 3 pispips
|
{
|
smartplanpispips.Add( pispip );
|
}
|
}
|
|
if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 14 ), 0 ) > -1 )
|
{
|
isupstreamsmartplan := true; // Direction: Upstream
|
smartplanpispips.Add( pispip_quibidcmarch ); // Quibi in DC in March is the selected pispip
|
}
|
|
this.RunSmartPlan( true , // issmartplan
|
false, // issmartplanforperiodtask
|
smartplanpispips,
|
hastotalsupplyuser,
|
totalsupplyuser,
|
isupstreamsmartplan,
|
ismiddleoutsmartplan,
|
isonlyplanonestepupstream,
|
strategy,
|
isoverridemanualplanning,
|
periodstart,
|
periodend,
|
isusingselectedunits,
|
units,
|
null( Process_MP),
|
false ); /* re-use strategymacroplan */
|
|
algorithmrun := this.GetLastAlgorithmRun();
|
|
if ( not isnull( algorithmrun ) )
|
{
|
algorithmrun.UpdateForBenchmarking( runtask.ID(),
|
runtask.TestInstanceID(),
|
runtask.LibOBT_Benchmarker().LibOBT_BenchmarkerParameter().TotalThreadsAllowed(),
|
setting.Description(),
|
runtask.LibOBT_Benchmarker().LibOBT_BenchmarkerParameter().IsBenchmarkingRun() );
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|