2 % REWARD Factory
class for common reward function templates
4 % This
class provides static methods for creating common reward functions.
5 % Used with model.setReward() to define metrics on queueing networks.
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
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));
19 % See also: RewardState, RewardStateView, setReward
22 function fn = queueLength(node, varargin)
23 % QUEUELENGTH Queue length reward function
25 % FN = QUEUELENGTH(NODE) returns function
for total jobs at NODE
26 % FN = QUEUELENGTH(NODE, JOBCLASS) returns function
for JOBCLASS jobs
28 % The returned function
is suitable
for use with model.setReward()
31 % % Total jobs at queue1
32 % model.setReward(
'QLen', Reward.queueLength(queue1));
34 % % Class1 jobs at queue1
35 % model.setReward(
'QLen_C1', Reward.queueLength(queue1, class1));
38 % Return total jobs at node (all
classes)
39 fn = @(state) state.at(node).total();
41 % Return jobs of specific
class at node
43 fn = @(state) state.at(node,
jobclass);
47 function fn = utilization(node, varargin)
48 % UTILIZATION Server utilization reward function
50 % FN = UTILIZATION(NODE) returns function
for utilization at NODE
51 % FN = UTILIZATION(NODE, JOBCLASS) returns function
for class utilization
53 % Utilization
is computed as min(jobs, nservers), representing the
54 % fraction of servers in use.
56 % Note: For M/M/1 queues,
this simplifies to min(jobs, 1)
59 % model.setReward(
'Util', Reward.utilization(queue1));
60 % model.setReward(
'Util_C1', Reward.utilization(queue1, class1));
63 % Total utilization at node (all
classes)
64 fn = @(state) compute_utilization(state, node, []);
66 % Utilization of specific
class at node
68 fn = @(state) compute_utilization(state, node,
jobclass);
71 function util = compute_utilization(state, nd, jc)
72 % Helper function
for utilization computation
74 stationIdx = sn.nodeToStation(nd.index);
76 % Total jobs at station
77 jobs = state.at(nd).total();
79 % Jobs of specific
class
80 jobs = state.at(nd, jc);
82 nservers = sn.nservers(stationIdx);
83 util = min(jobs, nservers);
87 function fn = blocking(node)
88 % BLOCKING Blocking probability reward function
90 % FN = BLOCKING(NODE) returns 1
if NODE
is at capacity, 0 otherwise
92 % This
is useful
for measuring congestion or capacity violations.
95 % model.setReward(
'Block', Reward.blocking(queue1));
97 fn = @(state) compute_blocking(state, node);
99 function block = compute_blocking(state, nd)
100 % Helper function
for blocking computation
102 stationIdx = sn.nodeToStation(nd.index);
103 jobs = state.at(nd).total();
104 capacity = sn.cap(stationIdx);
105 block = double(jobs >= capacity);
109 function fn = custom(userFn)
110 % CUSTOM Wrap a custom reward function
112 % FN = CUSTOM(USERFN) returns USERFN unchanged
114 % This
is provided
for semantic clarity, making it
explicit that
115 % the function
is a custom user-defined reward.
118 % myReward = @(state) state.at(q1).total()^2 + state.at(q2).total();
119 % model.setReward(
'Custom', Reward.custom(myReward));