Quintiq file version 2.0
|
#parent: #root
|
Method InitConstraintsGoalsForDriverVolume (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
const LibOpt_Scope scope,
|
const constcontent ProductInTrips pitinrun
|
) const
|
{
|
Description: 'Init constraints goals for account depends on volume, i.e., quantity'
|
TextBody:
|
[*
|
// Volume accounts
|
ptqty_varname := typeof( MPPTQtyVariable );
|
tripnewsupply_varname := typeof( MPTripNewSupplyVariable );
|
drivervolume_varname := typeof( MPDriverVolumeVariable );
|
drivervolume_constname := typeof( MPDriverVolumeConstraint );
|
|
scalefactor_driver_dconst := this.ScaleConstraintTerm( drivervolume_varname, drivervolume_constname );
|
scalefactor_periodtaskqty_dconst := this.ScaleConstraintTerm( ptqty_varname, drivervolume_constname );
|
scalefactor_tripnewsupply_dconst := this.ScaleConstraintTerm( tripnewsupply_varname, drivervolume_constname );
|
|
scalefactor_rhs_dconst := this.ScaleConstraintRHS( drivervolume_constname, 1.0 );
|
|
driver := select( this, MacroPlan.AccountCostDriver, driver, driver.Name() = Translations::MP_AccountAssignmentCostDriverVolume() ); // unique
|
|
if ( this.GetPeriodsFromPeriodTaskOperation() )
|
{
|
traverse( scope.GetAccountsInOptimizerRunConst(), Elements, account, account.HasVolumeAssignment() ) // condition => driver not null
|
{
|
// dcconst constraint UoM: Monetary
|
dcconst := program.DriverVolumeConstraints().New( account, driver );
|
dcconst.Sense( '=' );
|
dcconst.RHSValue( 0.0 * scalefactor_rhs_dconst );
|
// Term UoM: Monetary
|
dcconst.NewTerm( 1.0 * scalefactor_driver_dconst, program.DriverVolumeVariables().Get( account, driver ) );
|
}
|
|
traverse( scope.GetPeriodTaskOperationInOptimizerRunConst(), Elements, pto )
|
{
|
up := pto.UnitPeriod();
|
operation := pto.Operation();
|
period := up.Period_MP();
|
traverse( up, UnitAccountInPeriodForVolume.UnitAccount, aa, aa.AccountCost( relsize ) > 0 )
|
{
|
dcconst := program.DriverVolumeConstraints().Get( aa.Account_MP(), aa.AccountCostDriver() );
|
cost := operation.GetBaseCostPerQuantityForVolume( aa, up );
|
ptqtyvar := program.PTQtyVariables().Get( operation, period );
|
|
dcconst.NewTerm( -cost * operation.QuantityToProcessFactor() * scalefactor_periodtaskqty_dconst,
|
ptqtyvar );
|
}
|
}
|
}
|
else
|
{
|
traverse( scope.GetAccountsInOptimizerRunConst(), Elements, account, account.HasVolumeAssignment() ) // condition => driver not null
|
{
|
// dcconst constraint UoM: Monetary
|
dcconst := program.DriverVolumeConstraints().New( account, driver );
|
dcconst.Sense( '=' );
|
dcconst.RHSValue( 0.0 * scalefactor_rhs_dconst );
|
// Term UoM: Monetary
|
dcconst.NewTerm( 1.0 * scalefactor_driver_dconst, program.DriverVolumeVariables().Get( account, driver ) );
|
|
traverse( account, AccountAssignment, aa, aa.AccountCostDriver() = driver and aa.AccountCost( relsize ) > 0 )
|
{
|
// Operation (only include those that are part of this optimizer run and related to a unit period that is part of this optimizer run)
|
traverse( aa, astype( UnitAccount ).UnitAccountInPeriodForVolume.UnitPeriod, up,
|
scope.Contains( up.UnitPeriodInOptimizerRun() ) )
|
{
|
traverse( up, Unit.OperationForOptimizationInScope, operation)
|
{
|
cost := operation.GetBaseCostPerQuantityForVolume( aa, up );
|
ptqtyvar := program.PTQtyVariables().Find( operation, up.Period_MP() );
|
// If the period task quantity variable does not exist, then this combination of period and operation is not considered by the optimizer
|
if( not isnull( ptqtyvar ) )
|
{
|
// Term: -cost * qtpfactor * PTQty variable
|
// UoM: [Monetary/Unit] * [-] * [Unit]
|
dcconst.NewTerm( -cost * operation.QuantityToProcessFactor() * scalefactor_periodtaskqty_dconst,
|
ptqtyvar );
|
}
|
}
|
}
|
}
|
}
|
}
|
|
traverse( pitinrun, Elements, pit )
|
{
|
trip := pit.Trip();
|
laneleg := trip.LaneLeg();
|
uomconversion := pit.UnitConversionFactor();
|
traverse( pit, Trip.ArrivalUnitPeriod.UnitAccountInPeriodForVolume.UnitAccount, aa )
|
{
|
cost := laneleg.GetBaseCostPerQuantityForVolume( aa, trip.DepartureUnitPeriod() );
|
tripnewsupplyvar := program.TripNewSupplyVariables().Get( pit );
|
dcconst := program.DriverVolumeConstraints().Get( aa.Account_MP(), aa.AccountCostDriver() );
|
|
dcconst.NewTerm( -uomconversion * cost * laneleg.QuantityToProcessFactor() * scalefactor_tripnewsupply_dconst,
|
tripnewsupplyvar );
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|