Tutorial 11: Random Environments
This example demonstrates how to model a queueing system operating in a random environment, where system parameters change according to an underlying environmental process. A server alternates between "Fast" and "Slow" modes with different service rates.
warning off;
% Example 11: Random environments and ENV solver
%% Block 1: Create base network model
baseModel = Network('BaseModel');
delay = Delay(baseModel, 'ThinkTime');
queue = Queue(baseModel, 'Server', SchedStrategy.FCFS);
N = 5;
jobclass = ClosedClass(baseModel, 'Jobs', N, delay);
delay.setService(jobclass, Exp(1.0));
queue.setService(jobclass, Exp(2.0));
baseModel.link(Network.serialRouting(delay, queue));
%% Block 2: Create the random environment
env = Environment('ServerModes');
% Stage 1: Fast mode (service rate = 4.0)
fastModel = baseModel.copy();
fastQueue = fastModel.getNodeByName('Server');
fastQueue.setService(fastModel.classes{1}, Exp(4.0));
env.addStage('Fast', 'operational', fastModel);
% Stage 2: Slow mode (service rate = 1.0)
slowModel = baseModel.copy();
slowQueue = slowModel.getNodeByName('Server');
slowQueue.setService(slowModel.classes{1}, Exp(1.0));
env.addStage('Slow', 'degraded', slowModel);
% Define transitions
env.addTransition('Fast', 'Slow', Exp(0.5));
env.addTransition('Slow', 'Fast', Exp(1.0));
%% Block 3: Solve using SolverENV
env.init();
solverFactory = @(m) FLD(m);
envSolver = ENV(env, solverFactory);
envAvgTable = envSolver.getAvgTable()
Coming soon: Kotlin implementation for random environments is under development.
from line_solver import Network, ClosedClass, Delay, Queue
from line_solver import Environment, ENV, FLD, MVA
from line_solver.constants import SchedStrategy
from line_solver.distributions import Exp
# Block 1: Create base network model
base_model = Network('BaseModel')
delay = Delay(base_model, 'ThinkTime')
queue = Queue(base_model, 'Server', SchedStrategy.FCFS)
N = 5
jobclass = ClosedClass(base_model, 'Jobs', N, delay)
delay.setService(jobclass, Exp(1.0))
queue.setService(jobclass, Exp(2.0))
base_model.link(Network.serialRouting(delay, queue))
# Block 2: Create the random environment
env = Environment('ServerModes', 2)
# Stage 0: Fast mode (service rate = 4.0)
fast_model = base_model.copy()
fast_queue = fast_model.getNodeByName('Server')
fast_queue.setService(fast_model.classes[0], Exp(4.0))
env.addStage(0, 'Fast', 'operational', fast_model)
# Stage 1: Slow mode (service rate = 1.0)
slow_model = base_model.copy()
slow_queue = slow_model.getNodeByName('Server')
slow_queue.setService(slow_model.classes[0], Exp(1.0))
env.addStage(1, 'Slow', 'degraded', slow_model)
# Define transitions
env.addTransition(0, 1, Exp(0.5)) # Fast -> Slow
env.addTransition(1, 0, Exp(1.0)) # Slow -> Fast
# Block 3: Solve using SolverENV
env_solver = ENV(env, lambda m: FLD(m))
env_avg_table = env_solver.getAvgTable()
print(env_avg_table)
Expected Output
envAvgTable =
2x6 table
Station JobClass QLen Util RespT Tput
_________ ________ ______ ______ _______ ______
ThinkTime Jobs 2.9966 2.9966 1 2.9966
Server Jobs 2.0034 1 0.66779 3