Example #1
0
        public override IEnumerator <InstructionBase> Simulate()
        {
            while (true)
            {
                if (CurrentLoad < MaxCapacity)
                {
                    RequestedFloors.AddRange(personsGenerator.getFloorsWhereLiftIsNeeded());
                    RequestedFloors = RequestedFloors.Union(RequestedFloors).ToList();
                    RequestedFloors = Ordonancer.Sort(RequestedFloors);
                }


                if (RequestedFloors.Count == 0)
                {
                    yield return(new WaitConditionInstruction(() => personsGenerator.getFloorsWhereLiftIsNeeded().Count > 0));
                }
                else
                {
                    if (personsGenerator.Floors[CurrentFloor].PersonsWaiting.Count > 0 && CurrentLoad < MaxCapacity)
                    {
                        int nbNewComers = Board();
                        TimeBusy += 3 * nbNewComers;
                        yield return(new WaitInstruction(3 * nbNewComers));
                    }



                    if (RequestedFloors.Count > 0)
                    {
                        var originalFloor = CurrentFloor;
                        MoveToFloor(RequestedFloors[0]);
                        TimeBusy += (Math.Abs(CurrentFloor - originalFloor)) * 9;
                        yield return(new WaitInstruction((Math.Abs(CurrentFloor - originalFloor)) * 9));


                        if (CurrentLoad != 0)
                        {
                            int nbPeopleLeft = Disembark();
                            TimeBusy += 3 * nbPeopleLeft;
                            yield return(new WaitInstruction(3 * nbPeopleLeft));
                        }
                        RequestedFloors.RemoveAt(0);
                    }
                }
            }
        }
Example #2
0
        private void EnterLift(Person p)
        {
            if (p.Departure == 0)
            {
                p.EnteringLiftTimeGoingUp = Context.TimePeriod;
                p.TotalQueueTime          = Context.TimePeriod - p.BeginQueueTimeGoingUp;
                personsGenerator.Floors[p.Departure].AverageQueueSize += Context.TimePeriod - p.BeginQueueTimeGoingUp;

                if ((Context.TimePeriod - p.BeginQueueTimeGoingUp) > personsGenerator.Floors[p.Departure].MaximumWaitingTime)
                {
                    personsGenerator.Floors[p.Departure].MaximumWaitingTime = Context.TimePeriod - p.BeginQueueTimeGoingUp;
                }
            }
            else
            {
                p.EnteringLiftTimeGoingDown = Context.TimePeriod;
                p.TotalQueueTime           += Context.TimePeriod - p.BeginQueueTimeGoingDown;
                personsGenerator.Floors[p.Departure].AverageQueueSize += Context.TimePeriod - p.BeginQueueTimeGoingDown;
                if ((Context.TimePeriod - p.BeginQueueTimeGoingUp) > personsGenerator.Floors[p.Departure].MaximumWaitingTime)
                {
                    personsGenerator.Floors[p.Departure].MaximumWaitingTime = Context.TimePeriod - p.BeginQueueTimeGoingUp;
                }
            }


            PersonsInLift.Add(p);



            Console.WriteLine("Person {0} is entering the lift", p.Id);

            if (!RequestedFloors.Contains(p.Destination))
            {
                RequestedFloors.Add(p.Destination);
            }
            CurrentLoad++;
        }
Example #3
0
 public void GoTo(int destinationFloor)
 {
     RequestedFloors.Add(destinationFloor);
 }