Simulation of a M/M/1 queue using processes

In [1]:
using SimJulia
using Distributions
using RandomStreams
using Distributions

const SEED = 12345

rand_dist(rng::MRG32k3a, Dist::Distribution) = quantile(Dist, rand(rng))

seeds = [SEED, SEED, SEED, SEED, SEED, SEED]
gen = MRG32k3aGen(seeds)
Out[1]:
Seed for next MRG32k3a generator:
[12345,12345,12345,12345,12345,12345]
In [2]:
include("tally.jl")
Out[2]:
stdev (generic function with 1 method)
In [3]:
include("tallystore.jl")
Out[3]:
add (generic function with 2 methods)
In [4]:
println("M/M/1 with processes")

#rates
λ = 1.9
μ = 2.0
ρ = λ/μ

type System
    W
    arrival
    service
    counter
    arrgen
    servgen
    
    function System(text::String)
        s = new()
        s.W = Tally(text)
        s.arrival = Exponential(1.0/λ)
        s.service = Exponential(1.0/μ)
        s.arrgen = next_stream(gen)
        s.servgen = next_stream(gen)
        return s;
    end
end

function restart(s::System)
    init(s.W)
    next_substream!(s.arrgen)
    next_substream!(s.servgen)
end
M/M/1 with processes
Out[4]:
restart (generic function with 1 method)
In [5]:
s = System("Waiting Times")
Out[5]:
System(Tally("Waiting Times",0,0.0,Inf,-Inf,0.0,0.0,0.0),Distributions.Exponential{Float64}(θ=0.5263157894736842),Distributions.Exponential{Float64}(θ=0.5),#undef,Full state of MRG32k3a generator:
Cg = [12345,12345,12345,12345,12345,12345]
Bg = [12345,12345,12345,12345,12345,12345]
Ig = [12345,12345,12345,12345,12345,12345],Full state of MRG32k3a generator:
Cg = [3692455944,1366884236,2968912127,335948734,4161675175,475798818]
Bg = [3692455944,1366884236,2968912127,335948734,4161675175,475798818]
Ig = [3692455944,1366884236,2968912127,335948734,4161675175,475798818])
In [6]:
# Allow a simulation with a fixed number of clients
function source(env::Environment, s::System, counter::Resource, limit::Float64)
    i = 0
    while (true)
        yield(Timeout(env, rand_dist(s.arrgen, s.arrival)))
        if (now(env) > limit) break end
        i += 1
        Process(env, customer, s, i, counter)
    end
end

function source_fixed(env::Environment, s::System, counter::Resource, nCusts::Int64)
    for i = 1:nCusts
        yield(Timeout(env, rand_dist(s.arrgen, s.arrival)))
        Process(env, customer, s, i, counter)
    end
end

function customer(env::Environment, s::System, idx::Int, counter::Resource)
    # Record the arrival time in the system
    arrive = now(env)
    yield(Request(counter))
    # The simulation clock now contains the time when the client goes to the server.
    wait = now(env) - arrive
    # Record the waiting time
    add(s.W, wait)
    yield(Timeout(env, rand_dist(s.servgen, s.service)))
    yield(Release(counter))
end
Out[6]:
customer (generic function with 1 method)
In [7]:
function onesim(s::System)    
    env = Environment()
    s.counter = Resource(env, 1)
    
    Process(env, source_fixed, s, s.counter, 10000)
    run(env)
end
Out[7]:
onesim (generic function with 1 method)
In [8]:
onesim(s)
In [9]:
average(s.W)
Out[9]:
8.630432848122487
In [10]:
variance(s.W)
Out[10]:
58.047664581853155
In [11]:
meanWaits = TallyStore("Temps d'attente moyen")
Out[11]:
TallyStore(Float64[],Tally("Temps d'attente moyen",0,0.0,Inf,-Inf,0.0,0.0,0.0))
In [12]:
Nobs = 100
Out[12]:
100
In [13]:
for n=1:Nobs
    restart(s)
    onesim(s)
    w = average(s.W)
    N = nobs(s.W)
    add(meanWaits, w)
    println("Sim $n. Average waiting time: $w. Number of observations: $N")
