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(); }
public void Run() { _env.Process(EndWarmupPhase(WarmupTime)); _env.Process(Demand(route: new int[] { 0, 1, 2 })); _env.Process(Demand(route: new int[] { 0, 1, 3 })); _env.Process(Demand(route: new int[] { 4, 5, 6 })); _env.Process(Demand(route: new int[] { 4, 5, 7 })); _env.RunD(WarmupTime + ObservationTime); foreach (var job in _backorderedJobs) { ServiceLevel.Add(0); WIPLeadTime.Add(_env.NowD - job.Value.Item1); Tardiness.Add(_env.NowD - job.Value.Item2); } }
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(); } }