【问题标题】:Immediate Inventory Restock in R SimmerR Simmer 中的即时库存补货
【发布时间】:2018-08-03 21:13:33
【问题描述】:

总的来说,我对 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)

【问题讨论】:

    标签: r system simulation inventory


    【解决方案1】:

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

    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()
    

    就是这样。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多