【问题标题】:Using branch() in Simmer for R在 Simmer for R 中使用 branch()
【发布时间】:2022-07-30 19:49:54
【问题描述】:

我开始使用 Simmer,目前几乎没有想到它,并且总是难以使用书面文档而不是实际示例。

我正在尝试用 2 个资源对流程进行建模,想象一下邮局。

  1. 客户接近付款柜台,交出物品并付款。这需要 15 秒。
  2. 90% 的物品直接进入存储容器并退出模型。
  3. 10% 的物品进入包装站。包装需要 30 秒,完成后项目退出模型。
  4. 如果包装队列达到 5,则付款计数器停止。只有在打包队列低于 5 时才会重新启动。

我相信分支是我想要使用的,但在如何应用它方面需要一些帮助,我的非常简单的模型如下

    env <- simmer("model")
env

traj <- trajectory(name = "item") %>% 
  seize("payment",1) %>% 
  timeout(function() rnorm(1,15)) %>% 
  release("payment",1) %>%
  
  seize("package",1) %>%
  timeout(function() rnorm(1,30)) %>% 
  release("package",1)

env %>%
  add_resource("payment",1) %>% 
  add_resource("package",1) %>% 
  add_generator(name_prefix = "test",
                trajectory = traj,
                distribution = function() rnorm(1,15))

env
env %>% run(until = 500)

任何帮助都会得到永远的感激

【问题讨论】:

    标签: r


    【解决方案1】:

    你是对的,分支是解决方案。在分行 函数,“选项”可以用作条件。我检查了包装柜台的队列大小是否大于 4,如果是,我将支付能力设置为零,这样就不会接收任何新客户。我添加了一些日志,以便可以更轻松地监控和验证模拟。我建议添加更多属性以仔细检查所有内容。

    stor_cont_deter <- function(){
      x = runif(1,0,1)
      ifelse(x <= .1, 1, 0)
      }
    
    load_to_container_traj <- trajectory() %>%
      log_("packaging_skipped") %>% 
      release("payment",1)
    
    traj <- trajectory(name = "item") %>% 
      log_(function() {paste("start_time: ", now(test))})  %>%
      seize("payment",1) %>% 
      timeout(function() rnorm(1,15)) %>% 
      log_("finished_payment") %>% 
      branch(
        stor_cont_deter, continue = F,
        load_to_container_traj
      ) %>%
      log_("packaging_not_skipped") %>% 
      release("payment",1) %>%
      log_(function() {paste("package_queue_size: ", get_queue_count(test, "package"))})  %>%
      branch(
        function() ifelse(get_queue_count(test, "package") > 4, 1, 0),
        continue = T,
        trajectory() %>%
        log_("payment_stopped") %>% 
        set_capacity("payment", 0) %>% 
        log_(function() {paste("payment_cap: ", get_capacity(test, "payment"))})
      ) %>%
      seize("package",1) %>%
      timeout(function() rnorm(1,30)) %>%
      log_("finished_packing") %>% 
      release("package",1) %>% 
      log_(function() {paste("package_queue_size2: ", get_queue_count(test, "package"))})  %>%
      branch(
        function() ifelse(get_queue_count(test, "package") <= 4, 1, 0),
        continue = T,
        trajectory() %>% 
        log_("payment_can_start") %>% 
        set_capacity("payment", 1)
      )
    
    
    
    test <- simmer("env") %>%
      add_resource("payment",1) %>% 
      add_resource("package",1) %>% 
      add_generator(name_prefix = "test",
                    trajectory = traj,
                    distribution = function() rnorm(1,15))
    
    set.seed(78)
    runsim <- test %>% run(until = 500)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多