Quintiq file version 2.0
|
#parent: #root
|
Method InitConstraintsGoalsForDriverTime (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
const LibOpt_Scope scope
|
) const
|
{
|
Description: 'Init constraints goals for account depends on time, applicable to unit period time'
|
TextBody:
|
[*
|
// Time accounts
|
// Get variable names
|
ptqty_varname := typeof( MPPTQtyVariable );
|
tvarname := typeof( MPDriverTimeVariable );
|
// Get constraint names
|
tconstname := typeof( MPDriverTimeConstraint );
|
// Get scaling factors
|
scalefactor_driver_tconst := this.ScaleConstraintTerm( tvarname, tconstname );
|
scalefactor_periodtaskqty_tconst := this.ScaleConstraintTerm( ptqty_varname, tconstname );
|
|
scalefactor_rhs_tconst := this.ScaleConstraintRHS( tconstname, 1.0 );
|
|
driver := select( this, MacroPlan.AccountCostDriver, driver, driver.Name() = Translations::MP_AccountAssignmentCostDriverTime() ); // unique
|
traverse( scope.GetAccountsInOptimizerRunConst(), Elements, account, account.HasTimeAssignment() ) // condition => driver not null
|
{
|
// tconst constraint UoM: Monetary
|
tconst := program.DriverTimeConstraints().New( account, driver );
|
tconst.Sense( '=' );
|
tconst.RHSValue( 0.0 * scalefactor_rhs_tconst );
|
// Term UoM: Monetary
|
tconst.NewTerm( 1.0 * scalefactor_driver_tconst, program.DriverTimeVariables().Get( account, driver ) );
|
|
traverse( account, AccountAssignment, aa, aa.AccountCostDriver() = driver and aa.AccountCost( relsize ) > 0 )
|
{
|
traverse( aa, astype( UnitAccount ).UnitAccountInPeriodForTime.UnitPeriod, up,
|
scope.Contains( up.UnitPeriodInOptimizerRun() ) )
|
{
|
if ( this.GetPeriodsFromPeriodTaskOperation())
|
{
|
period := up.Period_MP();
|
traverse( up, PeriodTaskOperationInScope.Operation, operation )
|
{
|
ptqtyvar := program.PTQtyVariables().Get( operation, period );
|
|
cost := operation.GetBaseCostPerQuantityForHour( aa, up );
|
// Term: -cost * qtpfactor * PTQty variable
|
// UoM: [Monetary/Unit] * [-] * [Unit]
|
tconst.NewTerm( -cost * operation.QuantityToProcessFactor() * scalefactor_periodtaskqty_tconst,
|
ptqtyvar );
|
}
|
}
|
else
|
{
|
traverse( up, Unit.OperationForOptimizationInScope, operation )
|
{
|
ptqtyvar := program.PTQtyVariables().Find( operation, up.Period_MP() );
|
// If the ptqtyvar is null then this combination of operation and period is not considered by the optimizer
|
if( not isnull( ptqtyvar ) )
|
{
|
cost := operation.GetBaseCostPerQuantityForHour( aa, up );
|
// Term: -cost * qtpfactor * PTQty variable
|
// UoM: [Monetary/Unit] * [-] * [Unit]
|
tconst.NewTerm( -cost * operation.QuantityToProcessFactor() * scalefactor_periodtaskqty_tconst,
|
ptqtyvar );
|
}
|
}
|
}
|
}
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|