R Simmer:具有多个轨迹的自定义优先级

问题描述 投票:0回答:1

最近发现了很棒的慢炖套餐,并且非常享受。然而,我有点绿(如果这是愚蠢的,我很抱歉),当有多个轨迹时,我正在努力处理自定义优先级。

在这个最小的工作示例中,多个轨迹连接在一起。总结一下:到达必须经过 traj_0,其中他们抢占资源的优先级取决于他们等待的时间。然后,到达者可以走 traj_1 或 traj_2,具体取决于外生的 50/50% 概率。

更具体地说,在 traj_0 中,每当到达等待时间超过 t = 18 时,到达的优先级就会增加。这是按照此处文档中的建议完成的。但是,我面临以下问题:

  • 一旦我实施信号方法,模拟就会花费更长的时间。我想这是因为每次要释放资源时都必须重新评估优先级。这使得随着到达人数或模拟次数的增加而变得不太理想。我是否做错了什么/有解决方法吗?

  • 我认为 recompute_priority 信号适用于每个轨迹上的每个到达,包括 traj_1 和 traj_2 上的患者。这意味着已经清除该路径并正在等待是否继续 traj_1 或 2 的到达将在每次释放 resource_a 时重新评估其优先级,这不是我们想要的。有什么方法可以根据到达的轨迹将信号绑定到到达吗?这也允许我为 traj_1 和 2 实现自定义优先级系统。

谢谢!

#First trajectory: Every arrival should go through this
traj_0 <- simmer::trajectory() |> 
  simmer::set_attribute("arrival_time", function() simmer::now(sim)) |> 
  simmer::renege_if(
    "recompute_priority",
    out = simmer::trajectory() |>
      # e.g., increase priority if wait_time > 3
      simmer::set_prioritization(
        function() {
          if(simmer::now(sim) - simmer::get_attribute(sim, "arrival_time") > 18)
            c(1, NA, NA) else 
              c(NA, NA, NA) }, mod="+")  |>
  simmer::rollback(2)) |>
  simmer::timeout(rexp(1,1)) |> 
  simmer::seize('resource_a',1) |>
  simmer::renege_abort() |>
  #OUTCOME could be reached
  simmer::log_('OUTCOME reached') |> 
  simmer::timeout(rexp(1,1)) |> 
  # Send signal that resource is being released
  simmer::send("recompute_priority") |>
  simmer::timeout(0) |>
  simmer::release('resource_a',1)

#Trajectory branch 1
traj_1 <- simmer::trajectory() |> 
  simmer::timeout(rexp(1,1)) |> 
  simmer::seize('resource_b',1) |> 
  simmer::timeout(rexp(1,1)) |> 
  simmer::release('resource_b',1)

#Trajectory branch 2
traj_2 <- simmer::trajectory() |> 
  simmer::timeout(rexp(1,1)) |> 
  simmer::seize('resource_c',1) |> 
  simmer::timeout(rexp(1,1)) |> 
  simmer::release('resource_c',1)

#Main trajectory after traj_0, patient can either go traj_1 or 2.
main_traj <- simmer::trajectory() |>
#Probability is random 50/50%
  simmer::branch(option = function() ifelse(runif(1)>0.5,1,2),
                 continue = c(T,T),
                 #branching trajectory
                 traj_0,
                 traj_1)

#Arrival behaviour
arrival_traj <- simmer::trajectory() |>
  simmer::join(traj_0) |> 
  simmer::join(main_traj)

sim <- simmer::simmer()

sims <- sim |>
  simmer::add_resource("resource_c", capacity = 1, queue_size=Inf, queue_size_strict=T, preemptive=TRUE)|>
  simmer::add_resource("resource_b", capacity = 1, queue_size=Inf, queue_size_strict=T, preemptive=TRUE)  |>
  simmer::add_resource("resource_a", capacity = 1, queue_size=Inf, queue_size_strict=T, preemptive=TRUE)  |>
  simmer::add_generator("arrival", arrival_traj, function() rexp(1, 100), mon=2) |>
  simmer::run(until=1000) |> 
  invisible()
r performance simulation scheduling discrete-mathematics
1个回答
0
投票

您可以传递班级名称:

   for (i in seq_along(copula_list)) {
      copula <- copula_list[[i]]
      fitted_model <- fitCopula(copula,data)
      copula_results[[i]] <- list(
        copula = fitted_model@copula,
        loglik = fitted_model@loglik,
        aic = AIC(fitted_model),
        copula_class = class(copula)
      )
    }

    return(copula_results)
  }

  copula_results <- fit_copula_models(copula_list, data)
  print(copula_results)
© www.soinside.com 2019 - 2024. All rights reserved.