LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
rl_env_general.m
1classdef rl_env_general < handle
2
3
4 properties
5 model; % network model
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}
12 end
13
14 methods
15 function obj = rl_env_general(model, idxOfQueueInNodes, idxOfActionNodes, stateSize, gamma)
16
17 obj.model = model.copy;
18 obj.idxOfQueueInNodes = idxOfQueueInNodes;
19 obj.nqueues = length(idxOfQueueInNodes);
20 obj.idxOfActionNodes = idxOfActionNodes;
21 obj.stateSize = stateSize;
22 obj.gamma = gamma;
23
24 obj.actionSpace = containers.Map('KeyType', 'int32', 'ValueType','any');
25 for i = idxOfActionNodes
26 obj.actionSpace(i) = find(model.connections(i,:)==1);
27 end
28 end
29
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));
33 end
34
35 r = true;
36 for i = 1:length(obj.idxOfQueueInNodes)
37 if state(i) > obj.stateSize
38 r = false;
39 break
40 end
41 end
42 end
43
44% function r = isInStateSpace(obj, nodes)
45% r = true;
46% for i = obj.idxOfQueueInNodes
47% if sum(nodes{i}.state) > obj.stateSize
48% r = false;
49% break
50% end
51% end
52% end
53
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));
57 end
58
59 r = true;
60 for i = 1:length(obj.idxOfQueueInNodes)
61 if state(i) > obj.stateSize - 1
62 r = false;
63 break
64 end
65 end
66 end
67
68% function r = isInActionSpace(obj, nodes)
69% r = true;
70% for i = obj.idxOfQueueInNodes
71% if sum(nodes{i}.state) > obj.stateSize - 1
72% r = false;
73% break
74% end
75% end
76% end
77
78 function [dt, depNode, arvNode, sample]=sample(obj)
79 solver = SolverSSA(obj.model, 'verbose', false);
80 sample = solver.sampleSysAggr(1);
81 dt = sample.t;
82 switch sample.event{1}.event
83 case EventType.DEP
84 depNode = sample.event{1}.node;
85 case EventType.ARV
86 arvNode = sample.event{1}.node;
87 otherwise
88 line_error(mfilename,' Not known event type in sample. ( Event1.event=%i ) \n', sample.event{1}.event);
89 end
90 switch sample.event{2}.event
91 case EventType.DEP
92 depNode = sample.event{2}.node;
93 case EventType.ARV
94 arvNode = sample.event{2}.node;
95 otherwise
96 line_error(mfilename,' Not known event type in sample. ( Event2.event=%i ) \n', sample.event{2}.event);
97 end
98 end
99
100% function update(obj, newState)
101% for i = 1:obj.nqueues % newState = [#jobsInQueue_i]
102% tmp = newState(i);
103% q_idx = obj.idxOfQueueInNodes(i);
104% obj.model.nodes{q_idx}.state = State.fromMarginal(obj.model, obj.model.nodes{q_idx}, tmp);
105% end
106% end
107
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
111 end
112 end
113
114 function reset(obj)
115 obj.model.reset();
116 obj.model.initDefault();
117 end
118 end
119end
120
Definition mmt.m:92