QNS (Queueing Network Solver)

The QNS wrapper exposes the corresponding tool for product-form queueing network analysis in the Layered Queueing Network Solver developed by the RADS group at Carleton University. Unlike the LQNS solver, QNS models are ordinary (non-layered) queueing networks.

MethodAlgorithmReference
defaultAutomatic method selection
conwayConway's multi-server
roliaRolia-Sevcik multi-server
zhouZhou-Woodside multi-server
suriSuri's approximation for multi-server
reiserReiser-Lavenberg exact mean value analysis
schmidtSchmidt's approximation

Example

This example demonstrates the QNS solver on a simple tandem queueing network. QNS provides product-form analysis methods for ordinary (non-layered) queueing networks.

% Create an open queueing network (tandem queues)
model = Network('QNS Example');

source = Source(model, 'Source');
queue1 = Queue(model, 'Queue1', SchedStrategy.FCFS);
queue2 = Queue(model, 'Queue2', SchedStrategy.FCFS);
sink = Sink(model, 'Sink');

jobclass = OpenClass(model, 'Class1');

source.setArrival(jobclass, Exp(0.7));
queue1.setService(jobclass, Exp(1.0));
queue2.setService(jobclass, Exp(1.5));

P = model.initRoutingMatrix();
P.set(jobclass, jobclass, source, queue1, 1.0);
P.set(jobclass, jobclass, queue1, queue2, 1.0);
P.set(jobclass, jobclass, queue2, sink, 1.0);
model.link(P);

solver = QNS(model);
QNS(model).avgTable()

Output:

QNS analysis [method: default, lang: matlab] completed in 0.122s.
  2×8 table

    Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
    Queue1      Class1      0       0        0        0         0     0.7
    Queue2      Class1      0       0        0        0       0.7     0.7
// Create an open queueing network (tandem queues)
Network model = new Network("QNS Example");

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

OpenClass jobclass = new OpenClass(model, "Class1");

source.setArrival(jobclass, new Exp(0.7));
queue1.setService(jobclass, new Exp(1.0));
queue2.setService(jobclass, new Exp(1.5));

RoutingMatrix P = model.initRoutingMatrix();
P.set(jobclass, jobclass, source, queue1, 1.0);
P.set(jobclass, jobclass, queue1, queue2, 1.0);
P.set(jobclass, jobclass, queue2, sink, 1.0);
model.link(P);

QNS solver = new QNS(model);
solver.avgTable.print();

Output:

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

  Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
    Queue1      Class1      0       0        0        0         0     0.7
    Queue2      Class1      0       0        0        0       0.7     0.7
# Create an open queueing network (tandem queues)
from line_solver import *

model = Network("QNS Example")

source = Source(model, "Source")
queue1 = Queue(model, "Queue1", SchedStrategy.FCFS)
queue2 = Queue(model, "Queue2", SchedStrategy.FCFS)
sink = Sink(model, "Sink")

jobclass = OpenClass(model, "Class1")

source.set_arrival(jobclass, Exp(0.7))
queue1.set_service(jobclass, Exp(1.0))
queue2.set_service(jobclass, Exp(1.5))

P = model.init_routing_matrix()
P.set(jobclass, jobclass, source, queue1, 1.0)
P.set(jobclass, jobclass, queue1, queue2, 1.0)
P.set(jobclass, jobclass, queue2, sink, 1.0)
model.link(P)

solver = QNS(model)
print(solver.avg_table)

Output:

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

  Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
    Queue1      Class1      0       0        0        0         0     0.7
    Queue2      Class1      0       0        0        0       0.7     0.7