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(); } }