Я пытаюсь имитировать следующий простой сценарий, используя очередь:
"Студенты приезжают в офис профессора, чтобы получать помощь по домашнему заданию каждые 10 минут по экспоненциальному распределению. Время, чтобы помочь студенту экспоненциально распределить со средним числом в 7 минут. Какое ожидаемое число студентов ждет, чтобы им помогли, и средний время ожидания, прежде чем ему помогли? Какой процент времени ожидается, что в офисе профессора будет более двух студентов? "
Я начал с создания следующей очереди, но я изо всех сил пытаюсь создать глобальные часы времени и как интегрировать студентов, покидающих очередь.
import random as rd
class Queue(object):
def __init__(self):
self.officeHasStudent = False
self.totalTime = 0
self.numStudentsInLine = 0
def studentArrives(self, time):
self.totalTime += time
if self.officeHasStudent == False:
self.officeHasStudent = True
else:
self.numStudentsInLine += 1
def __str__(self):
temp = ''
temp += 'Time Elapsed: ' + str(self.totalTime) + ' min\n'
temp += 'number of students in line: ' + str(self.numStudentsInLine)
return temp
Q = Queue()
for i in range(5):
Q.studentArrives(rd.expovariate(1/10.0))
print(Q)
Я думаю, что Queue
также должна знать, когда последний студент вошел в офис и когда (а) он должен уйти, кроме числа учеников в строке, и когда следующий будет впереди. Более того, я бы не думал о "глобальном времени" как о первичной величине, вместо этого мой алгоритм был бы примерно следующим.
Вы всегда должны рассчитать, что будет дальше:
И, как я уже сказал, "глобальное время" - это просто производная величина, которую всегда легко вычислить (обновить) для каждого действия.
arrival_time = arrival_time + expovariate(arrival_rate)
,begin_service = max(end_service, arrival_time)
иend_service = begin_service + expovariate(service_rate)
. Инициализируйтеarrival_time
иend_service
0, вставьте три обновления состояния в цикл, и вы получите модель очередей M / M / 1!