end
Sim 1. Average waiting time: 7.550875546475624. Number of observations: 10000
Sim 2. Average waiting time: 6.135640065836502. Number of observations: 10000
Sim 3. Average waiting time: 18.479700395704146. Number of observations: 10000
Sim 4. Average waiting time: 7.1030035604970845. Number of observations: 10000
Sim 5. Average waiting time: 8.403267787576848. Number of observations: 10000
Sim 6. Average waiting time: 6.415659416467969. Number of observations: 10000
Sim 7. Average waiting time: 8.73956120790153. Number of observations: 10000
Sim 8. Average waiting time: 13.827590833432248. Number of observations: 10000
Sim 9. Average waiting time: 7.2529369795613725. Number of observations: 10000
Sim 10. Average waiting time: 6.972471705468727. Number of observations: 10000
Sim 11. Average waiting time: 25.000757727815806. Number of observations: 10000
Sim 12. Average waiting time: 10.403505705804962. Number of observations: 10000
Sim 13. Average waiting time: 6.573875031066891. Number of observations: 10000
Sim 14. Average waiting time: 10.59801953586115. Number of observations: 10000
Sim 15. Average waiting time: 8.302029107642944. Number of observations: 10000
Sim 16. Average waiting time: 7.670967466513667. Number of observations: 10000
Sim 17. Average waiting time: 9.775903650802116. Number of observations: 10000
Sim 18. Average waiting time: 9.161448453860864. Number of observations: 10000
Sim 19. Average waiting time: 12.137548343076784. Number of observations: 10000
Sim 20. Average waiting time: 8.59635881725057. Number of observations: 10000
Sim 21. Average waiting time: 7.312929088624517. Number of observations: 10000
Sim 22. Average waiting time: 8.082020323542743. Number of observations: 10000
Sim 23. Average waiting time: 5.796859303524818. Number of observations: 10000
Sim 24. Average waiting time: 8.7250996977843. Number of observations: 10000
Sim 25. Average waiting time: 10.567276957996386. Number of observations: 10000
Sim 26. Average waiting time: 8.35159955100831. Number of observations: 10000
Sim 27. Average waiting time: 7.846275921044625. Number of observations: 10000
Sim 28. Average waiting time: 8.899368987086719. Number of observations: 10000
Sim 29. Average waiting time: 12.597841058981693. Number of observations: 10000
Sim 30. Average waiting time: 8.750700947098036. Number of observations: 10000
Sim 31. Average waiting time: 12.21515119475553. Number of observations: 10000
Sim 32. Average waiting time: 8.52527734482534. Number of observations: 10000
Sim 33. Average waiting time: 8.680207530971977. Number of observations: 10000
Sim 34. Average waiting time: 10.848071147112938. Number of observations: 10000
Sim 35. Average waiting time: 6.636960390277445. Number of observations: 10000
Sim 36. Average waiting time: 10.15161077276834. Number of observations: 10000
Sim 37. Average waiting time: 18.472365677350737. Number of observations: 10000
Sim 38. Average waiting time: 12.465040782002. Number of observations: 10000
Sim 39. Average waiting time: 15.672132998968967. Number of observations: 10000
Sim 40. Average waiting time: 8.39655186879722. Number of observations: 10000
Sim 41. Average waiting time: 12.468352534821092. Number of observations: 10000
Sim 42. Average waiting time: 6.745994420404428. Number of observations: 10000
Sim 43. Average waiting time: 6.393493809960708. Number of observations: 10000
Sim 44. Average waiting time: 10.785812374891092. Number of observations: 10000
Sim 45. Average waiting time: 8.358377212698135. Number of observations: 10000
Sim 46. Average waiting time: 11.640812378656275. Number of observations: 10000
Sim 47. Average waiting time: 7.708491948405319. Number of observations: 10000
Sim 48. Average waiting time: 6.610284958413338. Number of observations: 10000
Sim 49. Average waiting time: 8.349272036464981. Number of observations: 10000
Sim 50. Average waiting time: 10.040841692337187. Number of observations: 10000
Sim 51. Average waiting time: 19.252682756661844. Number of observations: 10000
Sim 52. Average waiting time: 5.256290598915242. Number of observations: 10000
Sim 53. Average waiting time: 23.398687352001488. Number of observations: 10000
Sim 54. Average waiting time: 11.38000216727769. Number of observations: 10000
Sim 55. Average waiting time: 8.220315531084587. Number of observations: 10000
Sim 56. Average waiting time: 7.5673280082090635. Number of observations: 10000
Sim 57. Average waiting time: 10.028287913393807. Number of observations: 10000
Sim 58. Average waiting time: 8.229687683095229. Number of observations: 10000
Sim 59. Average waiting time: 9.765994102863353. Number of observations: 10000
Sim 60. Average waiting time: 9.098813984165014. Number of observations: 10000
Sim 61. Average waiting time: 8.42558901744938. Number of observations: 10000
Sim 62. Average waiting time: 5.610610870643271. Number of observations: 10000
Sim 63. Average waiting time: 7.375631305064171. Number of observations: 10000
Sim 64. Average waiting time: 7.696562549029279. Number of observations: 10000
Sim 65. Average waiting time: 6.678604708627378. Number of observations: 10000
Sim 66. Average waiting time: 8.982336545700855. Number of observations: 10000
Sim 67. Average waiting time: 15.521364809294722. Number of observations: 10000
Sim 68. Average waiting time: 6.0131431880542525. Number of observations: 10000
Sim 69. Average waiting time: 8.475354599687648. Number of observations: 10000
Sim 70. Average waiting time: 6.835090794667892. Number of observations: 10000
Sim 71. Average waiting time: 11.004517757543574. Number of observations: 10000
Sim 72. Average waiting time: 4.333467973786756. Number of observations: 10000
Sim 73. Average waiting time: 14.236020681448935. Number of observations: 10000
Sim 74. Average waiting time: 8.752754742403631. Number of observations: 10000
Sim 75. Average waiting time: 8.352449176930318. Number of observations: 10000
Sim 76. Average waiting time: 7.832362865396419. Number of observations: 10000
Sim 77. Average waiting time: 7.3480511423385035. Number of observations: 10000
Sim 78. Average waiting time: 7.363887962772469. Number of observations: 10000
Sim 79. Average waiting time: 10.239940177557065. Number of observations: 10000
Sim 80. Average waiting time: 10.99086745663789. Number of observations: 10000
Sim 81. Average waiting time: 12.987964211500442. Number of observations: 10000
Sim 82. Average waiting time: 9.156572585651364. Number of observations: 10000
Sim 83. Average waiting time: 9.987819465134903. Number of observations: 10000
Sim 84. Average waiting time: 6.224500234931603. Number of observations: 10000
Sim 85. Average waiting time: 4.309563619007913. Number of observations: 10000
Sim 86. Average waiting time: 6.099212347029085. Number of observations: 10000
Sim 87. Average waiting time: 19.781836101003204. Number of observations: 10000
Sim 88. Average waiting time: 9.42091418306728. Number of observations: 10000
Sim 89. Average waiting time: 17.44075038328643. Number of observations: 10000
Sim 90. Average waiting time: 11.09368379323515. Number of observations: 10000
Sim 91. Average waiting time: 5.855314115022598. Number of observations: 10000
Sim 92. Average waiting time: 5.287724985892333. Number of observations: 10000
Sim 93. Average waiting time: 7.671024147330372. Number of observations: 10000
Sim 94. Average waiting time: 5.934812617614721. Number of observations: 10000
Sim 95. Average waiting time: 7.583350457447502. Number of observations: 10000
Sim 96. Average waiting time: 8.426929923217156. Number of observations: 10000
Sim 97. Average waiting time: 8.40186894534914. Number of observations: 10000
Sim 98. Average waiting time: 8.587434937736656. Number of observations: 10000
Sim 99. Average waiting time: 6.846353251046987. Number of observations: 10000
Sim 100. Average waiting time: 5.946051568878529. Number of observations: 10000
In [14]:
average(meanWaits.t)
Out[14]:
9.485065765462775
In [15]:
variance(meanWaits.t)
Out[15]:
14.333654709875363
In [23]:
stdev(meanWaits.t)
Out[23]:
3.7859813404024276
In [16]:
var(meanWaits.obs)
Out[16]:
14.333654709875377
In [17]:
function ci_normal(n::Int64, mean::Float64, stdev::Float64, α::Float64)
    z = quantile(Normal(), 1-α/2)
    w = z*stdev/sqrt(n)
    # Lower bound
    l = mean - w
    # Upper bound
    u = mean + w
    
    return l, u
