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.
% 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)
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)
import jline.lang.ClosedClass;
import jline.lang.nodes.Delay;
import jline.solvers.NetworkAvgTable;
import jline.solvers.ctmc.CTMC;
import jline.util.matrix.Matrix;
Network model = new Network("MRP");
Delay delay = new Delay(model, "WorkingState");
Queue queue = new Queue(model, "RepairQueue", SchedStrategy.FCFS);
queue.setNumberOfServers(2);
ClosedClass closedClass = new ClosedClass(model, "Machines", 3, delay);
delay.setService(closedClass, new Exp(0.5));
queue.setService(closedClass, new Exp(4.0));
model.link(Network.serialRouting(delay, queue));
CTMC solver = new CTMC(model);
NetworkAvgTable ctmcAvgTable = solver.avgTable();
ctmcAvgTable.print();
Matrix stateSpace = solver.stateSpace().stateSpace;
Matrix infGen = solver.generator().infGen;
stateSpace.print();
infGen.print();
#include "line/solvers/ctmc/solver_ctmc_analyzer.h"
#include "line/solvers/ctmc/solver_ctmc_getters.h"
const double S = 2, N = 3;
Network model("MRP");
Delay delay(model, "WorkingState");
Queue queue(model, "RepairQueue", SchedStrategy::FCFS);
queue.set_number_of_servers(S);
ClosedClass cclass(model, "Machines", N, delay);
delay.set_service(cclass, Exp(0.5));
queue.set_service(cclass, Exp(4.0));
Routing P;
P.set(delay, queue, 1.0);
P.set(queue, delay, 1.0);
model.link(P);
ctmc::CtmcOptions opt;
const mva::AvgResult<double> res =
ctmc::solver_ctmc_run_analyzer(model.get_struct(), opt);
const ctmc::CtmcStateSpace<double> space =
ctmc::ctmc_get_state_space(model.get_struct(), opt);
const ctmc::CtmcGenerator<double> gen =
ctmc::ctmc_get_generator(model.get_struct(), opt);
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