Ejemplo n.º 1
0
                                                       } }                                           // event adapter

        /**********************************************************/
        /* All internal events shall be private,                  */
        /* and inherite from InternalEvent as defined above       */
        /**********************************************************/
        //private class InitEvent : InternalEvent
        //{
        //    public override void Invoke()
        //    {
        //        Schedule(This.Queueing1.Enqueue(), TimeSpan.FromMinutes(5));
        //    }
        //}

        //private class FinishEvent : InternalEvent
        //{
        //    public override void Invoke()
        //    {
        //        This.TotalNCompleted++;
        //    }
        //}
        #endregion

        #region Input Events - Getters
        /***************************************************************/
        /* Methods returning an InternalEvent as O2DESNet.Event,       */
        /* with parameters for the objects to be passed in.            */
        /* Note that the InternalEvent shall always carry This = this. */
        /***************************************************************/
        //public Event Input(TLoad load) { return new InternalEvent { This = this, Load = load }; }
        #endregion

        #region Output Events - Reference to Getters
        /***********************************************************************/
        /* List of functions that maps outgoing objects to an external event.  */
        /* Note that the mapping is specified only in external structure.      */
        /***********************************************************************/
        //public List<Func<TLoad, Event>> OnOutput { get; private set; } = new List<Func<TLoad, Event>>();
        #endregion

        public Modular_TandemQ(Statics config, int seed, string tag = null) : base(config, seed, tag)
        {
            // 子模块(动态属性)的初始化
            Generator = new Generator(Config.Generator, DefaultRS.Next());
            Queueing1 = new Queueing(Config.Queueing1, DefaultRS.Next());
            Server1   = new Server(Config.Server1, DefaultRS.Next());
            Queueing2 = new Queueing(Config.Queueing2, DefaultRS.Next());
            Server2   = new Server(Config.Server2, DefaultRS.Next());

            // 连接子模块之间的输出和输入事件
            Generator.OnArrive.Add(Queueing1.Enqueue);
            //Generator.OnArrive.Add(() => Queueing.Enqueue());
            Queueing1.OnDequeue.Add(Server1.Start);
            Server1.OnDepart.Add(Queueing2.Enqueue);
            Queueing2.OnDequeue.Add(Server2.Start);

            Server2.OnStateChg.Add(() => Queueing2.UpdToDequeue(Server2.Vacancy > 0));
            Queueing2.OnStateChg.Add(() => Server1.UpdToDepart(Queueing2.Vacancy > 0));
            Server1.OnStateChg.Add(() => Queueing1.UpdToDequeue(Server1.Vacancy > 0));
            //Server1.OnDepart.Add(() => new FinishEvent { This = this });

            // 初始化事件
            InitEvents.AddRange(Generator.InitEvents);
            //InitEvents.Add(new InitEvent { This = this });
        }
Ejemplo n.º 2
0
        public MMnQueue_Modular(double hourlyArrivalRate, double hourlyServiceRate, int nServers, int seed = 0)
            : base(seed)
        {
            HourlyArrivalRate = hourlyArrivalRate;
            HourlyServiceRate = hourlyServiceRate;

            Generator = AddChild(new Generator(new Generator.Statics
            {
                InterArrivalTime = rs => Exponential.Sample(rs, TimeSpan.FromHours(1 / HourlyArrivalRate))
            }, DefaultRS.Next()));

            Queue = AddChild(new Queue(double.PositiveInfinity, DefaultRS.Next()));

            Server = AddChild(new Server(new Server.Statics
            {
                Capacity    = nServers,
                ServiceTime = (rs, load) => Exponential.Sample(rs, TimeSpan.FromHours(1 / HourlyServiceRate)),
            }, DefaultRS.Next()));

            Generator.OnArrive += () => Queue.RqstEnqueue(new Load());
            Generator.OnArrive += Arrive;

            Queue.OnEnqueued += Server.RqstStart;
            Server.OnStarted += Queue.Dequeue;

            Server.OnReadyToDepart += Server.Depart;
            Server.OnReadyToDepart += load => Depart();

            HC_InSystem = AddHourCounter();

            /// Initial event
            Generator.Start();
        }
Ejemplo n.º 3
0
 public PingPongGame(Statics config, int seed = 0) : base(seed)
 {
     Config          = config;
     Player1         = AddChild(new PingPongPlayer(Config.Player1, DefaultRS.Next()));
     Player2         = AddChild(new PingPongPlayer(Config.Player2, DefaultRS.Next()));
     Player1.OnSend += Player2.Receive;
     Player2.OnSend += Player1.Receive;
     Schedule(Player1.Receive);
 }
