Как смоделировать очередь M / E3 / c / k в R? - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть сумма домашней работы, где я должен смоделировать очередь, которая равна 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
}
...