Quintiq file version 2.0
|
#parent: #root
|
Method InitConstraintsforCampaignCombis (
|
CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
|
const LibOpt_Scope scope
|
) const
|
{
|
TextBody:
|
[*
|
nrelewithin_constname := typeof( MPNrOfCampaignElementsWithinUnitSubPeriodConstraint );
|
isfirstelementtype_constname := typeof( MPIsFirstCampaignElementTypeConstraint );
|
ismultiperiodfirst_constname := typeof( MPIsMultiPeriodsFirstCampaignElementTypeFirstPeriodConstraint );
|
islastelementtype_constname := typeof( MPIsLastCampaignElementTypeConstraint );
|
compatiblewithprevocusplastelement_constname := typeof( MPCompatibleWithPrevOptCampaignUnitSubPeriodLastElementConstraint )
|
|
scalefactor_variscombiselected_constnrofelementswithin := this.ScaleConstraintTerm( typeof( MPIsCampaignCombiSelectedVariable ), nrelewithin_constname );
|
scalefactor_varnrofelementswithin_constnrofelementswithin := this.ScaleConstraintTerm( typeof( MPNrOfCampaignElementWithinUnitSubPeriodVariable ), nrelewithin_constname );
|
|
scalefactor_variscombiselected_constisfirstelementtype := this.ScaleConstraintTerm( typeof( MPIsCampaignCombiSelectedVariable ), isfirstelementtype_constname );
|
scalefactor_varisfirstelementtype_constisfirstelementtype := this.ScaleConstraintTerm( typeof( MPIsFirstCampaignElementTypeVariable ), isfirstelementtype_constname );
|
|
scalefactor_variscombiselected_constismultiperiodfirst := this.ScaleConstraintTerm( typeof( MPIsCampaignCombiSelectedVariable ), ismultiperiodfirst_constname );
|
scalefactor_varismultiperiodfirst_constismultiperiodfirst := this.ScaleConstraintTerm( typeof( MPIsMultiPeriodsFirstCampaignElementTypeFirstPeriodVariable ), ismultiperiodfirst_constname );
|
|
scalefactor_variscombiselected_constislastelementtype := this.ScaleConstraintTerm( typeof( MPIsCampaignCombiSelectedVariable ), islastelementtype_constname );
|
scalefactor_varislastelementtype_constislastelementtype := this.ScaleConstraintTerm( typeof( MPIsLastCampaignElementTypeVariable ), islastelementtype_constname );
|
|
scalefactor_varisfirstelementtype_constcompatiblewithprevocusplastelement := this.ScaleConstraintTerm( typeof( MPIsFirstCampaignElementTypeVariable ), compatiblewithprevocusplastelement_constname );
|
scalefactor_varislastelementtype_constcompatiblewithprevocusplastelement := this.ScaleConstraintTerm( typeof( MPIsLastCampaignElementTypeVariable ), compatiblewithprevocusplastelement_constname );
|
scalefactor_varisincompatiblewithprevelement_constcompatiblewithprevocusplastelement := this.ScaleConstraintTerm( typeof( MPIsIncompatibleWithPrevOptSubUnitPeriodLastElementVariable ), compatiblewithprevocusplastelement_constname );
|
scalefactor_rhs_constcompatiblewithprevocusplastelement := this.ScaleConstraintRHS( compatiblewithprevocusplastelement_constname, 1.0 );
|
|
traverse( scope.GetUnitPeriodInOptimizerRunConst(), Elements.OptCampaignUnitSubPeriod, ocusp )
|
{
|
|
traverse( ocusp, OptCampaignCombiElement.OptCampaignElementType, ocet )
|
{
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//NrOfElementsWithin:
|
//Calculate the number of Campaigns/Transitions that are selected for a particular CampaignType/TransitionType in an OptCampaignUnitSubPeriod.
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//Only Campaigns/Transitions that start and end in the OptCampaignUnitSubPeriod are counted.
|
ctrnrofelewithin := program.NrOfCampaignElementsWithinUnitSubPeriodConstraints().New( ocet, ocusp );
|
ctrnrofelewithin.Sense( "=" );
|
ctrnrofelewithin.RHSValue( 0.0 );
|
varnrofelewithin := program.NrOfCampaignElementWithinUnitSubPeriodVariables().Get( ocet, ocusp );
|
ctrnrofelewithin.NewTerm( -1.0 * scalefactor_varnrofelementswithin_constnrofelementswithin, varnrofelewithin );
|
iselementtypeelements := selectset( ocusp, OptCampaignCombiElementActive, occe,
|
occe.OptCampaignElementType() = ocet );
|
withelementtypecombis := selectset( iselementtypeelements, Elements.OptCampaignCombi, combi, true );
|
|
traverse( withelementtypecombis, Elements, combi )
|
{
|
nrofelementsincombi := counter( combi, OptCampaignCombiElement, occe,
|
not occe.IsFirstElementInUnitSubPeriod()
|
and not occe.IsLastElementInUnitSubPeriod()
|
and occe.OptCampaignUnitSubPeriod() = ocusp
|
and occe.OptCampaignElementType() = ocet );
|
|
variscombiselected := program.IsCampaignCombiSelectedVariables().Get( combi );
|
ctrnrofelewithin.NewTerm( nrofelementsincombi * scalefactor_variscombiselected_constnrofelementswithin,
|
variscombiselected );
|
}
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//IsFirstCampaingElementType
|
//Determine if the first element in an OptCampaignUnitSubPeriod is a Campaign/Transition that belongs to a particular CampaignType/TransitionType.
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
ctrisfirstelementtype := program.IsFirstCampaignElementTypeConstraints().New( ocet, ocusp );
|
varisfirstelementtype := program.IsFirstCampaignElementTypeVariables().Get( ocet, ocusp )
|
ctrisfirstelementtype.NewTerm( -1.0 * scalefactor_varisfirstelementtype_constisfirstelementtype, varisfirstelementtype )
|
ctrisfirstelementtype.Sense( "=" );
|
ctrisfirstelementtype.RHSValue( 0.0 );
|
firstelements := selectset( ocusp, OptCampaignCombiElementActive, occe,
|
occe.OptCampaignElementType() = ocet
|
and occe.IsFirstElementInUnitSubPeriod() );
|
startwithelementtypecombis := selectset( firstelements, Elements.OptCampaignCombi, combi, true );
|
|
traverse( startwithelementtypecombis, Elements, combi )
|
{
|
variscombiselected := program.IsCampaignCombiSelectedVariables().Get( combi );
|
ctrisfirstelementtype.NewTerm( 1.0 * scalefactor_variscombiselected_constisfirstelementtype,
|
variscombiselected );
|
}
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//IsMultiPeriodsFirstCampaignElementTypeFirstPeriod
|
//Determine if the first element in an OptCampaignUnitSubPeriod is a Campaign/Transition that belongs to a particular CampaignType/TransitionType, and from a multiperiod combi.
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
ctrismultiperiodfirst := program.IsMultiPeriodsFirstCampaignElementTypeFirstPeriodConstraints().New( ocet, ocusp )
|
varismultiperiodfirst := program.IsMultiPeriodsFirstCampaignElementTypeFirstPeriodVariables().Get( ocet, ocusp )
|
ctrismultiperiodfirst.NewTerm( -1.0 * scalefactor_varismultiperiodfirst_constismultiperiodfirst, varismultiperiodfirst )
|
firstelements := selectset( ocusp, OptCampaignCombiElementActive, occe,
|
occe.OptCampaignElementType() = ocet
|
and occe.IsFirstElementInUnitSubPeriod() );
|
startwithelementtypecombis := selectset( firstelements,
|
Elements.OptCampaignCombi,
|
combi,
|
combi.IsConsideredForLimitationConstraints()
|
and combi.OptCampaignUnitSubPeriod() = ocusp );
|
traverse( startwithelementtypecombis, Elements, combi )
|
{
|
variscombiselected := program.IsCampaignCombiSelectedVariables().Get( combi );
|
ctrismultiperiodfirst.NewTerm( 1.0 * scalefactor_variscombiselected_constismultiperiodfirst,
|
variscombiselected );
|
}
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//IsLastCampaingElementType
|
//Determine if the last element in an OptCampaignUnitSubPeriod is a Campaign/Transition that belongs to a particular CampaignType/TransitionType.
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
ctrislastelementtype := program.IsLastCampaignElementTypeConstraints().New( ocet, ocusp );
|
varislastelementtype := program.IsLastCampaignElementTypeVariables().Get( ocet, ocusp )
|
ctrislastelementtype.NewTerm( -1.0*scalefactor_varislastelementtype_constislastelementtype, varislastelementtype )
|
ctrislastelementtype.Sense( "=" );
|
ctrislastelementtype.RHSValue( 0.0 );
|
lastelements := selectset( ocusp, OptCampaignCombiElementActive, occe,
|
occe.OptCampaignElementType() = ocet
|
and occe.IsLastElementInUnitSubPeriod() );
|
endwithelementtypecombis := selectset( lastelements, Elements.OptCampaignCombi, combi, true );
|
|
traverse( endwithelementtypecombis, Elements, combi )
|
{
|
variscombiselected := program.IsCampaignCombiSelectedVariables().Get( combi );
|
ctrislastelementtype.NewTerm( 1.0 * scalefactor_variscombiselected_constislastelementtype,
|
variscombiselected );
|
}
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//CompatibleWithPrevOptCampaignUnitSubPeriodLastElement
|
//Ensure that the first Campaign/Transition of an OptCampaignUnitSubPeriod is compatible with the last Campaign/Transition of the previous OptCampaignUnitSubPeriod.
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
previousperiod := ocusp.PreviousSubPeriod();
|
//there is no need for a constraint for the first period
|
if( not isnull( previousperiod ) )
|
{
|
ctrcompatiblewithprevocusp := program.CompatibleWithPrevOptCampaignUnitSubPeriodLastElementConstraints().New( ocet, ocusp );
|
ctrcompatiblewithprevocusp.Sense( '<=' );
|
varisincompatible := program.IsIncompatibleWithPrevOptSubUnitPeriodLastElementVariables().Get( ocusp );
|
varisprevioussubperiodlastelementtype := program.IsLastCampaignElementTypeVariables().Find( ocet, previousperiod );
|
//the variable for last elementtype in previous ocusp could be null if there is no combi element of this type in previous ocusp
|
//in that case we don't include the variable
|
if( not isnull( varisprevioussubperiodlastelementtype ) )
|
{
|
ctrcompatiblewithprevocusp.NewTerm( -1.0*scalefactor_varislastelementtype_constcompatiblewithprevocusplastelement, varisprevioussubperiodlastelementtype );
|
}
|
else if( previousperiod.IsFixed() and OptCampaignElementType::GetIsCompatibleElementTypes( previousperiod, ocet ) )
|
{
|
ctrcompatiblewithprevocusp.RHSValue( 1.0 * scalefactor_rhs_constcompatiblewithprevocusplastelement );
|
}
|
|
ctrcompatiblewithprevocusp.NewTerm( -1.0*scalefactor_varisincompatiblewithprevelement_constcompatiblewithprevocusplastelement, varisincompatible );
|
ctrcompatiblewithprevocusp.NewTerm( 1.0*scalefactor_varisfirstelementtype_constcompatiblewithprevocusplastelement, varisfirstelementtype );
|
}
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|