Ejemplo n.º 4
0
 public MMcQueue_Pull(Statics config, int seed = 0) : base(seed)
 {
     Config                = config;
     Generator             = AddChild(new Generator(Config.HourlyArrivalRate, DefaultRS.Next()));
     Queue                 = AddChild(new Queue());
     Server                = AddChild(new Server(Config.Capacity, Config.HourlyServiceRate, DefaultRS.Next()));
     Generator.OnGenerate += Queue.Enqueue;
     Generator.OnGenerate += Server.RequestToStart;
     Server.OnStart       += Queue.Dequeue;
 }
Ejemplo n.º 5
0
            //internal TLoad Load { get; set; }
            //internal int ProcedureIndex { get; set; }
            public override void Invoke()
            {
                var load = (TLoad)(object)This.TotalNLoads++;
                var pIdx = DefaultRS.Next(Config.Procedures.Count);

                This.AllLoads.Add(load);
                This.LoadProcedureStepIndex[load] = new Tuple <int, int>(pIdx, -1);
                Execute(new AtmptMoveEvent
                {
                    Load           = load,
                    ProcedureIndex = pIdx,
                    StepIndex      = 0,
                });
                Schedule(new ArriveEvent(), Exponential.Sample(DefaultRS, TimeSpan.FromMinutes(10)));
            }
Ejemplo n.º 6
0
        /// <param name="arrRate">Hour arrival rate to the system</param>
        /// <param name="svcRate1">Hourly service rate of Server 1</param>
        /// <param name="svcRate2">Hourly service rate of Server 2</param>
        /// <param name="bufferQSize">Buffer queue (Queue 2) capacity</param>
        public TandemQueue(double arrRate, double svcRate1, double svcRate2, int bufferQSize, int seed = 0)
            : base(seed)
        {
            HourlyArrivalRate  = arrRate;
            HourlyServiceRate1 = svcRate1;
            HourlyServiceRate2 = svcRate2;

            Generator = AddChild(new Generator(new Generator.Statics
            {
                InterArrivalTime = rs => Exponential.Sample(rs, TimeSpan.FromHours(1 / HourlyArrivalRate))
            }, DefaultRS.Next()));

            Queue1 = AddChild(new Queue(double.PositiveInfinity, DefaultRS.Next(), id: "Queue1"));

            Server1 = AddChild(new Server(new Server.Statics
            {
                Capacity    = 1,
                ServiceTime = (rs, load) => Exponential.Sample(rs, TimeSpan.FromHours(1 / HourlyServiceRate1)),
            }, DefaultRS.Next(), id: "Server1"));

            Queue2 = AddChild(new Queue(bufferQSize, DefaultRS.Next(), id: "Queue2"));

            Server2 = AddChild(new Server(new Server.Statics
            {
                Capacity    = 1,
                ServiceTime = (rs, load) => Exponential.Sample(rs, TimeSpan.FromHours(1 / HourlyServiceRate2)),
            }, DefaultRS.Next(), id: "Server2"));

            Generator.OnArrive += () => Queue1.RqstEnqueue(new Load());
            Generator.OnArrive += Arrive;

            Queue1.OnEnqueued += Server1.RqstStart;
            Server1.OnStarted += Queue1.Dequeue;

            Server1.OnReadyToDepart += Queue2.RqstEnqueue;
            Queue2.OnEnqueued       += Server1.Depart;

            Queue2.OnEnqueued += Server2.RqstStart;
            Server2.OnStarted += Queue2.Dequeue;

            Server2.OnReadyToDepart += Server2.Depart;
            Server2.OnReadyToDepart += load => Depart();

            HcInSystem = AddHourCounter();

            /// Initial event
            Generator.Start();
        }
Ejemplo n.º 7
0
                                                       } }                                        // event adapter

        /**********************************************************/
        /* All internal events shall be private,                  */
        /* and inherite from InternalEvent as defined above       */
        /**********************************************************/
        //private class InitEvent : InternalEvent
        //{
        //    public override void Invoke()
        //    {
        //        throw new NotImplementedException();
        //    }
        //}
        #endregion

        #region Input Events - Getters
        /***************************************************************/
        /* Methods returning an InternalEvent as O2DESNet.Event,       */
        /* with parameters for the objects to be passed in.            */
        /* Note that the InternalEvent shall always carry This = this. */
        /***************************************************************/
        //public Event Input(TLoad load) { return new InternalEvent { This = this, Load = load }; }
        #endregion

        #region Output Events - Reference to Getters
        /***********************************************************************/
        /* List of functions that maps outgoing objects to an external event.  */
        /* Note that the mapping is specified only in external structure.      */
        /***********************************************************************/
        //public List<Func<TLoad, Event>> OnOutput { get; private set; } = new List<Func<TLoad, Event>>();
        #endregion

        public Modular_MMnQ(Statics config, int seed, string tag = null) : base(config, seed, tag)
        {
            // 子模块(动态属性)的初始化
            Generator = new Generator(Config.Generator, DefaultRS.Next());
            Queueing  = new Queueing(Config.Queueing, DefaultRS.Next());
            Server    = new Server(Config.Server, DefaultRS.Next());

            // 连接子模块之间的输出和输入事件
            Generator.OnArrive.Add(Queueing.Enqueue);
            //Generator.OnArrive.Add(() => Queueing.Enqueue());
            Queueing.OnDequeue.Add(Server.Start);
            Server.OnStateChg.Add(() => Queueing.UpdToDequeue(Server.Vacancy > 0));

            // 初始化事件
            InitEvents.AddRange(Generator.InitEvents);
        }
