首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单矿井模拟

简单矿井模拟
EN

Stack Overflow用户
提问于 2019-08-13 00:34:26
回答 1查看 281关注 0票数 0

我想建立一个模拟采矿操作使用R,但我还没有取得很大进展。作为一个简单的例子,我想建立一个模拟卡车被装载到地下由一个挖掘机,然后卡车行驶下降到一个下降到我的运行(RoM)垫倾倒他们的负载,然后再回到沼泽地(瓦伊下降)再次装载。目标是找到完成这项工作的最佳数量的卡车,而不需要等待卡车装载的时间太长,而不让卡车在bogger或RoM上排太长的队。我正在尝试遵循这里发现的simmer教程。

首先,我需要为卡车建立一个轨道,我已经建立了如下的轨道:

代码语言:javascript
复制
# 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。轨迹应该指定为这个循环路径吗?

接下来,我建立了如下的仿真环境:

代码语言:javascript
复制
# 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))

执行时,我会收到以下错误消息(此时我被困住了)

代码语言:javascript
复制
Error in eval(lhs, parent, parent) : object 'env' not found

我也很困惑,为什么我需要为卡车到达的时间添加一个函数,而这已经在弹道链中指定了?

为可能的非常愚蠢的问题道歉,但我是第一次在黑暗中对这种类型的建模进行挖掘。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 07:38:28

我已经修改了您的模型,取出了下降资源,因为我假设多辆卡车可以同时上下行驶,而您想要的是查看博格和RoM的排队时间。为了处理连续循环,我首先创建时间为零的卡车数量,然后当每个卡车完成时,您可以使用“激活”再次启动卡车。它被投入使用,这样你就可以看到改变卡车数量的结果。

代码语言:javascript
复制
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)

运行时,结果如下:

代码语言:javascript
复制
> 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秒)之后上升得有多快,因为博格已经饱和,每个人都在等待。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57469775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档