R沸腾简单矿井模拟

时间:2019-08-13 00:34:26

标签: r

我想使用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

对于在轨迹链中已指定卡车到达时间的功能,为什么还要添加一个函数,我也感到困惑?

为可能很愚蠢的问题表示歉意,但第一次在这种类型的建模中进行了暗访。

1 个答案:

答案 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已经饱和,每个人都在等待。