コード例 #1
0
        private IEnumerable <Event> WorldUpdates()
        {
            var updateInterval = 1000L; // must be > 1

            while (true)
            {
                // uncomment if you prefer world updates only for changes
                //if (_worldChanged) {
                if (World.PolicyTime > 0)
                {
                    // Simulate that the policy took a certain time to calculate
                    World.PolicyTime = Math.Max(World.PolicyTime - updateInterval, 0L); // milliseconds
                }

                World.Now = Now;
                World.KPIs.CraneUtilizationMean    = CraneUtilization.Mean;
                World.KPIs.HandoverUtilizationMean = HandoverUtilization.Mean;
                World.KPIs.UpstreamUtilizationMean = UpstreamUtilization.Mean;
                World.KPIs.BlockedArrivalTime      = (1 - UpstreamUtilization.Mean) * (sim.Now - sim.StartDate).TotalSeconds;


                if (World.PolicyTime == 0)
                {
                    var sw       = Stopwatch.StartNew();
                    var schedule = policy?.GetSchedule(World);
                    sw.Stop();
                    World.PolicyTime = SimulateAsync ? sw.ElapsedMilliseconds : 1L;

                    if (schedule != null)
                    {
                        sim.Process(Crane(schedule, World.PolicyTime));
                    }
                }
                WorldChanged?.Invoke(this, EventArgs.Empty);
                World.InvalidMoves.Clear();
                _worldChanged = false;
                //}
                yield return(sim.Timeout(TimeSpan.FromMilliseconds(updateInterval)));
            }
        }