|
| 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