1classdef rl_env_general < handle
6 gamma; % discount factor (e.g. = 0.95)
7 idxOfQueueInNodes; % model.
nodes{i} are queues
for i in idxOfQueueInNodes
8 nqueues; % number of queues
9 idxOfActionNodes; % model.nodes{i} are
nodes where actions are needed,
for i in idxOfQueueInNodes
10 stateSize; % Integer: maximal jobs in a queue where policy can be learned; exceeding will result in JSQ policy
11 actionSpace; % {key: [idx1, ..., idxn]};
nodes{key} has a dispatch policy to node{idxi}
15 function obj = rl_env_general(model, idxOfQueueInNodes, idxOfActionNodes, stateSize, gamma)
17 obj.model = model.copy;
18 obj.idxOfQueueInNodes = idxOfQueueInNodes;
19 obj.nqueues = length(idxOfQueueInNodes);
20 obj.idxOfActionNodes = idxOfActionNodes;
21 obj.stateSize = stateSize;
24 obj.actionSpace = containers.Map(
'KeyType',
'int32',
'ValueType',
'any');
25 for i = idxOfActionNodes
26 obj.actionSpace(i) = find(model.connections(i,:)==1);
30 function r = isInStateSpace(obj, state)
31 if length(obj.idxOfQueueInNodes) ~= length(state)
32 line_error(mfilename,
' states size not match. ( state size=%i, required size=%i ) \n', length(state), length(obj.idxOfQueueInNodes));
36 for i = 1:length(obj.idxOfQueueInNodes)
37 if state(i) > obj.stateSize
44% function r = isInStateSpace(obj,
nodes)
46% for i = obj.idxOfQueueInNodes
47% if sum(
nodes{i}.state) > obj.stateSize
54 function r = isInActionSpace(obj, state)
55 if length(obj.idxOfQueueInNodes) ~= length(state)
56 line_error(mfilename,
' states size not match. ( state size=%i, required size=%i ) \n', length(state), length(obj.idxOfQueueInNodes));
60 for i = 1:length(obj.idxOfQueueInNodes)
61 if state(i) > obj.stateSize - 1
68% function r = isInActionSpace(obj,
nodes)
70% for i = obj.idxOfQueueInNodes
71% if sum(
nodes{i}.state) > obj.stateSize - 1
78 function [dt, depNode, arvNode, sample]=sample(obj)
79 solver = SolverSSA(obj.model,
'verbose',
false);
80 sample = solver.sampleSysAggr(1);
82 switch sample.event{1}.event
84 depNode = sample.event{1}.node;
86 arvNode = sample.event{1}.node;
88 line_error(mfilename,
' Not known event type in sample. ( Event1.event=%i ) \n', sample.event{1}.event);
90 switch sample.event{2}.event
92 depNode = sample.event{2}.node;
94 arvNode = sample.event{2}.node;
96 line_error(mfilename,
' Not known event type in sample. ( Event2.event=%i ) \n', sample.event{2}.event);
100% function update(obj, newState)
101%
for i = 1:obj.nqueues % newState = [#jobsInQueue_i]
103% q_idx = obj.idxOfQueueInNodes(i);
104% obj.model.nodes{q_idx}.state = State.fromMarginal(obj.model, obj.model.nodes{q_idx}, tmp);
108 function update(obj, sample)
109 for i = 1:length(sample.event)
110 [obj.model.nodes{sample.event{i}.node}.state, ~] = State.afterEvent(obj.model.getStruct, sample.event{i}.node, obj.model.nodes{sample.event{i}.node}.state, sample.event{i}.event, sample.event{1}.class,
true); % isSimulation =
true or
false, both ok
116 obj.model.initDefault();