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); } } } }
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++; }
public void GoTo(int destinationFloor) { RequestedFloors.Add(destinationFloor); }