【问题标题】:R Simmer - "Number of keys and values don't match"R Simmer - “键和值的数量不匹配”
【发布时间】:2019-10-15 16:37:47
【问题描述】:

我正在尝试模拟 JSQ(d)(d 个采样队列的加入最短队列)系统,但在执行我的代码时遇到了问题。在这种情况下,我们假设 d=2。我希望在到达时确定工作大小(“X”的值)以及选择哪些 2 个队列将被采样和“JSQ-ed”(这可能会有所不同,尽管出于我的目的超出了这个最小值工作示例,这些必须在到达时确定)。

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

似乎是什么问题,我该如何解决?

【问题讨论】:

    标签: r queue queueing


    【解决方案1】:

    属性存储单个值。为什么不直接在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

    【讨论】:

    • 这是我真正问题的一个最小工作示例 - 受我更大问题的限制,我无法在选择中采样(“d”的值将用于我的模拟的另一部分因此需要存储它)。所以,需要明确的是,每次到达我不能存储多个属性?如果是这样,我可以尝试矢量化值。
    • 您可以存储任意数量的属性,但每个属性必须是单个值。不支持向量。
    • 那么,在这种特殊情况下,我将如何存储 X 和 d 的值?
    • 您可以使用更多属性,例如set_attribute(paste0("d", 1:2), function() sample(1000,2))
    • 这似乎有道理,虽然很明显我在设置后选择错误:queueing_system &lt;- trajectory() %&gt;% set_attribute("X", function() rexp(1,100)) %&gt;% set_attribute(paste0("d", 1:2), function() sample(1000,2)) %&gt;% select(queues[c(function()get_attribute("d1"),function()get_attribute("d2"))], policy="shortest-queue") %&gt;% seize_selected()%&gt;% timeout(function() get_attribute(sim, "X")*(rpois(1, 10)+1)) %&gt;% release_selected()
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多