У меня есть сумма домашней работы, где я должен смоделировать очередь, которая равна M / E3 / c / k в соответствии с обозначениями Кендалла.
Теперь здесь k равно 20, c является условно-переменной.Я использовал этот код для очереди M / M / 1 в качестве ссылки.Изменить распределение с rexp
на rgamma
было просто.Однако в цикле while я наблюдаю странное поведение, которое я не мог устранить в течение двух дней подряд.Код, на который я ссылаюсь, не имеет ограничения по пропускной способности, который я только что добавил в операторы if else, так как при достижении максимальной пропускной способности должен быть запущен вылет.Значение c условно изменяется в соответствии с заданным параметром «x», на котором основано это моделирование.В тот момент, когда значение «n», которое является числом людей в очереди, достигает «x», появляются 2 сервера, что означает удвоение скорости обслуживания.Начальная скорость обслуживания (erlang-3, скорость 3) выше, чем скорость прибытия (опыт, скорость 2.8).Теперь это обычно означает, что значение «n» всегда должно уменьшаться, поскольку скорость обслуживания выше, чем скорость прибытия.Однако значение 'n', кажется, постоянно стремится к максимальной емкости, равной 20. Я не уверен, неправильно ли я интерпретирую параметр 'rate' в функциях распределения, или мой код просто нелогичен.
Я показываю весь код для циклов, которые составляют эту симуляцию.
Я просто должен показать, какова средняя длина очереди (Lq) и стоимость для каждого значения x, а затем проанализировать результаты.Тем не менее, в моем цикле while явно есть проблема, которую я, похоже, здесь не решаю, так как я получаю отрицательные затраты и среднюю длину очереди выше 20. Я знаю, что это, вероятно, слишком много, я прошу такой форум, какэто, поэтому я заранее извиняюсь за это.
end_time равно 60, чтобы имитировать время работы 1 час.
заработная плата составляет 1/3 (20 $ в час), длядобавление дополнительного сервера.
for (x in c(1:20)) {
time<-0
t1 <- 0 # time for next arrival
t2 <- end_time # time for next departure
cost_time<-0
tn<-time # temp var for last event time
ts<-0 # temp var for last service-time start
n<-0 # number of jobs/people in the system (queue+person getting serviced)
s<-0 # cumulative number-time product
b<-0 # total active service time
c<-0 # completed services
while (time<end_time) {
if ((t1<t2 && n<x)&&n<capacity) { # arrival event with 1 server
time<-t1
# s = cumulative sum of n(people in system) * time-tn (clock time-most recent event) for time weighted queue length
s<-s+n*(time-tn)
n<-n+1
tn<-time
t1<-time+rexp(1,arrival_rate)
if(n == 1) {
ts <- time
t2 <- time + rgamma(1, shape = 3, rate = service_rate) # erlang-3 service rate
}
}
else if ((t1>=t2 && n<x)||n>=capacity) { # departure event with 1 server
time <- t2
s <- s+n*(time-tn)
n <- n - 1
tn <- time
c <- c + 1
if (n > 0) {
t2 <- time + rgamma(1, shape = 3, rate = service_rate) # erlang-3 service period
}
else {
t2 <- end_time
b <- b + time - ts
}
}
else if ((t1<t2 && n>=x)&&n<capacity) { # arrival event with 2 servers
time<-t1
s<-s+n*(time-tn)
cost_time<-cost_time+(time-tn)
n<-n+1
tn<-time
t1<-time+rexp(1,arrival_rate)
}
else if ((t1>=t2 && n>=x)||n>=capacity) { # departure event with 2 servers
time <- t2
s <- s+n*(time-tn)
cost_time<-cost_time+(time-tn)
n <- n - 1
tn <- time
c <- c + 1
if (n > 0) {
t2 <- time + rgamma(1, shape = 3, rate = service_rate*2) # erlang-3 service period
}
else {
t2 <- end_time
b <- b + time - ts
}
}
}
Lq[x]<-s/time
costs[x]<-wage*cost_time
}