DES (Discrete Event Simulation)

The DES solver is a discrete-event simulator implemented using the SSJ (Stochastic Simulation in Java) library in the JAR backend and SimPy in the Python implementation. It has similar support as JMT in terms of models, but it is lighter and thus tends to run faster. A wrapper to call DES is available both in MATLAB and Python.

MethodAlgorithmReference
defaultDiscrete-event simulation (SSJ in JAR, SimPy in Python)

Example

This example demonstrates solving a simple M/M/1 queue using the DES solver with discrete-event simulation. DES is primarily implemented in the JAR backend using the SSJ (Stochastic Simulation in Java) library.

% Create a simple M/M/1 queue
model = Network('M/M/1 Example');
source = Source(model, 'Source');
queue = Queue(model, 'Queue1', SchedStrategy.FCFS);
sink = Sink(model, 'Sink');

jobclass = OpenClass(model, 'Class1');
source.setArrival(jobclass, Exp(0.9));
queue.setService(jobclass, Exp(1.0));

model.link(Network.serialRouting(source, queue, sink));

% Solve with DES (via JAR backend)
solver = DES(model, 'samples', 5000, 'seed', 12345);

% Display average performance metrics
DES(model).avgTable()

Output:

DES analysis [method: default, lang: matlab] completed.

ans =
  2×8 table
    Station    JobClass     QLen      Util      RespT     ResidT     ArvR       Tput
    _______    ________    ______    _______    ______    ______    _______    _______
    Source      Class1          0          0         0         0          0    0.89856
    Queue1      Class1     8.2105    0.88742    9.1954    9.1954    0.89856    0.89315
import jline.lang.*;
import jline.lang.constant.SchedStrategy;
import jline.lang.nodes.*;
import jline.lang.processes.Exp;
import jline.solvers.NetworkAvgTable;
import jline.solvers.des.DES;

public class DESExample {
    public static void main(String[] args) {
        // Create a simple M/M/1 queue
        Network model = new Network("M/M/1 Example");

        Source source = new Source(model, "Source");
        Queue queue = new Queue(model, "Queue1", SchedStrategy.FCFS);
        Sink sink = new Sink(model, "Sink");

        OpenClass jobclass = new OpenClass(model, "Class1");
        source.setArrival(jobclass, Exp.fitRate(0.9));
        queue.setService(jobclass, Exp.fitRate(1.0));

        model.link(Network.serialRouting(source, queue, sink));

        // Solve with DES (Discrete Event Simulation)
        DES solver = new DES(model);
        solver.options.samples = 5000;
        solver.options.seed = 12345;

        // Display average performance metrics
        NetworkAvgTable avgTable = solver.avgTable;
        System.out.println(avgTable);
    }
}

Output:

DES analysis [method: default, lang: java] completed.

Station    JobClass     QLen      Util      RespT     ResidT     ArvR       Tput
Source     Class1       0.0       0.0       0.0       0.0        0.0        0.89856
Queue1     Class1       8.2105    0.88742   9.1954    9.1954     0.89856    0.89315
from line_solver import *

# Create a simple M/M/1 queue
model = Network('M/M/1 Example')

source = Source(model, 'Source')
queue = Queue(model, 'Queue1', SchedStrategy.FCFS)
sink = Sink(model, 'Sink')

jobclass = OpenClass(model, 'Class1')
source.setArrival(jobclass, Exp(0.9))
queue.setService(jobclass, Exp(1.0))

model.link(Network.serialRouting(source, queue, sink))

# Solve with DES (via JAR backend)
solver = DES(model, samples=5000, seed=12345)

# Display average performance metrics
print(solver.avg_table)

Output:

DES analysis [method: default, lang: python] completed.

  Station  JobClass    QLen     Util      RespT    ResidT     ArvR      Tput
0  Source    Class1     0.0      0.0       0.0      0.0        0.0       0.89856
1  Queue1    Class1     8.2105   0.88742   9.1954   9.1954     0.89856   0.89315