2017-07-01 65 views
0

我有关于实际事件的数据,我需要模拟可能发生的情况,如果有不同的资源可用。下一阶段将是建立一个“适当”的模拟,其中事件和时间更随机地创建。我的问题是,我无法确定如何确保特定活动获得了现实生活中的启动时间,优先级和超时时间。使用Simmer构建特定模型

library(simmer) 
set.seed(654) 
env <- simmer() 
workerCount <- 2 

actualData <- data.frame(arrTime = c(1:10,1:5), 
priority = 1:3, duration = rnorm(15, 50, 5)) 

activityTraj <- trajectory() %>% 
seize('worker') %>% 
timeout(5) %>% 
release('worker') 

env %>% 
add_resource('worker', workerCount, Inf, preemptive = TRUE) %>% 
add_generator('worker', activityTraj, at(actualData$arrTime), 
mon = 2, priority = 2) 

env %>% run(50) 

我需要在上面做的是使优先从数据帧(在2目前硬编码)阅读发生器和轨迹中的超时(在5目前硬编码)也看过来自数据框。我看不到如何确保指定活动优先级和时间的行也将用于指定持续时间(或“超时”)。

回答

1

首先,你必须确保你的actualData帧由arrTime排序:

actualData <- data.frame(arrTime = c(1:10,1:5), 
         priority = 1:3, 
         duration = rnorm(15, 50, 5)) %>% 
    dplyr::arrange(arrTime) 

然后,让我们建立一个辅助函数来消耗你的actualData的列:

consume <- function(x, prio=FALSE) { 
    i <- 0 
    function() { 
    i <<- i + 1 
    if (prio) c(x[[i]], x[[i]], FALSE) 
    else x[[i]] 
    } 
} 

这可应用于您的轨迹如下:

activityTraj <- trajectory() %>% 
    set_prioritization(consume(actualData$priority, TRUE)) %>% 
    set_attribute("duration", consume(actualData$duration)) %>% 
    seize('worker') %>% 
    timeout(function(attr) attr["duration"]) %>% 
    release('worker') 

因为您的到达是排序的。最后,让我们运行仿真:

env %>% 
    add_resource('worker', workerCount, Inf, preemptive = TRUE) %>% 
    add_generator('worker_', activityTraj, at(actualData$arrTime)) %>% 
    run() 

,并检查实际时间分别确定:

​​