SSA (Stochastic Simulation Algorithm)

The SSA solver is a stochastic simulator for continuous-time Markov chains. The state space is not generated upfront but is built during simulation starting from the initial state. The solver offers both serial and parallel execution modes, with the latter supporting independent replications across multiple cores.

MethodAlgorithmReference
defaultAutomatic solver method selection
ssaStochastic Simulation Algorithm
serialGillespie's direct method (single core)[1]
paraParallel independent replications
parallelParallel independent replications (alternate name)
nrmNext Reaction Method[2]

Example

This example demonstrates solving a simple M/M/1 queue using the SSA solver with stochastic simulation. The unique feature shown is the incremental sampling process (10,000 samples) using Gillespie's algorithm to explore the state space.

% 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 SSA (Stochastic Simulation Algorithm)
solver = SSA(model);

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

Output:

Default method: using serial SSA

SSA samples:    100
   200
   ...
  9900
 10000
SSA analysis [method: default/serial, lang: matlab] completed in 2.376s.

ans =
  2×8 table
    Station    JobClass     QLen     Util    RespT     ResidT    ArvR     Tput
    _______    ________    ______    ____    ______    ______    ____    _______
    Source      Class1          0      0          0         0      0         0.9
    Queue1      Class1     7.8089    0.9     8.5969    8.5969    0.9     0.90834
import jline.lang.*;
import jline.lang.constant.SchedStrategy;
import jline.lang.nodes.*;
import jline.lang.processes.Exp;
import jline.solvers.NetworkAvgTable;
import jline.solvers.ssa.SSA;

public class SSAExample {
    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 SSA (Stochastic Simulation Algorithm)
        SSA solver = new SSA(model);

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

Output:

Default method: using serial SSA
SSA samples: 10000
SSA analysis [method: default/serial, lang: java] completed.

Station    JobClass     QLen     Util    RespT     ResidT    ArvR     Tput
Source     Class1       0.0      0.0     0.0       0.0       0.0      0.9
Queue1     Class1       7.8089   0.9     8.5969    8.5969    0.9      0.90834
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 SSA (Stochastic Simulation Algorithm)
solver = SSA(model)

# Display average performance metrics
print(solver.avg_table)

Output:

Default method: using serial SSA
SSA samples: 10000
SSA analysis [method: default/serial, 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.9
1  Queue1    Class1   7.8089  0.9    8.5969  8.5969 0.9   0.90834

References

  1. Gillespie, D. T. (1977). Exact stochastic simulation of coupled chemical reactions. The Journal of Physical Chemistry, 81(25), 2340-2361.
  2. Anderson, D. F. (2007). A modified next reaction method for simulating chemical systems with time dependent propensities and delays. The Journal of Chemical Physics, 127(21), 214107.