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.
| Method | Algorithm | Reference |
|---|---|---|
default | Automatic solver method selection | — |
ssa | Stochastic Simulation Algorithm | — |
serial | Gillespie's direct method (single core) | [1] |
para | Parallel independent replications | — |
parallel | Parallel independent replications (alternate name) | — |
nrm | Next 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
- Gillespie, D. T. (1977). Exact stochastic simulation of coupled chemical reactions. The Journal of Physical Chemistry, 81(25), 2340-2361.
- 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.