R Simmer: ошибки "нет поступления" при указании нестандартного алгоритма маршрутизации - PullRequest
0 голосов
/ 06 июня 2019

Рассмотрим систему и алгоритм маршрутизации, указанные ниже: Образ системы .Давайте сначала определим некоторые атрибуты, которые будут полезны при моделировании:

library(simmer)
library(parallel)
library(simmer.plot)
#############################
d<- 2
#############################
set.seed(1337)
sim<-simmer()

#let's say the system has 1000 servers/respective queues
queues<- vector(length=1000)
for (i in 1:1000) {
  queues[i]<- paste0("q_",i)
}


queueing_system <- trajectory() %>%
  set_attribute("X", function() rexp(1,100)) %>%
#"e_i", i in {1,2} will be the number of the queue sampled
  set_attribute(paste0("e", 1:d), function() sample(1000,2)) %>% 

#d_i will be the size of these respective queues

  set_attribute("d1", function() get_server_count(sim,queues[get_attribute(sim,"e1")]))%>%
  set_attribute("d2", function() get_server_count(sim,queues[get_attribute(sim,"e2")]))

Теперь давайте определим алгоритм маршрутизации и последующие траектории.

Мы можем попытаться выразить алгоритм маршрутизации полностьюв функции клона следующим образом:

number_of_clones <- function(a,b)
{
if(function() a+b==0){2}else{1}}

routing_logic <- function(a,b,c,d)
{
  if((a>=1 & b=0)|(a=0 & b>=1))
  {
    trajectory()%>%
    select(function() queues[get_attribute(sim,c(c,d)[which(c(a,b)==0)])])%>%
    seize_selected()%>%
      timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1)) 

  }
  else if (a>=1 & b>=1){
    trajectory()%>%
    select(function() queues[get_attribute(sim,sample(c(c,d)),1)])%>%
    seize_selected()%>%
    timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1))

  }
  else if (a+b==0){
    n <- trajectory()%>%
      select(function() queues[get_attribute(sim,c)])%>%
      seize_selected()%>%
      timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1))
    m <- trajectory()%>%
      select(function() queues[get_attribute(sim,d)])%>%
      seize_selected()%>%
      timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1))
    list(n,m)
  }

}

#trajectory is then expressed as
queueing_system %>%
  clone(number_of_clones(get_attribute(sim,"d1"),get_attribute(sim,"d2")),routing_logic(get_attribute(sim,"d1"),get_attribute(sim,"d2"),"e1","e2"))%>%
synchronize(FALSE)%>%
  release_selected()

Теперь мы получаем следующую проблему:

> queueing_system %>%
+   clone(number_of_clones(get_attribute(sim,"d1"),get_attribute(sim,"d2")),routing_logic(get_attribute(sim,"d1"),get_attribute(sim,"d2"),"e1","e2"))%>%
+ synchronize(FALSE)%>%
+   release_selected()
Error: there is no arrival running

Я считаю, что это как-то связано с вызовом функций в условиях моего "еслиЗаявления «и« иначе, если », хотя и не уверены в том, что я делаю неправильно, точно.

1 Ответ

0 голосов
/ 08 июня 2019

Функция get_attribute не может быть вызвана напрямую.Вместо этого его следует поместить в функцию, которая вызывается во время симуляции.

...