Ejemplo n.º 8
0
 public TademQueue_Push(Statics config, int seed = 0) : base(seed)
 {
     Config    = config;
     Generator = AddChild(new Generator(Config.HourlyArrivalRate, DefaultRS.Next()));
     Queue1    = AddChild(new Queue());
     Server1   = AddChild(new Server(Config.Capacity, Config.HourlyServiceRate, DefaultRS.Next()));
     Queue2    = AddChild(new Queue());
     Server2   = AddChild(new Server(Config.Capacity, Config.HourlyServiceRate, DefaultRS.Next()));
     /// Conenction for 1st Queue & Server
     Generator.OnGenerate          += Queue1.Enqueue;
     Queue1.OnDequeue              += Server1.Start;
     Server1.OnChangeAccessibility += Queue1.UpdateToDequeue;
     /// Connection for 2nd Queue & Server
     Server1.OnFinish += Queue2.Enqueue;
     Queue2.OnDequeue += Server2.Start;
     Server2.OnChangeAccessibility += Queue2.UpdateToDequeue;
 }
Ejemplo n.º 9
0
 public TandemQueue_Pull(Statics config, int seed = 0) : base(seed)
 {
     Config    = config;
     Generator = AddChild(new Generator(Config.HourlyArrivalRate, DefaultRS.Next()));
     Queue1    = AddChild(new Queue());
     Server1   = AddChild(new Server(Config.Capacity, Config.HourlyServiceRate, DefaultRS.Next()));
     Queue2    = AddChild(new Queue());
     Server2   = AddChild(new Server(Config.Capacity, Config.HourlyServiceRate, DefaultRS.Next()));
     /// Connect for 1st Queue & Server
     Generator.OnGenerate += Queue1.Enqueue;
     Generator.OnGenerate += Server1.RequestToStart;
     Server1.OnStart      += Queue1.Dequeue;
     /// Connect for 2nd Queue & Server
     Server1.OnFinish += Queue2.Enqueue;
     Server1.OnFinish += Server2.RequestToStart;
     Server2.OnStart  += Queue2.Dequeue;
 }
Ejemplo n.º 10
0
        public Network(Statics config, int seed, string tag = null) : base(config, seed, tag)
        {
            Name    = "Network";
            Display = true;

            for (int i = 0; i < Config.NNodes; i++)
            {
                for (int j = 0; j < Config.NNodes; j++)
                {
                    if (i != j && Config.DemandRates[i, j] > 0)
                    {
                        int o = i, d = j;
                        var g = new Generator <Order>(
                            new Generator <Order> .Statics
                        {
                            Create = rs => new Order(new Order.Statics
                            {
                                Origin      = o,
                                Destination = d,
                            }, rs.Next()),
                            InterArrivalTime = rs => TimeSpan.FromDays(
                                Exponential.Sample(rs, 1 / Config.DemandRates[o, d])),
                            SkipFirst = true,
                        }, DefaultRS.Next());
                        g.OnArrive.Add(order => new DemandArriveEvent {
                            This = this, Order = order
                        });
                        Generators.Add(new Tuple <int, int>(i, j), g);
                        InitEvents.Add(g.Start());
                    }
                }
            }
            Transporters.AddRange(Enumerable.Range(0, Config.NTransporters)
                                  .Select(i => new Transporter(new Transporter.Statics(), DefaultRS.Next())
            {
                Display = Display,
                Tag     = "Transporter#" + i,
            }));
            foreach (var t in Transporters)
            {
                t.OnFinishTransport.Add(order => new DeliverEvent {
                    This = this, Order = order
                });
            }
            InitEvents.AddRange(Transporters.Select(t => t.Init(this)));
        }
 public ConstrainedTandemQueue_Pull(Statics config, int seed = 0) : base(seed)
 {
     Config    = config;
     Generator = AddChild(new Generator(Config.HourlyArrivalRate, DefaultRS.Next()));
     Queue1    = AddChild(new Queue(Config.QueueCapacity));
     Server1   = AddChild(new Server(Config.ServerCapacity, Config.HourlyServiceRate, DefaultRS.Next()));
     Queue2    = AddChild(new Queue(Config.QueueCapacity));
     Server2   = AddChild(new Server(Config.ServerCapacity, Config.HourlyServiceRate, DefaultRS.Next()));
     /// Connect for 1st Queue & Server
     Generator.OnGenerate += Queue1.RequestToEnqueue;
     Generator.OnGenerate += Server1.RequestToStart;
     Server1.OnStart      += Queue1.Dequeue;
     /// Connect for 2nd Queue & Server
     Server1.OnReadyToFinish += Queue2.RequestToEnqueue;
     Server1.OnReadyToFinish += Server2.RequestToStart;
     Queue2.OnEnqueue        += Server1.Finish;
     Server2.OnStart         += Queue2.Dequeue;
     /// Enclose 2nd Server
     Server2.OnReadyToFinish += Server2.Finish;
 }
