LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
rewardModel_aggregation.m
1%% Example: Reward Aggregation Operations
2% This example demonstrates the aggregation capabilities of the RewardState API.
3%
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
9%
10% Copyright (c) 2012-2026, Imperial College London
11% All rights reserved.
12
13clear; clc;
14
15%% Model Definition
16% Create a single queue with multiple job classes
17
18model = Network('RewardAggregationExample');
19
20% Nodes
21source = Source(model, 'Source');
22queue = Queue(model, 'Queue', SchedStrategy.FCFS);
23sink = Sink(model, 'Sink');
24
25% Queue parameters
26queue.setNumberOfServers(1);
27queue.setCapacity(4); % Limit state space
28
29% Job classes
30class1 = OpenClass(model, 'HighPriority');
31class2 = OpenClass(model, 'LowPriority');
32
33% Arrivals
34source.setArrival(class1, Exp(1.0)); % High priority arrival rate = 1.0
35source.setArrival(class2, Exp(0.8)); % Low priority arrival rate = 0.8
36
37% Service times
38queue.setService(class1, Exp(3.0));
39queue.setService(class2, Exp(3.0));
40
41% Routing (same for both classes)
42P = model.initRoutingMatrix;
43P{class1} = Network.serialRouting(source, queue, sink);
44P{class2} = Network.serialRouting(source, queue, sink);
45model.link(P);
46
47%% Define Rewards Using Aggregation
48fprintf('Defining reward metrics using aggregation operations:\n\n');
49
50% Total jobs at Queue (all classes)
51model.setReward('TotalJobs', @(state) state.at(queue).total());
52fprintf(' TotalJobs = state.at(queue).total()\n');
53
54% Maximum population of any class at Queue
55model.setReward('MaxClass', @(state) state.at(queue).max());
56fprintf(' MaxClass = state.at(queue).max()\n');
57
58% Count of classes with jobs at Queue
59model.setReward('ClassCount', @(state) state.at(queue).count());
60fprintf(' ClassCount = state.at(queue).count()\n');
61
62% HighPriority jobs
63model.setReward('HP_Jobs', @(state) state.at(queue, class1));
64fprintf(' HP_Jobs = state.at(queue, class1)\n');
65
66% LowPriority jobs
67model.setReward('LP_Jobs', @(state) state.at(queue, class2));
68fprintf(' LP_Jobs = state.at(queue, class2)\n');
69
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');
74
75%% Solve with CTMC Solver
76fprintf('\nSolving with CTMC solver...\n\n');
77
78options = Solver.defaultOptions;
79options.verbose = 0;
80
81solver = CTMC(model, options);
82
83%% Get Steady-State Expected Rewards
84[R, names] = solver.getAvgReward();
85
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));
93
94fprintf('\nExample completed successfully.\n');