+{Page}CapacityPlanning ! 5 Initializations /02/09/2003 07:17:22.494 !---------------------------------------- +{Object.1} CapacityPlanning.[1]Initializations--->|DayAndLoadWatcher +{Duration} {nop.D}Duration={1} -{Duration} -{Object.1} CapacityPlanning.[1]Initializations--->|DayAndLoadWatcher !---------------------------------------- +{Object.2} CapacityPlanning.[2]Results +{Trans} WRITE(&R.ResultsFile,"(I4,8I10)")&M.Day,&B.BeginInv,&B.DailyArrivals, & &B.InQueue,&B.DailyCapacity,&B.EndInv,&B.WinCapforNewArr,&B.MaxViolations, & &B.TotViolations !Pass response back to Optimization module &D.MaxViolations = &B.MaxViolations CALL OptimizationResponse(&B.DailyCapacity,&D.MaxViolations,"Results: ") -{Trans} -{Object.2} CapacityPlanning.[2]Results !---------------------------------------- +{Object.3} CapacityPlanning.[3]ReturnsInQueue +{Trans} {nop.P}Trans:{&B.BeginInv = &B.EndInv}... &B.InQueue = &B.BeginInv + &B.DailyArrivals -{Trans} -{Object.3} CapacityPlanning.[3]ReturnsInQueue !---------------------------------------- +{Object.4} CapacityPlanning.[4]Ending inventory +{Trans} {nop.P}Trans:{&B.EndInv = MaxF(&B.InQueue - &B.DailyCapacity, 0_big)}... !There will be leftover returns at end of day only if daily capacity ... !is less than the number of returns waiting to be processed. Daily ... !capacity can be treated as a variable which depends on staff overtime, ... !etc. to make the model more comprehensive. !--- !Beginning inv needs to be carreid by calc thread to Results node, since... !&B.BeginInv may be changed by logic elsewhere in the model before this... !entity/calculation thread reaches the Results node. @B.BeginInv = &B.BeginInv -{Trans} -{Object.4} CapacityPlanning.[4]Ending inventory !---------------------------------------- +{Object.5} CapacityPlanning.[5]Initializations INTEGER:: intIOerr +{Trans} &M.DayLimit = 26 * 7 !Number of weeks * days per week. Could formulate... !as work days per week and treat each week as having only 5 days, but by... !setting a week to be made up of 7 days makes it possible to easily ... !expand the problem to accommodate work during weekends &T.WorkDaysPerWeek = 5. &M.ResponseWindow = 17 !days !---------------------------------------- CALL OpenTableFile(21,WithPath("tables.HTM")) CALL GetTable(21,{Table.D}TaxReturns,regRowLo=0) CLOSE(21) !---------------------------------------- !This is an example of table index having a row value less than 1 &B.DailyCapacity = {t.D}TaxReturns(0,2) !Control/decision variable !---------------------------------------- WRITE(9,*)"1:&B.DailyCapacity",&B.DailyCapacity CALL OptimizationStimulus(&B.DailyCapacity) !Goalseek stimulus WRITE(9,*)"2:&B.DailyCapacity",&B.DailyCapacity !&B.DailyCapacity=&D.DailyCapacity &B.WindowCapacity = &B.DailyCapacity * &M.ResponseWindow &B.WeeklyLoad = {t.D}TaxReturns(1,2) !To ensure that &B.WeeklyLoad is not undefined &B.DailyArrivals = &B.WeeklyLoad / &T.WorkDaysPerWeek !@B.DailyArrivals = &B.DailyArrivals !---------------------------------------- &M.Day = 0 &M.Week = 0 &T.DayOfWeek = 0 &B.BeginInv = 0 &B.EndInv = 0 &B.TotViolations = 0 !---------------------------------------- &9.DayOfWeek = " " &B.InQueue = 0 &R.ResultsFile = 0 &B.Violations = 0 &B.MaxViolations = 1-HUGE(&B.MaxViolations) WRITE(9,*)"&B.MaxViolations",&B.MaxViolations &B.WinCapforNewArr = 0 &L.WorkDay = .FALSE. @B.BeginInv = 0 !---------------------------------------- &R.ResultsFile = 22 !Write top of Results file !---------------------------------------- IF($L.FirstCall) & OPEN(&R.ResultsFile,FILE=WithPath("ResultsP3.TXT"),ACTION="WRITE") !---------------------------------------- WRITE(&R.ResultsFile,'(/A)')"IRS Daily Tax Return Processing " & //"Capacity Analysis" WRITE(&R.ResultsFile,'(A)')"--------------------------------" & //"-----------------" WRITE(&R.ResultsFile,*) WRITE(&R.ResultsFile,*)"Daily processing capacity:",&B.DailyCapacity, & "returns" -{Trans} +{SignalTarget} {nop.P}SignalTarg:{{Signal.6}} -{SignalTarget} -{Object.5} CapacityPlanning.[5]Initializations !---------------------------------------- +{Object.6} CapacityPlanning.[6]Ending inventory-->>|ReturnsInQueue +{Duration} {nop.D}Duration={1} -{Duration} -{Object.6} CapacityPlanning.[6]Ending inventory-->>|ReturnsInQueue !---------------------------------------- +{Object.7} CapacityPlanning.[7]ReturnsInQueue--->|Ending inventory +{Branch} {nop.L}Branch={&M.Day < &M.DayLimit} -{Branch} -{Object.7} CapacityPlanning.[7]ReturnsInQueue--->|Ending inventory !---------------------------------------- +{Object.10} CapacityPlanning.[10]DayAndLoadWatcher +{Trans} &M.Day = &M.Day + 1 &9.DayOfWeek=strfNxtDayOfWeek(&T.DayOfWeek,&M.Week) IF(&T.DayOfWeek==1)THEN !Calculate daily workload during new week !This logic can be expanded to make daily demands a random variate... !from a probability distribution to support Monte Carlo simulation &B.WeeklyLoad = {t.D}TaxReturns(&M.Week,2) !Returns are in 2nd column &B.DailyArrivals = &B.WeeklyLoad / &T.WorkDaysPerWeek WRITE(&R.ResultsFile,*) !Column titles WRITE(&R.ResultsFile,"(A4,8A10)")"Day","PrevInv","DailyArr", & "InQueue","DailyCap","EndInv","Wcap4New","Viols","TotViols" ENDIF !This logic can be expanded into a procedure to look up holidays &L.WorkDay = &T.DayOfWeek /= 1 .AND. &T.DayOfWeek /= 7 -{Trans} -{Object.10} CapacityPlanning.[10]DayAndLoadWatcher !---------------------------------------- +{Object.11} CapacityPlanning.[11]DayAndLoadWatcher--->|DayAndLoadWatcher +{Branch} {nop.L}Branch={&M.Day < &M.DayLimit} -{Branch} +{Duration} {nop.D}Duration={1}... !This arc is part of a cycle with a period of 1 day -{Duration} -{Object.11} CapacityPlanning.[11]DayAndLoadWatcher--->|DayAndLoadWatcher !---------------------------------------- +{Object.12} CapacityPlanning.[12]DayAndLoadWatcher-->>|ReturnsInQueue +{Branch} {nop.L}Branch={&L.WorkDay} -{Branch} -{Object.12} CapacityPlanning.[12]DayAndLoadWatcher-->>|ReturnsInQueue !---------------------------------------- +{Object.13} CapacityPlanning.[13]WindowMisses +{Trans} {nop.P}Trans:{&B.Violations = MaxF(&B.DailyArrivals - &B.WinCapforNewArr,0_big)}... &B.MaxViolations = MaxF(&B.MaxViolations,&B.DailyArrivals - &B.WinCapforNewArr) -{Trans} -{Object.13} CapacityPlanning.[13]WindowMisses !---------------------------------------- +{Object.15} CapacityPlanning.[15]RemWinCapForNewArr +{Trans} {nop.P}Trans:{&B.WinCapforNewArr = MaxF(&B.WindowCapacity - &B.BeginInv,0_big)} -{Trans} -{Object.15} CapacityPlanning.[15]RemWinCapForNewArr !---------------------------------------- +{Object.17} CapacityPlanning.[17]TotalViolations +{Trans} {nop.P}Trans:{&B.TotViolations = &B.TotViolations + &B.Violations} -{Trans} -{Object.17} CapacityPlanning.[17]TotalViolations -{Page}CapacityPlanning //////////////////////////////////////////