admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
Quintiq file version 2.0
#parent: #root
Method UpdateGoalScaling (
  StrategyMacroPlan strategy,
  StrategyLevelMacroPlan slm
)
{
  TextBody:
  [*
    // provide slm in order to use level specific scaling factor ( used for meta optimizer ) 
    
    // Set goal scaling factors to be equal to the maximum value of the relevant variable scaling types
    this.CreateScaleFactors( slm ); 
    
    algorithmscaling := this.AlgorithmScaling();
    
    minscalingfactor := algorithmscaling.MinScalingFactor();
    maxscalingfactor := algorithmscaling.MaxScalingFactor();
    
    traverse( strategy, StrategyLevelMacroPlan, strategylevel )
    {
      newgoalscalingfactor := minscalingfactor;
      if ( strategylevel.Level() = 0 ) 
      {
        // set mass scaling for balance slack level
         newgoalscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalSlackVariable ) ); 
      }
      else
      {
        traverse( strategy, KPIWeightMacroPlan, kpiweight, kpiweight.Level() = strategylevel.Level() )
        {
          varscalingfactor := 0.0;
          weightedvarscalingfactor := minscalingfactor;
          
          if( not kpiweight.KPIIsAccount() )
          {
            name := kpiweight.KPIName();
          
            if( name = Translations::MP_GlobalParameters_KPIBlendingName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalBlendingVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            } 
            else if( name = Translations::MP_GlobalParameters_KPICampaignName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalCampaignVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIFulfillmentName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalFulfillmentVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPILotSizeName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalLotSizeVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIInventoryMixBalancing() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalInventoryMixBalancingVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIMaximumInventoryLevelName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMaximumInventoryLevelVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIMinimumInventoryLevelName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMinimumInventoryLevelVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIMaximumSupplyName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMaximumSupplyVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIMinimumSupplyName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMinimumSupplyVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIMinimumUnitCapacityName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMinimumUnitCapacityVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIPostponementPenaltyName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalPostponementPenaltyVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIProcessMaximumQuantity() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalProcessMaximumQuantityVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIProcessMinimumQuantity() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalProcessMinimumQuantityVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPISalesDemandPriorityName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalSalesDemandPriorityVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIFulfillmentTargetName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalFulfillmentTargetVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIServiceLevelName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalServiceLevelVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIStockingPointCapacityName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalStockingPointCapacityVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPISupplyTargetName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalSupplyTargetVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPISafetyStock() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalTargetInvLevelVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIUnitCapacityName() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalUnitCapacityVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPICapacitySmoothing() ) 
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPCapacitySmoothingSlackVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPICO2Emission() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalCO2EmissionVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            else if( name = Translations::MP_GlobalParameters_KPIShiftPatternChangesPenalty() )
            {
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalShiftPatternChangesPenaltyVariable ) );
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight();
            }
            
            newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
          }
          else 
          {
            account := select( this, MacroPlan.Account_MP, a, guard( a.Name() = kpiweight.KPIName(), false ) );
        
            if( not isnull( account ) )
            {
              traverse( account, AccountAssignment.AccountCostDriver, driver )
              {
                        
                if( driver.Name() = Translations::MP_AccountAssignmentCostDriverFixed() )                 // fixed
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverFixedVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverStaffing() )         // staffing
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverStaffingVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor )
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventoryValue() )   // inventory value
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverInventoryValueVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventoryHolding() ) // inventory holding
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverInventory_HoldingVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverNrOfUnits() )        // nr of units
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverNrOfUnitsVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverSales() )            // sales
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverSalesVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverTime() )             // time
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverTimeVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverVolume() )           // volume
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverVolumeVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverLot() )              // Lot
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverLotVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverChangeover() )        // Changeover
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverChangeoverVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();
                
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else if ( driver.Name() = Translations::MP_AccountAssignmentCostDriverOneTime() )         // One time 
                {
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverOneTimeVariable ) );
                  weightedvarscalingfactor := varscalingfactor * account.Weight();  
                  
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor );
                }
                else
                {
                  info( '>>> Driver variable does not exist and excluded from goal scaling update calculations which is for account ', account.Name(), ' driver name:', driver.Name() );  
                }
              }
            }
          }
        }
      }
      
      newgoalscalingfactor := maxvalue( newgoalscalingfactor, minscalingfactor );
      newgoalscalingfactor := minvalue( newgoalscalingfactor, maxscalingfactor );
      
      oldvalue := strategylevel.GoalScaling(); 
      strategylevel.GoalScaling( newgoalscalingfactor );
      debuginfo(  'Updated goal scaling for level ', strategylevel.Level(), ' to ', strategylevel.GoalScaling(), 'from ', oldvalue ); 
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}