Tutorial 3: Machine Interference Problem

The machine interference problem (also known as the repairmen problem) is a classic closed queueing network. A set of machines alternate between working (in a delay node) and being repaired (in a queue with multiple servers). This example demonstrates closed queueing networks and CTMC analysis.

Machine Interference Problem Network Diagram
% Example 3: Machine interference problem
model = Network('MRP');
%% Block 1: nodes
delay = Delay(model,'WorkingState');
queue = Queue(model, 'RepairQueue', SchedStrategy.FCFS);
queue.setNumberOfServers(2);
%% Block 2: classes
cclass = ClosedClass(model, 'Machines', 3, delay);
delay.setService(cclass, Exp(0.5));
queue.setService(cclass, Exp(4.0));
%% Block 3: topology
model.link(Network.serialRouting(delay,queue));
%% Block 4: solution
solver = CTMC(model);
ctmcAvgTable = solver.avgTable()

StateSpace = solver.stateSpace()
InfGen = full(solver.generator())
CTMC.printInfGen(InfGen,StateSpace)
// Example 3: Machine interference problem
val model = Network("MRP")

// Block 1: nodes
val delay = Delay(model, "WorkingState")
val queue = Queue(model, "RepairQueue", SchedStrategy.FCFS)
queue.setNumberOfServers(2)

// Block 2: classes
val cclass = ClosedClass(model, "Machines", 3, delay)
delay.setService(cclass, Exp(0.5))
queue.setService(cclass, Exp(4.0))

// Block 3: topology
model.link(Network.serialRouting(delay, queue))

// Block 4: solution
val solver = CTMC(model)
solver.avgTable.print()
solver.stateSpace.print()
from line_solver import *

model = Network('MRP')
# Block 1: nodes
delay = Delay(model, 'WorkingState')
queue = Queue(model, 'RepairQueue', SchedStrategy.FCFS)
queue.set_number_of_servers(2)
# Block 2: classes
cclass = ClosedClass(model, 'Machines', 3, delay)
delay.set_service(cclass, Exp(0.5))
queue.set_service(cclass, Exp(4.0))
# Block 3: topology
model.link(Network.serial_routing(delay, queue))
# Block 4: solution
solver = CTMC(model)
ctmcAvgTable = solver.avg_table()

stateSpace, nodeStateSpace = solver.state_space()
infGen, eventFilt = solver.generator()
CTMC.print_inf_gen(infGen, stateSpace)

Expected Output

ctmcAvgTable =
      Station       JobClass     QLen       Util       RespT     ResidT      ArvR      Tput
    ____________    ________    _______    _______    _______    _______    ______    ______
    WorkingState    Machines     2.6648     2.6648          2          2    1.3324    1.3324
    RepairQueue     Machines    0.33516    0.16655    0.25154    0.25154    1.3324    1.3324

StateSpace =
     0     1     2
     1     0     2
     2     0     1
     3     0     0

InfGen =
   -8.0000    8.0000         0         0
    0.5000   -8.5000    8.0000         0
         0    1.0000   -5.0000    4.0000
         0         0    1.5000   -1.5000

[0 1 2]->[1 0 2]: 8.000000
[1 0 2]->[0 1 2]: 0.500000
[1 0 2]->[2 0 1]: 8.000000
[2 0 1]->[1 0 2]: 1.000000
[2 0 1]->[3 0 0]: 4.000000
[3 0 0]->[2 0 1]: 1.500000