WAITING = "waiting" IN_TRANSIT = "in transit" ARRIVED = "arrived" class Passenger: """Passengers on an elevator. Instances keep track of the source and destination floor numbers as well as amount of time spent waiting.""" error = "Error in Passenger class" count = 0 wait = [] transit = [] def __init__(self, origin, destination): "Create passenger going from origin to destination floor." self.origin = origin self.destination = destination self.timeWait = 0 self.timeTransit = 0 self.state = WAITING Passenger.count += 1 #print "Passenger", origin, destination def tick(self): "Increment wait time." if self.state is WAITING: self.timeWait += 1 elif self.state is IN_TRANSIT: self.timeTransit += 1 elif self.state is not ARRIVED: raise (Passenger.error, "unknown passenger state: %s" % str(self.state)) def embark(self): "Enter an elevator." assert(self.state == WAITING) self.state = IN_TRANSIT #print "Boarded", self.origin, self def disembark(self): "Exit an elevator." self.state = ARRIVED Passenger.wait.append(self.timeWait) Passenger.transit.append(self.timeTransit) #print "Disembarked", self.destination, self def waitTime(): """Return average and standard deviation of time spent waiting for an elevator to arrive.""" import statistics return statistics.average(Passenger.wait) def transitTime(): """Return average and standard deviation of time spent waiting for an elevator to go from origin to destination floor.""" import statistics return statistics.average(Passenger.transit) def count(): """Return number of passengers for whom we have statistics.""" assert(len(Passenger.wait) == len(Passenger.transit)) return len(Passenger.wait) def totalCount(): """Return total number of passengers created.""" return Passenger.count if __name__ == "__main__": import random n = random.randrange(10, 20) people = [] for i in range(n): people.append(Passenger(1, 10)) while people: remain = [] for p in people: p.tick() if p.state is WAITING: if random.randrange(10) < 2: p.embark() remain.append(p) elif p.state is IN_TRANSIT: if random.randrange(10) < 1: p.disembark() else: remain.append(p) people = remain print count(), "passengers" print "average wait time: %f (%f)" % waitTime() print "average transit time: %f (%f)" % transitTime()