The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
The purpose of the package queuecomputer is to compute,
deterministically, the output of a queue network given the arrival and
service times for all customers. The most important functions are
queue_step
, lag_step
and
wait_step
.
The first argument to the functions queue_step
,
lag_step
and wait_step
is a vector of arrival
times. For example:
library(queuecomputer)
library(dplyr)
##
## Vedhæfter pakke: 'dplyr'
## De følgende objekter er maskerede fra 'package:stats':
##
## filter, lag
## De følgende objekter er maskerede fra 'package:base':
##
## intersect, setdiff, setequal, union
<- cumsum(rexp(100))
arrivals
head(arrivals)
## [1] 1.177217 2.548002 2.633025 4.583521 6.300688 6.953988
<- rexp(100)
service
<- queue_step(arrivals = arrivals, service = service)
departures
str(departures,1)
## List of 7
## $ departures : num [1:100] 2.45 2.93 3.7 5.4 7.07 ...
## $ server : int [1:100] 1 1 1 1 1 1 1 1 1 1 ...
## $ departures_df : tibble [100 x 6] (S3: tbl_df/tbl/data.frame)
## $ queuelength_df :'data.frame': 201 obs. of 2 variables:
## $ systemlength_df:'data.frame': 201 obs. of 2 variables:
## $ servers_input : num 1
## $ state : num 101
## - attr(*, "class")= chr [1:2] "queue_list" "list"
The resourcing schedule is specified with either a non-zero natural
number, a server.stepfun
or a server.list
object. Use a non-zero natural number when the number of servers does
not change over time. The server.stepfun
specifies a step
function to indicate how many servers are available throughout the day.
The computation speed for queue_step()
is much faster when
using a server.stepfun
rather than a
server.list
input for the servers
argument.
We create a server.stepfun
object with the
as.server.stepfun
function.
# Zero servers available before time 10
# One server available between time 10 and time 50
# Three servers available between time 50 and time 100
# One server available from time 100 onwards
<- as.server.stepfun(c(10,50,100), c(0, 1, 3, 1))
resource_schedule
resource_schedule
## $x
## [1] 10 50 100
##
## $y
## [1] 0 1 3 1
##
## attr(,"class")
## [1] "server.stepfun" "list"
<- queue_step(arrivals = arrivals, service = service, servers = resource_schedule)
departures
str(departures,1)
## List of 7
## $ departures : num [1:100] 11.3 11.7 12.4 13.2 14 ...
## $ server : int [1:100] 1 1 1 1 1 1 1 1 1 1 ...
## $ departures_df : tibble [100 x 6] (S3: tbl_df/tbl/data.frame)
## $ queuelength_df :'data.frame': 201 obs. of 2 variables:
## $ systemlength_df:'data.frame': 201 obs. of 2 variables:
## $ servers_input :List of 2
## ..- attr(*, "class")= chr [1:2] "server.stepfun" "list"
## $ state : num [1:3] 93.8 91.6 90.8
## - attr(*, "class")= chr [1:2] "queue_list" "list"
The server.list
object is a list of step functions which
represent each server, the range is \(\{0,1\}\), where 0 represents unavailable
and 1 represents available and the knots represent the times where
availability changes.
The as.server.list
function is used to create a
server.list
object.
# Server 1 is available before time 10.
# Server 2 is available between time 15 and time 30.
# Server 3 is available after time 10.
as.server.list(list(10, c(15,30), 10), c(1,0,0))
## [[1]]
## Step function
## Call: stats::stepfun(times[[i]], y)
## x[1:1] = 10
## 2 plateau levels = 1, 0
##
## [[2]]
## Step function
## Call: stats::stepfun(times[[i]], y)
## x[1:2] = 15, 30
## 3 plateau levels = 0, 1, 0
##
## [[3]]
## Step function
## Call: stats::stepfun(times[[i]], y)
## x[1:1] = 10
## 2 plateau levels = 0, 1
##
## attr(,"class")
## [1] "list" "server.list"
It is simple to set up a chain of queueing elements with
queuecomputer
. Suppose passengers must walk to a queue,
then wait for service and then wait for their bags.
library(queuecomputer)
library(dplyr)
set.seed(500)
<- 100
n
<- cumsum(rexp(n))
arrivals <- rexp(n, 0.8)
service_l <- rexp(n, 0.5)
service_q <- cumsum(rexp(n, 0.8))
arrivals_b
# The queue elements can be computed one by one.
<- lag_step(arrivals, service_l)
departures_1 <- queue(departures_1, service = service_q, servers = 2)
departures_2 <- wait_step(departures_2, arrivals_b)
departures_3
# Or the queue elements can be chained together with the %>% operator.
<- lag_step(arrivals, service_l) %>% queue_step(service = service_q, servers = 2) %>% wait_step(arrivals_b)
departures
all(departures == departures_3)
## [1] TRUE
# Plot densities for this tandem queueing network
<- rainbow(4)
colours plot(density(arrivals, from = 0),
col = colours[1], xlim = c(0, 220), ylim = c(0, 0.015),
main = "Density plot")
lines(density(departures_1, from = 0), col = colours[2])
lines(density(departures_2, from = 0), col = colours[3])
lines(density(departures_3, from = 0), col = colours[4])
legend(150,0.012, legend = c("Start walk",
"Finish walk",
"Finish service",
"Pick up bag"),
col = colours, lwd = 1, cex = 0.8
)
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.