Tutorial 1: M/M/1 Queue

The M/M/1 queue is a classic model of a queueing system where jobs arrive into an infinite-capacity buffer, wait to be processed in first-come first-served (FCFS) order, and then leave after service completion. Inter-arrival and service times are assumed to be independent and exponentially distributed random variables.

M/M/1 Queue Network Diagram

The general structure of a LINE script consists of four blocks: (1) definition of nodes, (2) definition of job classes and associated statistical distributions, (3) instantiation of model topology, and (4) solution.

% Example 1: A M/M/1 queue
model = Network('M/M/1');
%% Block 1: nodes
source = Source(model, 'Source');
queue = Queue(model, 'Queue', SchedStrategy.FCFS);
sink = Sink(model, 'Sink');
%% Block 2: classes
jobclass = OpenClass(model, 'Class1');
source.setArrival(jobclass, Exp(1));
queue.setService(jobclass, Exp(2));
%% Block 3: topology
model.link(Network.serialRouting(source,queue,sink));
%% Block 4: solution
AvgTable = JMT(model,'seed',23000,'samples',10000).avgTable();
%% select a particular table row using direct indexing
ARow = AvgTable(queue, jobclass)
// Block 1: Create network and nodes
val model = Network("M/M/1")
val source = Source(model, "Source")
val queue = Queue(model, "Queue", SchedStrategy.FCFS)
val sink = Sink(model, "Sink")

// Block 2: Create job class and set service parameters
val jobclass = OpenClass(model, "Class1", 0)
source.setArrival(jobclass, Exp(1.0))  // Arrival rate = 1.0
queue.setService(jobclass, Exp(2.0))   // Service rate = 2.0

// Block 3: Define topology (serial routing)
model.link(Network.serialRouting(source, queue, sink))

// Block 4: Solve using JMT solver and print results
val avgTable = JMT(model, "seed", 23000).avgTable
avgTable.print()
avgTable.tget(queue, jobclass).print()
from line_solver import *

model = Network('M/M/1')
# Block 1: nodes
source = Source(model, 'mySource')
queue = Queue(model, 'myQueue', SchedStrategy.FCFS)
sink = Sink(model, 'mySink')
# Block 2: classes
jobclass = OpenClass(model, 'myClass')
source.set_arrival(jobclass, Exp(1))
queue.set_service(jobclass, Exp(2))
# Block 3: topology
model.link(Network.serial_routing(source, queue, sink))
# Block 4: solution
AvgTable = JMT(model, seed=23000).avg_table()
# select a particular table row
print(tget(AvgTable, queue, jobclass))

Expected Output

ARow =
  1x8 table
    Station    JobClass     QLen      Util       RespT     ResidT      ArvR       Tput
    _______    ________    ______    _______    _______    _______    _______    _______
     Queue      Class1     0.9555    0.48736    0.95429    0.95429    0.99894    0.99987