public void Simulate(int rseed = 42) { completedOrders = 0; env = new Simulation(randomSeed: rseed); env.Log("== Kanban controlled production system =="); kanban = new Resource(env, capacity: 15); server = new Resource(env, capacity: 1); // In this sample stockStat is tracked manually in the process // it would also possible to track kanban's utilization and obtain // the stock as capacity * (1 - util.mean) stockStat = new TimeSeriesMonitor(env, name: "Kanbans in stock", collect: true); env.Process(Source()); env.Run(TimeSpan.FromDays(180)); Console.WriteLine("Kanbans in stock: {0} ; {1:F1}±{2:F1} ; {3} (Min;Mean±StdDev;Max) kanbans ", stockStat.Min, stockStat.Mean, stockStat.StdDev, stockStat.Max); Console.WriteLine("Produced kanbans: {0:N0}", completedOrders); Console.WriteLine(stockStat.Summarize(binWidth: 1)); }
public void Simulate(int repetitions = 5) { var lambda = 1 / OrderArrivalTime.TotalDays; var mu = 1 / ProcessingTime.TotalDays; var rho = lambda / mu; var analyticWIP = rho / (1 - rho); var analyticLeadtime = 1 / (mu - lambda); var analyticWaitingtime = rho / (mu - lambda); var env = new Simulation(randomSeed: 1, defaultStep: TimeSpan.FromDays(1)); var utilization = new TimeSeriesMonitor(env, name: "Utilization"); var wip = new TimeSeriesMonitor(env, name: "WIP", collect: true); var leadtime = new SampleMonitor(name: "Lead time", collect: true); var waitingtime = new SampleMonitor(name: "Waiting time", collect: true); env.Log("Analytical results of this system:"); env.Log("Time\tUtilization.Mean\tWIP.Mean\tLeadtime.Mean\tWaitingTime.Mean"); env.Log("{4}\t{0}\t{1}\t{2}\t{3}", rho, analyticWIP, analyticLeadtime, analyticWaitingtime, double.PositiveInfinity); env.Log(""); // example to create a running report of these measures every simulated week //var report = Report.CreateBuilder(env) // .Add("Utilization", utilization, Report.Measures.Mean | Report.Measures.StdDev) // .Add("WIP", wip, Report.Measures.Min | Report.Measures.Mean | Report.Measures.Max) // .Add("Leadtime", leadtime, Report.Measures.Min | Report.Measures.Mean | Report.Measures.Max) // .Add("WaitingTime", waitingtime, Report.Measures.Min | Report.Measures.Mean | Report.Measures.Max) // .SetOutput(env.Logger) // use a "new StreamWriter("report.csv")" to direct to a file // .SetSeparator("\t") // .SetPeriodicUpdate(TimeSpan.FromDays(7), withHeaders: true) // .Build(); var summary = Report.CreateBuilder(env) .Add("Utilization", utilization, Report.Measures.Mean) .Add("WIP", wip, Report.Measures.Mean) .Add("Leadtime", leadtime, Report.Measures.Mean) .Add("WaitingTime", waitingtime, Report.Measures.Mean) .SetOutput(env.Logger) .SetSeparator("\t") .SetFinalUpdate(withHeaders: false) // creates a summary of the means at the end .SetTimeAPI(useDApi: true) .Build(); env.Log("Simulated results of this system (" + repetitions + " repetitions):"); env.Log(""); summary.WriteHeader(); // write the header just once for (var i = 0; i < repetitions; i++) { env.Reset(i + 1); // reset environment utilization.Reset(); // reset monitors wip.Reset(); leadtime.Reset(); waitingtime.Reset(); var server = new Resource(env, capacity: 1) { Utilization = utilization, WIP = wip, LeadTime = leadtime, WaitingTime = waitingtime, }; env.Process(Source(env, server)); env.Process(HandleWarmup(env, TimeSpan.FromDays(32), utilization, wip, leadtime, waitingtime)); env.Run(TimeSpan.FromDays(365)); } env.Log(""); env.Log("Detailed results from the last run:"); env.Log(""); env.Log(utilization.Summarize()); env.Log(wip.Summarize(maxBins: 10, binWidth: 2)); env.Log(leadtime.Summarize(maxBins: 10, binWidth: 5 / 1440.0)); env.Log(waitingtime.Summarize(maxBins: 10, binWidth: 4 / 1440.0));; }