end
Out[17]:
ci_normal (generic function with 1 method)
In [18]:
ci_normal(nobs(meanWaits.t), average(meanWaits.t), stdev(meanWaits.t), 0.05)
Out[18]:
(8.74302705812983,10.22710447279572)
In [19]:
function ci_tdist(n::Int64, mean::Float64, stdev::Float64, α::Float64)
    z = quantile(TDist(n-1), 1-α/2)
    w = z*stdev/sqrt(n)
    # Lower bound
    l = mean - w
    # Upper bound
    u = mean + w
    
    return l, u
end
Out[19]:
ci_tdist (generic function with 1 method)
In [20]:
ci_tdist(nobs(meanWaits.t)-1, average(meanWaits.t), stdev(meanWaits.t), 0.05)
Out[20]:
(8.729965100548558,10.240166430376991)

Average waiting time according to M/M/1 formulas. In stationnary regime, the mean waiting time is $$ \overline{W} = \frac{\frac{\rho}{\mu}}{1-\rho} = \frac{\rho}{\mu-\lambda}. $$

In [21]:
w = (ρ/μ)/(1-ρ)
Out[21]:
9.499999999999991
In [22]:
sortedObs = sort(meanWaits.obs)
Out[22]:
100-element Array{Float64,1}:
  4.30956
  4.33347
  5.25629
  5.28772
  5.61061
  5.79686
  5.85531
  5.93481
  5.94605
  6.01314
  6.09921
  6.13564
  6.2245 
  ⋮      
 12.988  
 13.8276 
 14.236  
 15.5214 
 15.6721 
 17.4408 
 18.4724 
 18.4797 
 19.2527 
 19.7818 
 23.3987 
 25.0008 

Bootstrap?

In [ ]:
# Construct a bootstrap sample
unif=next_stream(gen)
In [ ]:
m = 200

wboostrap = TallyStore("Boostrap estimator")
In [ ]:
for j = 1:m
    xb = Array(Float64,Nobs)
    for i=1:Nobs
        k = Int64(ceil(rand(unif)*Nobs))
        xb[i] = meanWaits.obs[k]
    end
    add(wboostrap, mean(xb))
end
In [ ]:
average(wboostrap.t)
In [ ]:
sortwb = sort(wboostrap.obs)
In [ ]:
stdev(meanWaits.t)
In [ ]:
α = 0.05
ceil(m*(1-α/2))
In [ ]:
ceil(m*α/2)
In [ ]:
y = average(meanWaits.t)
In [ ]:
2*y-sortwb[195]
In [ ]:
2*y-sortwb[5]
In [ ]: