最近发现了很棒的慢炖套餐,并且非常享受。然而,我有点绿(如果这是愚蠢的,我很抱歉),当有多个轨迹时,我正在努力处理自定义优先级。
在这个最小的工作示例中,多个轨迹连接在一起。总结一下:到达必须经过 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()
您可以传递班级名称:
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)