Exemple #1
0
        public void TestTimeSeriesMonitorAutoUpdate()
        {
            var env  = new Simulation();
            var stat = new TimeSeriesMonitor(env);

            env.Process(StatProcess(env, stat));
            env.Run();

            stat.Reset();
            env.Process(StatProcess(env, stat));
            env.Run();
        }
Exemple #2
0
        private IEnumerable <Event> StatProcess(Simulation env, TimeSeriesMonitor stat)
        {
            stat.UpdateTo(3);
            yield return(env.TimeoutD(1));

            stat.UpdateTo(1);
            yield return(env.TimeoutD(1));

            Assert.Equal(3, stat.Max);
            Assert.Equal(2, stat.Mean);
            Assert.Equal(1, stat.Current);
            Assert.Equal(4, stat.Area);
            Assert.Equal(2, stat.TotalTimeD);
            Assert.Equal(1, stat.Variance);
        }
Exemple #3
0
 public HotstorageSimulation(Settings set)
 {
     settings             = set;
     sim                  = new PseudoRealtimeSimulation(DateTime.UtcNow, settings.Seed);
     ServiceLevel         = new SampleMonitor("SerivceLevel");
     LeadTimes            = new SampleMonitor("LeadTimes");
     Tardiness            = new SampleMonitor("Tardiness");
     BufferUtilization    = new TimeSeriesMonitor(sim, "BufferUtilization");
     CraneUtilization     = new TimeSeriesMonitor(sim, "CraneUtilization");
     HandoverUtilization  = new TimeSeriesMonitor(sim, "HandoverUtilization");
     UpstreamUtilization  = new TimeSeriesMonitor(sim, "UpstreamUtilization");
     lastScheduleSequence = int.MinValue;
     World                = new World {
         Production = new Stack {
             Id = 0, MaxHeight = settings.ProductionMaxHeight, BottomToTop = new List <Block>()
         },
         Buffers = Enumerable.Range(1, settings.BufferCount).Select(x => new Stack {
             Id = x, MaxHeight = settings.BufferMaxHeight, BottomToTop = new List <Block>()
         }).ToList(),
         Handover = new Handover()
         {
             Id = settings.BufferCount + 1, Ready = false
         },
         Now   = new TimeStamp(),
         Crane = new Crane {
             Id = 0, LocationId = 0, Schedule = new CraneSchedule()
             {
                 Moves = new List <CraneMove>()
             }, Load = null, GirderPosition = 0.0, HoistPosition = 1.0
         },
         KPIs            = new Performance(),
         ObservationData = new Uncertainties(),
         InvalidMoves    = new List <CraneMove>()
     };
     crane = new Resource(sim, capacity: 1)
     {
         Utilization = CraneUtilization
     };
     handover = new Resource(sim, capacity: 1)
     {
         Utilization = HandoverUtilization
     };
     upstream = new Resource(sim, capacity: 1)
     {
         Utilization = UpstreamUtilization
     };
     InitializeWorldState();
 }
Exemple #4
0
 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));
 }
Exemple #5
0
        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));;
        }
Exemple #6
0
        public void TestTimeSeriesMonitor(double[] times, double[] values, double min, double max,
                                          double mean, double variance, double area, double median)
        {
            var env  = new Simulation();
            var stat = new TimeSeriesMonitor(env, collect: false)
            {
                Active = false
            };
            var stat_collect = new TimeSeriesMonitor(env, collect: true)
            {
                Active = false
            };
            var count = 0;

            foreach (var v in times.Zip(values, Tuple.Create))
            {
                if (v.Item1 > 0)
                {
                    env.RunD(v.Item1);
                }
                if (count == 3)
                {
                    stat.Active = stat_collect.Active = true;
                }
                stat.UpdateTo(v.Item2);
                stat_collect.UpdateTo(v.Item2);
                if (count == times.Length - 3)
                {
                    stat.Active = stat_collect.Active = false;
                }
                count++;
            }
            Assert.Equal(min, stat.Min);
            Assert.Equal(max, stat.Max);
            Assert.Equal(mean, stat.Mean, 14);
            Assert.Equal(variance, stat.Variance, 14);
            Assert.Equal(area, stat.Area);
            Assert.True(double.IsNaN(stat.GetMedian()));
            Assert.True(double.IsNaN(stat.GetPercentile(0.25)));
            Assert.True(double.IsNaN(stat.GetPercentile(0.75)));
            Assert.Empty(stat.Series);
            Assert.Equal(min, stat_collect.Min);
            Assert.Equal(max, stat_collect.Max);
            Assert.Equal(mean, stat_collect.Mean, 14);
            Assert.Equal(variance, stat_collect.Variance, 14);
            Assert.Equal(area, stat_collect.Area);
            Assert.Equal(median, stat_collect.GetMedian());
            Assert.True(stat_collect.GetPercentile(0.25) <= median);
            Assert.True(stat_collect.GetPercentile(0.75) >= median);
            Assert.Equal(values.Length - 5, stat_collect.Series.Count());

            stat.Reset();
            Assert.False(stat.Active);
            stat_collect.Reset();
            Assert.False(stat_collect.Active);
            count = 0;
            foreach (var v in times.Zip(values, Tuple.Create))
            {
                if (v.Item1 > 0)
                {
                    env.RunD(v.Item1);
                }
                if (count == 3)
                {
                    stat.Active = stat_collect.Active = true;
                }
                stat.UpdateTo(v.Item2);
                stat_collect.UpdateTo(v.Item2);
                if (count == times.Length - 3)
                {
                    stat.Active = stat_collect.Active = false;
                }
                count++;
            }
            Assert.Equal(min, stat.Min);
            Assert.Equal(max, stat.Max);
            Assert.Equal(mean, stat.Mean, 14);
            Assert.Equal(variance, stat.Variance, 14);
            Assert.Equal(area, stat.Area);
            Assert.True(double.IsNaN(stat.GetMedian()));
            Assert.True(double.IsNaN(stat.GetPercentile(0.25)));
            Assert.True(double.IsNaN(stat.GetPercentile(0.75)));
            Assert.Empty(stat.Series);
            Assert.Equal(min, stat_collect.Min);
            Assert.Equal(max, stat_collect.Max);
            Assert.Equal(mean, stat_collect.Mean, 14);
            Assert.Equal(variance, stat_collect.Variance, 14);
            Assert.Equal(area, stat_collect.Area);
            Assert.Equal(median, stat_collect.GetMedian());
            Assert.True(stat_collect.GetPercentile(0.25) <= median);
            Assert.True(stat_collect.GetPercentile(0.75) >= median);
            Assert.Equal(values.Length - 5, stat_collect.Series.Count());
        }