Skip to content

Commit e21bf82

Browse files
authored
Create basic M/M/c queue example
A simple M/M/c queue might be a nice addition to the examples. I'm not sure if this is the most straightforward way to deal with the arrival times. Maybe there's a way to pass an arrival distribution and a service distribution to customer (instead of an arrival time and a service distribution).
1 parent 7777f83 commit e21bf82

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

docs/src/examples/mmc.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Multi-server Queue
2+
3+
## Description
4+
5+
An [M/M/c queue](https://en.wikipedia.org/wiki/M/M/c_queue) is a basic queue with _c_ identical servers, exponentially distributed interarrival times, and exponentially distributed service times for each server. The arrival rate is defined as _λ_ such that the interarrival time distribution has mean _1/λ_. Similarly, the service rate is defined as _μ_ such that the service time distribution has mean _1/μ_ (for each server). The overall traffic intensity of the queue is _ρ = λ / (c * μ)_. If the traffic intensity exceeds one, the queue is unstable and the queue length will grow indefinitely.
6+
7+
## Code
8+
9+
```julia
10+
#set simulation parameters
11+
srand(8710) # set random number seed for reproducibility
12+
num_customers = 10 # total number of customers generated
13+
14+
# set queue parameters
15+
num_servers = 2 # number of servers
16+
mu = 1.0 / 2 # service rate
17+
lam = 0.9 # arrival rate
18+
arrival_dist = Exponential(1 / lam) # interarrival time distriubtion
19+
service_dist = Exponential(1 / mu) # service time distribution
20+
21+
# define customer behavior
22+
@resumable function customer(env::Environment, server::Resource, id::Integer, t_a::Float64, d_s::Distribution)
23+
@yield timeout(env, t_a) # customer arrives
24+
println("Customer $id arrived: ", now(env))
25+
@yield request(server) # customer starts service
26+
println("Customer $id entered service: ", now(env))
27+
@yield timeout(env, rand(d_s)) # server is busy
28+
@yield release(server) # customer exits service
29+
println("Customer $id exited service: ", now(env))
30+
end
31+
32+
# setup and run simulation
33+
sim = Simulation() # initialize simulation environment
34+
server = Resource(sim, num_servers) # initialize servers
35+
arrival_time = 0.0
36+
for i = 1:num_customers # initialize customers
37+
arrival_time += rand(arrival_dist)
38+
@process customer(sim, server, i, arrival_time, service_dist)
39+
end
40+
run(sim) # run simulation
41+
42+
## output
43+
#
44+
# Customer 1 arrived: 0.1229193244813443
45+
# Customer 1 entered service: 0.1229193244813443
46+
# Customer 2 arrived: 0.22607641035584877
47+
# Customer 2 entered service: 0.22607641035584877
48+
# Customer 3 arrived: 0.4570009029409502
49+
# Customer 2 exited service: 1.7657345101378559
50+
# Customer 3 entered service: 1.7657345101378559
51+
# Customer 1 exited service: 2.154824561031012
52+
# Customer 3 exited service: 2.2765287086137764
53+
# Customer 4 arrived: 2.3661687470062995
54+
# Customer 4 entered service: 2.3661687470062995
55+
# Customer 5 arrived: 2.6110816119637885
56+
# Customer 5 entered service: 2.6110816119637885
57+
# Customer 5 exited service: 2.8017888690417583
58+
# Customer 6 arrived: 3.019540357955037
59+
# Customer 6 entered service: 3.019540357955037
60+
# Customer 6 exited service: 3.351151832298383
61+
# Customer 7 arrived: 3.5254699872847612
62+
# Customer 7 entered service: 3.5254699872847612
63+
# Customer 7 exited service: 4.261422043181396
64+
# Customer 4 exited service: 4.602071952938201
65+
# Customer 8 arrived: 7.27536704811686
66+
# Customer 8 entered service: 7.27536704811686
67+
# Customer 9 arrived: 7.491176033637809
68+
# Customer 9 entered service: 7.491176033637809
69+
# Customer 10 arrived: 8.39098457094977
70+
# Customer 8 exited service: 8.683396356977969
71+
# Customer 10 entered service: 8.683396356977969
72+
# Customer 9 exited service: 8.7501656586875
73+
# Customer 10 exited service: 9.049670951561666
74+
```

0 commit comments

Comments
 (0)