LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
Reward.m
1classdef Reward
2 % REWARD Factory class for common reward function templates
3 %
4 % This class provides static methods for creating common reward functions.
5 % Used with model.setReward() to define metrics on queueing networks.
6 %
7 % Static Methods:
8 % queueLength(node, [jobclass]) - Queue length reward
9 % utilization(node, [jobclass]) - Server utilization reward
10 % blocking(node) - Blocking probability reward
11 % custom(fn) - Wrap a custom function
12 %
13 % Usage:
14 % model.setReward('QLen_Q1', Reward.queueLength(queue1));
15 % model.setReward('Util_Q1', Reward.utilization(queue1));
16 % model.setReward('Block_Q1', Reward.blocking(queue1));
17 % model.setReward('Cost', Reward.custom(@(state) state.at(q1).total()^2));
18 %
19 % See also: RewardState, RewardStateView, setReward
20
21 methods (Static)
22 function fn = queueLength(node, varargin)
23 % QUEUELENGTH Queue length reward function
24 %
25 % FN = QUEUELENGTH(NODE) returns function for total jobs at NODE
26 % FN = QUEUELENGTH(NODE, JOBCLASS) returns function for JOBCLASS jobs
27 %
28 % The returned function is suitable for use with model.setReward()
29 %
30 % Examples:
31 % % Total jobs at queue1
32 % model.setReward('QLen', Reward.queueLength(queue1));
33 %
34 % % Class1 jobs at queue1
35 % model.setReward('QLen_C1', Reward.queueLength(queue1, class1));
36
37 if nargin == 1
38 % Return total jobs at node (all classes)
39 fn = @(state) state.at(node).total();
40 else
41 % Return jobs of specific class at node
42 jobclass = varargin{1};
43 fn = @(state) state.at(node, jobclass);
44 end
45 end
46
47 function fn = utilization(node, varargin)
48 % UTILIZATION Server utilization reward function
49 %
50 % FN = UTILIZATION(NODE) returns function for utilization at NODE
51 % FN = UTILIZATION(NODE, JOBCLASS) returns function for class utilization
52 %
53 % Utilization is computed as min(jobs, nservers), representing the
54 % fraction of servers in use.
55 %
56 % Note: For M/M/1 queues, this simplifies to min(jobs, 1)
57 %
58 % Examples:
59 % model.setReward('Util', Reward.utilization(queue1));
60 % model.setReward('Util_C1', Reward.utilization(queue1, class1));
61
62 if nargin == 1
63 % Total utilization at node (all classes)
64 fn = @(state) compute_utilization(state, node, []);
65 else
66 % Utilization of specific class at node
67 jobclass = varargin{1};
68 fn = @(state) compute_utilization(state, node, jobclass);
69 end
70
71 function util = compute_utilization(state, nd, jc)
72 % Helper function for utilization computation
73 sn = state.sn;
74 stationIdx = sn.nodeToStation(nd.index);
75 if isempty(jc)
76 % Total jobs at station
77 jobs = state.at(nd).total();
78 else
79 % Jobs of specific class
80 jobs = state.at(nd, jc);
81 end
82 nservers = sn.nservers(stationIdx);
83 util = min(jobs, nservers);
84 end
85 end
86
87 function fn = blocking(node)
88 % BLOCKING Blocking probability reward function
89 %
90 % FN = BLOCKING(NODE) returns 1 if NODE is at capacity, 0 otherwise
91 %
92 % This is useful for measuring congestion or capacity violations.
93 %
94 % Example:
95 % model.setReward('Block', Reward.blocking(queue1));
96
97 fn = @(state) compute_blocking(state, node);
98
99 function block = compute_blocking(state, nd)
100 % Helper function for blocking computation
101 sn = state.sn;
102 stationIdx = sn.nodeToStation(nd.index);
103 jobs = state.at(nd).total();
104 capacity = sn.cap(stationIdx);
105 block = double(jobs >= capacity);
106 end
107 end
108
109 function fn = custom(userFn)
110 % CUSTOM Wrap a custom reward function
111 %
112 % FN = CUSTOM(USERFN) returns USERFN unchanged
113 %
114 % This is provided for semantic clarity, making it explicit that
115 % the function is a custom user-defined reward.
116 %
117 % Example:
118 % myReward = @(state) state.at(q1).total()^2 + state.at(q2).total();
119 % model.setReward('Custom', Reward.custom(myReward));
120
121 fn = userFn;
122 end
123 end
124end