我想使用R慢火建立一个采矿操作的模拟,但距离还很远。举一个简单的例子,我想模拟一个装满卡车的卡车,然后将卡车沿下降道行驶到防雷垫(RoM)以卸掉他们的货物,然后返回装车卡车再次(无法下降)再次加载。目的是找到最佳数量的卡车来完成这项工作,而无需让拖板车等待太长的时间来装载卡车,也不必让卡车在拖板车或RoM上排队太长时间。我正在尝试遵循here的入门教程。
所以首先我需要为卡车设置一个轨迹,如下所示:
# Load DES simulation package and set random seed
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
require(simmer)
set.seed(1234)
# Set up trajectory for a truck being loaded by a bogger to Rom and back again
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Truck <- trajectory('Truck path') %>%
# loaded by bogger
seize('Bogger',1) %>%
timeout(function() rnorm(1, 3, 0.5)) %>%
release('Bogger',1) %>%
# go up decline
seize('Decline',1) %>%
timeout(function() rnorm(1, 6, 1)) %>%
release('Decline',1) %>%
# dump on ROM
seize('RoM',1) %>%
timeout(function() rnorm(1,2,0.5)) %>%
release('RoM', 1) %>%
# go down decline
seize('Decline',1) %>%
timeout(function() rnorm(1, 6, 1)) %>%
release('Decline',1)
现在,我的第一个问题是,这如何解释卡车沿着连续循环行驶的事实?如...沼泽->上升下降-> RoM->下降下降->沼泽。应该在该循环路径中指定轨迹吗?
接下来,我将仿真环境设置如下:
# Set up simulation enviroment
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
env %>%
add_resource('Bogger',1) %>%
add_resource('Decline',1) %>%
add_resource('RoM', 1) %>%
add_generator('Truck', Truck, function() rnorm(1, 6, 1))
执行后,我最终收到以下错误消息(此时我被卡住了)
Error in eval(lhs, parent, parent) : object 'env' not found
对于在轨迹链中已指定卡车到达时间的功能,为什么还要添加一个函数,我也感到困惑?
为可能很愚蠢的问题表示歉意,但第一次在这种类型的建模中进行了暗访。
答案 0 :(得分:0)
我已经通过删除下降资源来修改了您的模型,因为我假设多辆卡车可以同时上下,而您想要的是查看Bogger和RoM的排队时间。为了处理连续循环,我首先创建了在零时所需的卡车数量,然后在每个卡车完成时,可以使用“激活”再次启动卡车。它已启用,因此您可以看到更改卡车数量的结果。
library(simmer)
library(tidyverse)
set.seed(42)
# create a function so we can call it with varying number of trucks
f_mine_simulation <- function(n_trucks)
{
env <- simmer("SuperDuperSim") # define environment
# Set up trajectory for a truck being loaded by a bogger to Rom and back again
# I am assuming that multiple trucks can use the ramp, so it is not setup
# as a resource.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Truck <- trajectory('Truck path') %>%
# loaded by bogger
seize('Bogger',1) %>%
timeout(function() rnorm(1, 3, 0.5)) %>%
release('Bogger',1) %>%
# go up decline
timeout(function() rnorm(1, 6, 1)) %>%
# dump on ROM
seize('RoM',1) %>%
timeout(function() rnorm(1,2,0.5)) %>%
release('RoM', 1) %>%
# go down decline
timeout(function() rnorm(1, 6, 1)) %>%
activate("Truck_gen")
# Set up simulation enviroment
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
env %>%
add_resource('Bogger',1) %>%
add_resource('Decline',1) %>%
add_resource('RoM', 1) %>%
add_generator('Init', Truck, at(rep(0,n_trucks))) %>%
add_generator("Truck_gen", Truck, when_activated()) %>%
run(10000)
# calculate the amount of waiting at the Bogger and RoM
return(get_mon_resources(env) %>%
group_by(resource) %>%
summarise(active = sum(head(server, -1) * diff(time)),
waiting = sum(head(queue, -1) * diff(time)),
n_trucks = n_trucks
))
}
# run for 1-10 trucks
x <- map_dfr(1:10, f_mine_simulation)
运行时,结果如下:
> x
# A tibble: 20 x 4
resource active waiting n_trucks
<chr> <dbl> <dbl> <int>
1 Bogger 1758. 0 1
2 RoM 1173. 0 1
3 Bogger 3461. 148. 2
4 RoM 2347. 55.0 2
5 Bogger 5199. 542. 3
6 RoM 3414. 124. 3
7 Bogger 6757. 1326. 4
8 RoM 4502. 273. 4
9 Bogger 8326. 2688. 5
10 RoM 5471. 559. 5
11 Bogger 9485. 5732. 6
12 RoM 6253. 756. 6
13 Bogger 9965. 12660. 7
14 RoM 6650. 942. 7
15 Bogger 9999. 22415. 8
16 RoM 6622. 966. 8
17 Bogger 9999. 32383. 9
18 RoM 6690. 956. 9
19 Bogger 10000. 42647. 10
20 RoM 6585. 968. 10
因此,您将不得不根据所需的队列大小(等待时间)来决定最佳数字。您可以看到,对于10,000个时间单位的仿真,使用10辆卡车进行仿真的总等待时间为42,647。您会看到,在大约5辆卡车上,博格卡车饱和(使用了8326秒的时间-83%的繁忙时间)。 RoM的总等待时间为968,因为它的服务时间更短。
您可以看到大约5辆卡车(增量为10000秒)之后,“等待时间”的增长速度如何,因为Bogger已经饱和,每个人都在等待。