我想建立一个模拟采矿操作使用R,但我还没有取得很大进展。作为一个简单的例子,我想建立一个模拟卡车被装载到地下由一个挖掘机,然后卡车行驶下降到一个下降到我的运行(RoM)垫倾倒他们的负载,然后再回到沼泽地(瓦伊下降)再次装载。目标是找到完成这项工作的最佳数量的卡车,而不需要等待卡车装载的时间太长,而不让卡车在bogger或RoM上排太长的队。我正在尝试遵循这里发现的simmer教程。
首先,我需要为卡车建立一个轨道,我已经建立了如下的轨道:
# 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)现在我的第一个问题是,这是如何解释卡车旅行是一个连续循环的事实呢?就像..。博格-> up -> RoM -> down -> bogger。轨迹应该指定为这个循环路径吗?
接下来,我建立了如下的仿真环境:
# 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我也很困惑,为什么我需要为卡车到达的时间添加一个函数,而这已经在弹道链中指定了?
为可能的非常愚蠢的问题道歉,但我是第一次在黑暗中对这种类型的建模进行挖掘。
发布于 2019-08-13 07:38:28
我已经修改了您的模型,取出了下降资源,因为我假设多辆卡车可以同时上下行驶,而您想要的是查看博格和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个时间单位的模拟,有一个42,647个总等待时间为10辆卡车的模拟。你可以看到,在大约5辆卡车上,Bogger变得饱和(使用8326秒的时间-- 83%的繁忙时间)。RoM的总等待时间只有968,因为它的服务时间更短。
你可以看到“等待时间”在大约5辆卡车(几乎增加了10000秒)之后上升得有多快,因为博格已经饱和,每个人都在等待。
https://stackoverflow.com/questions/57469775
复制相似问题