1classdef rl_env < handle
4 gamma; % discount factor
5 idxOfQueueInNodes; % model.nodes{i} are queues
for i in idxOfQueueInNodes
6 idxOfSourceInNodes; % model.nodes{i} are sources
for i in idxOfQueueInNodes
7 stateSize; % [s_i <= m] are state space to be considered
8 actionSize; % actionSize: number of queues
12 function obj=rl_env(model, idxOfQueueInNodes, idxOfSourceInNodes, stateSize, gamma)
13 obj.model = model.copy;
14 obj.idxOfQueueInNodes = idxOfQueueInNodes; % how to distinguish sources & queues in model
15 obj.idxOfSourceInNodes = idxOfSourceInNodes;
16 obj.stateSize = stateSize;
18 obj.actionSize = length(idxOfQueueInNodes);
21 function r = isInStateSpace(obj,
nodes)
23 for i = obj.idxOfQueueInNodes
24 if sum(
nodes{i}.state) > obj.stateSize
31 function r = isInActionSpace(obj,
nodes)
33 for i = obj.idxOfQueueInNodes
34 if sum(
nodes{i}.state) > obj.stateSize - 1
41 function [t, depNode]=sample(obj) % how to identify the type of
new event
42 solver = SolverSSA(obj.model,
'verbose',
false);
43 sample = solver.sampleSysAggr(1);
45 if sample.event{1}.event==EventType.DEP
46 depNode = sample.event{1}.node;
47 elseif sample.event{2}.event==EventType.DEP
48 depNode = sample.event{2}.node;
52 function update(obj, newState) % how to update model after an
event
53 for i = 1:length(obj.idxOfQueueInNodes) % newState = [#jobsInQueue_i]
54 obj.model.nodes{obj.idxOfQueueInNodes(i)}.state = State.fromMarginal(obj.model, obj.model.nodes{obj.idxOfQueueInNodes(i)}, newState(i));
60 obj.model.initDefault();