Ejemplo n.º 1
0
        } // end of Servers

        #endregion

        //--------------------------------------------------------------------------------------------------
        // Methods
        //--------------------------------------------------------------------------------------------------

        #region PerformCustomRules

        /// <summary>
        /// Custom rule set, basically incoming clients are assinged to queues with minimum length
        /// and clients are selected from front of queues by FIFO (so FIFO within a single queue and FIFO
        /// of queue fronts)
        /// </summary>
        /// <param name="time">Time rules are executed</param>
        /// <param name="simEngine">SimEngine responsible for simulation execution</param>
        /// <returns></returns>
        protected override bool PerformCustomRules(DateTime time, ISimulationEngine simEngine)
        {
            #region PlacedInQueue

            List <RequestQueing> waitInQueueRequests = RAEL.Where(p => p.Activity == "WaitInQueue").Cast <RequestQueing>().ToList();

            foreach (RequestQueing request in waitInQueueRequests)
            {
                // determine the smallest QueueLength
                int minQueueLength = Queues.Select(p => p.HoldedEntities.Count).Aggregate((curmin, x) => ((x) < curmin ? x : curmin));

                // select first queue with minimum length
                EntityQueue queue = Queues.Where(p => p.HoldedEntities.Count == minQueueLength).First();
                queue.HoldedEntities.Add(request.Client);

                RemoveRequest(request);
                RequestQueing newReq = new RequestQueing("GetServed", request.Client, time);
                newReq.QueueAssigned = queue;
                AddRequest(newReq);
            } // end foreach

            #endregion

            #region GetServerd

            List <RequestQueing> getServedRequests = RAEL.Where(p => p.Activity == "GetServed").Cast <RequestQueing>().ToList();

            while (getServedRequests.Count > 0 && Servers.Where(p => p.IsIdle).Count() > 0)
            {
                RequestQueing earliestRequest = getServedRequests.Aggregate((curmin, x) => (curmin == null || (x.TimeRequested) < curmin.TimeRequested ? x : curmin));

                ActivityGetServed newService = new ActivityGetServed(this, earliestRequest.Client, Servers.Where(p => p.IsIdle).First());
                newService.StartEvent.Trigger(time, simEngine);

                RemoveRequest(earliestRequest);
                earliestRequest.QueueAssigned.HoldedEntities.Remove(earliestRequest.Client);

                getServedRequests.Remove(earliestRequest);
            } // end while

            #endregion

            return(false);
        } // end of PerformCustomRules
Ejemplo n.º 2
0
        //--------------------------------------------------------------------------------------------------
        // Constructor
        //--------------------------------------------------------------------------------------------------

        #region Constructor

        /// <summary>
        /// Basic constructor, entities are added to model
        /// </summary>
        /// <param name="name">Name of control</param>
        /// <param name="parentControlUnit">Root control unit, null in this example</param>
        /// <param name="parentSimulationModel">Simulation model control belongs to</param>
        /// <param name="numberQueues">Number queues to be modeled</param>
        /// <param name="numberServers">Number servers to be modeled</param>
        public ControlUnitQueuingModel(string name,
                                       ControlUnit parentControlUnit,
                                       SimulationModel parentSimulationModel,
                                       int numberQueues,
                                       int numberServers)
            : base(name, parentControlUnit, parentSimulationModel)
        {
            _queues  = new List <EntityQueue>();
            _servers = new List <EntityServer>();

            for (int i = 0; i < numberQueues; i++)
            {
                EntityQueue newQueue = new EntityQueue();
                AddEntity(newQueue);
                Queues.Add(newQueue);
            } // end for

            for (int i = 0; i < numberServers; i++)
            {
                EntityServer newServer = new EntityServer();
                AddEntity(newServer);
                Servers.Add(newServer);
            } // end for
        }     // end of