Я пытаюсь смоделировать систему JSQ (d) (самая короткая очередь из d выборочных очередей), но у меня возникают проблемы с выполнением моего кода. В этом случае примем d=2. Я хочу, чтобы размер задания определялся по прибытии (значение «X»), а также выбор двух очередей, которые будут выбраны и «обработаны JSQ» (возможно, это можно было бы сделать по-другому, хотя для моих целей, выходящих за рамки этого минимального рабочий пример, они должны быть определены по прибытии).
library(simmer)
set.seed(1337)
sim <- simmer("sim")
queues <- vector(length=1000)
for (i in 1:1000) {
queues[i] <- paste0("q_",i)
}
queueing_system <- trajectory() %>%
set_attribute("X", function() rexp(1)) %>%
set_attribute("d", function() sample(1000,2)) %>%
select(function() queues[get_attribute(sim, "d")], policy = "shortest-queue") %>%
seize_selected()%>%
timeout(function() get_attribute(sim, "X")*(rpois(1, 1)+1)) %>%
release_selected()
for (i in 1:1000) {
sim %>%
add_resource(queues[i], 1)
}
sim %>%
add_generator("path", queueing_system, function() rexp(1,1)) %>%
run(400) %>%
now()
я получаю
Error: 'path0' at 0.15 in [SetAttribute]->SetAttribute->[Select]:
number of keys and values don't match
В чем проблема и как я могу это исправить?
Атрибуты хранят одно значение. Почему бы вам не попробовать прямо в активности select
? то есть,
queueing_system <- trajectory() %>%
set_attribute("X", function() rexp(1)) %>%
select(function() queues[sample(1000, 2)], policy = "shortest-queue") %>%
seize_selected()%>%
timeout(function() get_attribute(sim, "X")*(rpois(1, 1)+1)) %>%
release_selected()
Я бы тоже назвал rexp(1)
вместо определения X
.
Вы можете хранить столько атрибутов, сколько хотите, но каждый атрибут должен иметь одно значение. Векторы не поддерживаются.
Как же тогда мне хранить значения X и d в данном конкретном случае?
Вы можете использовать больше атрибутов, например, set_attribute(paste0("d", 1:2), function() sample(1000,2))
.
Кажется, это имеет смысл, хотя ясно, что я выбираю его неправильно после установки: queueing_system <- trajectory() %>% set_attribute("X", function() rexp(1,100)) %>% set_attribute(paste0("d", 1:2), function() sample(1000,2)) %>% select(queues[c(function()get_attribute("d1"),function()get_attribute("d2"))], policy = "shortest-queue") %>% seize_selected()%>% timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1)) %>% release_selected()
Неважно, кажется, я понял: queueing_system <- trajectory() %>% set_attribute("X", function() rexp(1,100)) %>% set_attribute(paste0("d", 1:2), function() sample(1000,2)) %>% select(function()queues[c(get_attribute(sim,"d1"),get_attribute(sim,"d2"))], policy = "shortest-queue") %>% seize_selected()%>% timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1)) %>% release_selected()
Проще: get_attribute(sim, paste0("d", 1:2))
.
Это минимальный рабочий пример моей истинной проблемы - из-за ограничений моей более крупной проблемы я не могу выполнить выборку в рамках выбора (значение «d» будет использоваться в другой части моей симуляции и, следовательно, нужно его сохранить). Итак, чтобы было ясно, я не могу хранить более одного атрибута для каждого прибытия? Если это так, я могу попробовать векторизовать значения.