Ejemplo n.º 12
0
        /***************************************************************/
        /* Methods returning an InternalEvent as O2DESNet.Event,       */
        /* with parameters for the objects to be passed in.            */
        /* Note that the InternalEvent shall always carry This = this. */
        /***************************************************************/
        //public Event Input(TLoad load) { return new InternalEvent { This = this, Load = load }; }
        #endregion

        #region Output Events - Reference to Getters
        /***********************************************************************/
        /* List of functions that maps outgoing objects to an external event.  */
        /* Note that the mapping is specified only in external structure.      */
        /***********************************************************************/
        //public List<Func<TLoad, Event>> OnOutput { get; private set; } = new List<Func<TLoad, Event>>();
        #endregion

        public MultiServers(Statics config, int seed, string tag = null) : base(config, seed, tag)
        {
            int nTypes   = Config.HourlyArrivalRates.Length;
            int nServers = Config.HourlyServiceRates.GetLength(0);

            // 根据每一种类型客户的到达率创建随即发生器
            Generators = Enumerable.Range(0, nTypes)
                         .Select(type => new Generator <Customer>(
                                     new Generator <Customer> .Statics {
                Create           = rs => new Customer(type),
                InterArrivalTime = rs => TimeSpan.FromHours(
                    Exponential.Sample(rs, Config.HourlyArrivalRates[type])),
                SkipFirst = true
            }, DefaultRS.Next())).ToArray();
            // 创建服务器,并根据不同类型的客户设置服务事件
            Servers = Enumerable.Range(0, nServers)
                      .Select(i => new Server <Customer>(
                                  new Server <Customer> .Statics {
                Capacity    = Config.Capacities[i],
                ServiceTime = (cstm, rs) => TimeSpan.FromHours(
                    Exponential.Sample(rs, Config.HourlyServiceRates[i, cstm.Config.Type])),
            }, DefaultRS.Next())).ToArray();
            // 将发生器输出事件连接至内部事件
            foreach (var g in Generators)
            {
                g.OnArrive.Add(c => new ArriveEvent {
                    This = this, Customer = c
                });
            }
            // 将服务器输出事件连接至内部事件
            foreach (var s in Servers)
            {
                s.OnDepart.Add(c => new DepartEvent {
                    This = this, Customer = c
                });
            }
            // 初始化事件
            InitEvents.AddRange(Generators.Select(g => g.Start()));
        }
Ejemplo n.º 13
0
 public RCQsContext(Statics config, int seed = 0) : base(seed)
 {
     Config                   = config;
     _rcqModel                = AddChild(new RCQsModel(new RCQsModel.Statics(Config.Resources), DefaultRS.Next()));
     _rcqModel.OnStarted     += Start;
     _rcqModel.OnReadyToExit += _rcqModel.Exit;
 }
Ejemplo n.º 14
0
 public MMcQueue_Push(Statics config, int seed = 0) : base(seed)
 {
     Config                        = config;
     Generator                     = AddChild(new Generator(Config.HourlyArrivalRate, DefaultRS.Next()));
     Queue                         = AddChild(new Queue());
     Server                        = AddChild(new Server(Config.Capacity, Config.HourlyServiceRate, DefaultRS.Next()));
     Generator.OnGenerate         += Queue.Enqueue;
     Queue.OnDequeue              += Server.Start;
     Server.OnChangeAccessibility += Queue.UpdateToDequeue;
 }
Ejemplo n.º 15
0
 public override void Invoke()
 {
     This.Network     = Network;
     This.CurrentNode = DefaultRS.Next(Network.Config.NNodes);
 }