1%% Example: Reward Aggregation Operations
2% This example demonstrates the aggregation capabilities of the RewardState API.
4% The RewardStateView
class supports aggregation operations:
5% - total() : Sum all values
6% - max() : Maximum value
7% - min() : Minimum value
8% - count() : Count non-zero entries
10% Copyright (c) 2012-2026, Imperial College London
16% Create a single queue with multiple job
classes
18model = Network('RewardAggregationExample');
21source = Source(model, 'Source');
22queue = Queue(model, 'Queue', SchedStrategy.FCFS);
23sink = Sink(model, 'Sink');
26queue.setNumberOfServers(1);
27queue.setCapacity(4); % Limit state space
30class1 = OpenClass(model, 'HighPriority');
31class2 = OpenClass(model, 'LowPriority');
34source.setArrival(class1, Exp(1.0)); % High priority arrival rate = 1.0
35source.setArrival(class2, Exp(0.8)); % Low priority arrival rate = 0.8
38queue.setService(class1, Exp(3.0));
39queue.setService(class2, Exp(3.0));
41% Routing (same for both classes)
42P = model.initRoutingMatrix;
43P{class1} = Network.serialRouting(source, queue, sink);
44P{class2} = Network.serialRouting(source, queue, sink);
47%% Define Rewards Using Aggregation
48fprintf(
'Defining reward metrics using aggregation operations:\n\n');
50% Total jobs at Queue (all
classes)
51model.setReward(
'TotalJobs', @(state) state.at(queue).total());
52fprintf(
' TotalJobs = state.at(queue).total()\n');
54% Maximum population of any
class at Queue
55model.setReward('MaxClass', @(state) state.at(queue).max());
56fprintf(
' MaxClass = state.at(queue).max()\n');
58% Count of
classes with jobs at Queue
59model.setReward(
'ClassCount', @(state) state.at(queue).count());
60fprintf(
' ClassCount = state.at(queue).count()\n');
63model.setReward(
'HP_Jobs', @(state) state.at(queue, class1));
64fprintf(
' HP_Jobs = state.at(queue, class1)\n');
67model.setReward(
'LP_Jobs', @(state) state.at(queue, class2));
68fprintf(
' LP_Jobs = state.at(queue, class2)\n');
70% Weighted load (high priority weighted 2x)
71model.setReward(
'WeightedLoad', @(state) ...
72 2.0 * state.at(queue, class1) + 1.0 * state.at(queue, class2));
73fprintf(
' WeightedLoad = 2.0 * HP + 1.0 * LP\n');
75%% Solve with CTMC Solver
76fprintf(
'\nSolving with CTMC solver...\n\n');
78options = Solver.defaultOptions;
81solver = CTMC(model, options);
83%% Get Steady-State Expected Rewards
84[R, names] = solver.getAvgReward();
86fprintf(
'=== Steady-State Expected Rewards (Aggregation) ===\n');
87fprintf(
' %-20s: %10.6f\n',
'TotalJobs', R(1));
88fprintf(
' %-20s: %10.6f\n',
'MaxClass', R(2));
89fprintf(
' %-20s: %10.6f\n',
'ClassCount', R(3));
90fprintf(
' %-20s: %10.6f\n',
'HP_Jobs', R(4));
91fprintf(
' %-20s: %10.6f\n',
'LP_Jobs', R(5));
92fprintf(
' %-20s: %10.6f\n',
'WeightedLoad', R(6));
94fprintf(
'\nExample completed successfully.\n');