首页 > 解决方案 > R Simmer 中的即时库存补货

问题描述

总的来说,我对 Simmer 库和 R 都很陌生,所以我希望有人可以帮助我解决这个问题。

Simmer 文档中的示例显示了一个补货监控器,它可以按设定的时间间隔检查库存,但我希望在客户检索到一定数量的库存后立即进行补货。我尝试创建一个开始时间不定的补货生成器,并使用set_source("Restock", at(now(env))它来重新安排补货在当前模拟时间发生,但这似乎不起作用。有什么建议么?

# Inv. properties
INV_CAP      <- 100
INV_TRIG     <- 30
INV_LEVEL    <- INV_CAP

# Environment rates
SERVE_RATE   <- 1/10
RESTOCK_RATE <- 1/10

env <- simmer()

restock <- trajectory() %>%
  # Restock only beneath INV_TRIG threshold
  branch(function() INV_LEVEL <= INV_TRIG,
    continue = TRUE,
      trajectory() %>%
        log_("Begin restock") %>%
        timeout(function() rexp(1, RESTOCK_RATE)) %>%
        log_(function(){
          INV_LEVEL <<- INV_CAP
          paste("Restock finished")
        }))

serve <- trajectory() %>%
  log_("Begin serving") %>%
  timeout(function() rexp(1, SERVE_RATE)) %>%
  # Decrease inv. level and cust. demand
  set_attribute("demand", function() {
    amount <- min(INV_LEVEL, get_attribute(env, "demand"))
    INV_LEVEL <<- INV_LEVEL - amount
    return(-amount)
  }, mod = "+")

customer <- trajectory() %>%
  set_attribute("demand", function() sample(DEMAND_MIN:DEMAND_MAX, 1)) %>%
  log_("Entering queue") %>%
  seize("Server") %>%
  join(serve) %>%
  release("Server") %>%
  log_("Finished")

env %>%
  add_resource("Server", capacity = SERVER_CAP, queue_size = QUEUE_CAP) %>%
  add_generator("Customer", customer, function() rexp(1, CUST_RATE), mon = 2) %>%
  run(until = 500)

标签: rsystemsimulationinventory

解决方案


要设置“补货”来源,您需要首先定义一个非活动的“补货”生成器。并且鉴于它处于非活动状态,您需要在设置新源后将其激活。我给你举个小例子:

library(simmer)

env <- simmer()

restock <- trajectory() %>%
  log_("restock")

serve <- trajectory() %>%
  log_("serve") %>%
  set_source("Restock", at(0)) %>%
  activate("Restock")

env %>%
  add_generator("Customer", serve, at(1, 2, 3)) %>%
  add_generator("Restock", restock, at(-1)) %>%
  run()

编辑:如果您定义以下便利功能(我想我会simmer在下一个版本中添加它):

when_activated <- function(n=1) {
  first <- TRUE
  function() {
    if (first) {
      first <<- FALSE
      return(-1)
    }
    c(rep(0, n), -1)
  }
}

然后,

library(simmer)

env <- simmer()

restock <- trajectory() %>%
  log_("restock")

serve <- trajectory() %>%
  log_("serve") %>%
  activate("Restock")

env %>%
  add_generator("Customer", serve, at(1, 2, 3)) %>%
  add_generator("Restock", restock, when_activated()) %>%
  run()

就是这样。


推荐阅读