private IEnumerable <Event> EndWarmupPhase(double time) { yield return(_env.TimeoutD(time)); for (var b = 0; b < Backlog.Length; b++) { Backlog[b].Reset(Backlog[b].Current); } SystemUtilization.Reset(SystemUtilization.Current); for (var u = 0; u < StationUtilization.Length; u++) { StationUtilization[u].Reset(StationUtilization[u].Current); } WIPInventory.Reset(WIPInventory.Current); FGIInventory.Reset(FGIInventory.Current); WorkerUtilization.Reset(WorkerUtilization.Current); for (var w = 0; w < WorkerUtilizations.Length; w++) { WorkerUtilizations[w].Reset(WorkerUtilizations[w].Current); } Backorders.Reset(Backorders.Current); WIPLeadTime.Reset(); FGILeadTime.Reset(); Tardiness.Reset(); ServiceLevel.Reset(); }
private IEnumerable <Event> Job(int[] route, double due) { var start = _env.NowD; var flow = _env.Process(JobFlow(route)); // wait until job is finished yield return(flow | _env.TimeoutD(due - start)); if (flow.IsAlive) { Backorders.Increase(); _backorderedJobs.Add(flow, Tuple.Create(start, due)); yield return(flow); _backorderedJobs.Remove(flow); } WIPLeadTime.Add(_env.NowD - start); var tardiness = Math.Max(_env.NowD - due, 0); Tardiness.Add(tardiness); if (_env.NowD < due) { ServiceLevel.Add(1); FGIInventory.Increase(); var fgiDelay = due - _env.NowD; yield return(_env.TimeoutD(fgiDelay)); // wait until due date to deliver order FGIInventory.Decrease(); FGILeadTime.Add(fgiDelay); } else { ServiceLevel.Add(0); FGILeadTime.Add(0); Backorders.Decrease(); } }