R Simmer 中的即时库存补货
Immediate Inventory Restock in R Simmer
总的来说,我对 Simmer 库和 R 都很陌生,所以我希望有人能帮助我解决这个问题。
Simmer 文档中的示例显示了一个补货监视器,它按设定的时间间隔检查库存,但我希望在客户取回一定数量的库存后立即补货。我试过创建一个开始时间不确定的补货生成器,并使用 set_source("Restock", at(now(env))
重新安排在当前 sim 时间发生补货,但这似乎不起作用。有什么建议吗?
# 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)
要设置 "Restock" 源,您首先需要定义一个非活动的 "Restock" 生成器。鉴于它处于非活动状态,您需要在设置新源后将其激活。我给你举个小例子:
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()
就是这样。
总的来说,我对 Simmer 库和 R 都很陌生,所以我希望有人能帮助我解决这个问题。
Simmer 文档中的示例显示了一个补货监视器,它按设定的时间间隔检查库存,但我希望在客户取回一定数量的库存后立即补货。我试过创建一个开始时间不确定的补货生成器,并使用 set_source("Restock", at(now(env))
重新安排在当前 sim 时间发生补货,但这似乎不起作用。有什么建议吗?
# 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)
要设置 "Restock" 源,您首先需要定义一个非活动的 "Restock" 生成器。鉴于它处于非活动状态,您需要在设置新源后将其激活。我给你举个小例子:
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()
就是这样。