A Julia package for discrete event generation and simulation.
DiscreteEvents.jl 1 introduces clocks and allows to schedule and execute arbitrary functions or expressions as actions on the clocks' timeline. It provides simple, yet powerful ways to model and simulate discrete event systems (DES).
Three servers serve customers arriving at an arrival rate λ with a service rate μ. We implement serve and arrive functions, create a clock and queues, start three service processes and an arrival process and run.
using DiscreteEvents, Printf, Distributions, Random
# describe a server process
function serve(clk::Clock, id::Int, input::Channel, output::Channel, X::Distribution)
job = take!(input)
print(clk, @sprintf("%6.3f: server %d serving customer %d\n", tau(clk), id, job))
@delay! clk X
print(clk, @sprintf("%6.3f: server %d finished serving %d\n", tau(clk), id, job))
put!(output, job)
end
# model the arrivals
function arrive(c::Clock, input::Channel, cust::Vector{Int})
cust[1] += 1
@printf("%6.3f: customer %d arrived\n", tau(c), cust[1])
put!(input, cust[1])
end
Random.seed!(123) # set random number seed
const μ = 1/3 # service rate
const λ = 0.9 # arrival rate
count = [0] # a job counter
clock = Clock() # create a clock
input = Channel{Int}(Inf)
output = Channel{Int}(Inf)
for i in 1:3 # start three server processes
@process serve(clock, i, input, output, Exponential(1/μ))
end
# create a repeating event for 10 arrivals
@event arrive(clock, input, count) every Exponential(1/λ) 10
@run! clock 20 # run the clock for 20 time unitsIf we source this program, it runs a simulation.
output:
julia> include("examples/intro.jl")
0.141: customer 1 arrived
0.141: server 1 serving customer 1
1.668: server 1 finished serving 1
2.316: customer 2 arrived
2.316: server 2 serving customer 2
3.154: customer 3 arrived
3.154: server 3 serving customer 3
4.182: customer 4 arrived
4.182: server 1 serving customer 4
4.364: server 3 finished serving 3
4.409: customer 5 arrived
4.409: server 3 serving customer 5
4.533: customer 6 arrived
4.566: server 2 finished serving 2
4.566: server 2 serving customer 6
5.072: customer 7 arrived
5.299: server 3 finished serving 5
5.299: server 3 serving customer 7
5.335: server 1 finished serving 4
5.376: customer 8 arrived
5.376: server 1 serving customer 8
5.833: customer 9 arrived
6.134: customer 10 arrived
6.570: server 1 finished serving 8
6.570: server 1 serving customer 9
6.841: server 3 finished serving 7
6.841: server 3 serving customer 10
8.371: server 2 finished serving 6
10.453: server 1 finished serving 9
10.477: server 3 finished serving 10
"run! finished with 40 clock events, 0 sample steps, simulation time: 20.0"
For further examples see the documentation.
DiscreteEvents is installed with:
pkg> add DiscreteEventsThe development version can be installed with:
pkg> add https://github.com/JuliaDynamics/DiscreteEvents.jlPlease use, test and help to develop DiscreteEvents! 😄
Author: Paul Bayer,
License: MIT
1 DiscreteEvents.jl as of v0.3 has been renamed from Simulate.jl, see issue #13.↩