mdpsolver 0.9.6__tar.gz → 0.9.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {mdpsolver-0.9.6/src/mdpsolver.egg-info → mdpsolver-0.9.7}/PKG-INFO +5 -4
  2. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/README.md +4 -3
  3. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/pyproject.toml +1 -1
  4. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver/model.py +2 -0
  5. mdpsolver-0.9.7/src/mdpsolver/solvermodule.cp310-win_amd64.pyd +0 -0
  6. mdpsolver-0.9.7/src/mdpsolver/solvermodule.cp311-win_amd64.pyd +0 -0
  7. mdpsolver-0.9.7/src/mdpsolver/solvermodule.cp312-win_amd64.pyd +0 -0
  8. mdpsolver-0.9.7/src/mdpsolver/solvermodule.cpython-310-x86_64-linux-gnu.so +0 -0
  9. mdpsolver-0.9.7/src/mdpsolver/solvermodule.cpython-311-x86_64-linux-gnu.so +0 -0
  10. mdpsolver-0.9.7/src/mdpsolver/solvermodule.cpython-312-x86_64-linux-gnu.so +0 -0
  11. {mdpsolver-0.9.6 → mdpsolver-0.9.7/src/mdpsolver.egg-info}/PKG-INFO +5 -4
  12. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver.egg-info/SOURCES.txt +3 -1
  13. mdpsolver-0.9.7/tests/test1.py +646 -0
  14. mdpsolver-0.9.7/tests/test2.py +75 -0
  15. mdpsolver-0.9.6/src/mdpsolver/solvermodule.cp310-win_amd64.pyd +0 -0
  16. mdpsolver-0.9.6/src/mdpsolver/solvermodule.cp311-win_amd64.pyd +0 -0
  17. mdpsolver-0.9.6/src/mdpsolver/solvermodule.cp312-win_amd64.pyd +0 -0
  18. mdpsolver-0.9.6/src/mdpsolver/solvermodule.cpython-310-x86_64-linux-gnu.so +0 -0
  19. mdpsolver-0.9.6/src/mdpsolver/solvermodule.cpython-311-x86_64-linux-gnu.so +0 -0
  20. mdpsolver-0.9.6/src/mdpsolver/solvermodule.cpython-312-x86_64-linux-gnu.so +0 -0
  21. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/LICENSE +0 -0
  22. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/MANIFEST.in +0 -0
  23. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/setup.cfg +0 -0
  24. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver/__init__.py +0 -0
  25. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver/problems/__pycache__/cbmaux.cpython-310.pyc +0 -0
  26. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver/problems/__pycache__/tbmaux.cpython-310.pyc +0 -0
  27. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver/problems/cbmaux.py +0 -0
  28. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver/problems/tbmaux.py +0 -0
  29. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver.egg-info/dependency_links.txt +0 -0
  30. {mdpsolver-0.9.6 → mdpsolver-0.9.7}/src/mdpsolver.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdpsolver
3
- Version: 0.9.6
3
+ Version: 0.9.7
4
4
  Summary: A fast solver for Markov Decision Processes
5
5
  Author-email: Anders Reenberg Andersen <andersra@live.dk>, Jesper Fink Andersen <jfan@dtu.dk>
6
6
  Project-URL: Homepage, https://github.com/areenberg/MDPSolver
@@ -17,13 +17,14 @@ License-File: LICENSE
17
17
 
18
18
  <img src="https://github.com/areenberg/MDPSolver/blob/anders_development/Images/MDPSolver_logo_3.png" alt="Logo" width="180">
19
19
 
20
- MDPSolver is a Python package for Markov Decision Processes (MDPs) with discounted rewards and infinite-horizon.
20
+ MDPSolver is a Python package for large Markov Decision Processes (MDPs) with infinite-horizons.
21
21
 
22
22
  ## Features
23
23
 
24
24
  * Fast solver: Our C++-based solver is substantially faster than other MDP packages available for Python. See details in the documentation.
25
+ * Two optimality criteria: *Discounted* and *Average* reward.
25
26
  * Three optimization algorithms: *Value iteration*, *Policy iteration*, and *Modified policy iteration*.
26
- * Three value-update methods: *Standard*, *Gauss–Seidel*, *Successive over-relaxation*.
27
+ * Three value-update methods: *Standard*, *Gauss–Seidel*, and *Successive over-relaxation*.
27
28
  * Supports sparse matrices.
28
29
  * Employs parallel computing.
29
30
 
@@ -37,7 +38,7 @@ Install directly from PyPI with:
37
38
  pip install mdpsolver
38
39
  ```
39
40
 
40
- After the installation, MDPSolver works *out of the box*.
41
+ MDPSolver works *out of the box* on Linux.
41
42
 
42
43
  ## Windows
43
44
 
@@ -2,13 +2,14 @@
2
2
 
3
3
  <img src="https://github.com/areenberg/MDPSolver/blob/anders_development/Images/MDPSolver_logo_3.png" alt="Logo" width="180">
4
4
 
5
- MDPSolver is a Python package for Markov Decision Processes (MDPs) with discounted rewards and infinite-horizon.
5
+ MDPSolver is a Python package for large Markov Decision Processes (MDPs) with infinite-horizons.
6
6
 
7
7
  ## Features
8
8
 
9
9
  * Fast solver: Our C++-based solver is substantially faster than other MDP packages available for Python. See details in the documentation.
10
+ * Two optimality criteria: *Discounted* and *Average* reward.
10
11
  * Three optimization algorithms: *Value iteration*, *Policy iteration*, and *Modified policy iteration*.
11
- * Three value-update methods: *Standard*, *Gauss–Seidel*, *Successive over-relaxation*.
12
+ * Three value-update methods: *Standard*, *Gauss–Seidel*, and *Successive over-relaxation*.
12
13
  * Supports sparse matrices.
13
14
  * Employs parallel computing.
14
15
 
@@ -22,7 +23,7 @@ Install directly from PyPI with:
22
23
  pip install mdpsolver
23
24
  ```
24
25
 
25
- After the installation, MDPSolver works *out of the box*.
26
+ MDPSolver works *out of the box* on Linux.
26
27
 
27
28
  ## Windows
28
29
 
@@ -10,7 +10,7 @@ where = ["src"]
10
10
 
11
11
  [project]
12
12
  name = "mdpsolver"
13
- version = "0.9.6"
13
+ version = "0.9.7"
14
14
  authors = [
15
15
  { name="Anders Reenberg Andersen", email="andersra@live.dk" },
16
16
  { name="Jesper Fink Andersen", email="jfan@dtu.dk" },
@@ -17,6 +17,7 @@ class model:
17
17
  algorithm="mpi",
18
18
  tolerance=1e-3,
19
19
  update="standard",
20
+ criterion="discounted",
20
21
  parIterLim=100,
21
22
  SORrelaxation=1.0,
22
23
  initPolicy=list(),
@@ -29,6 +30,7 @@ class model:
29
30
  self.mdl.solve(algorithm=algorithm,
30
31
  tolerance=tolerance,
31
32
  update=update,
33
+ criterion=criterion,
32
34
  parIterLim=parIterLim,
33
35
  SORrelaxation=SORrelaxation,
34
36
  initPolicy=initPolicy,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdpsolver
3
- Version: 0.9.6
3
+ Version: 0.9.7
4
4
  Summary: A fast solver for Markov Decision Processes
5
5
  Author-email: Anders Reenberg Andersen <andersra@live.dk>, Jesper Fink Andersen <jfan@dtu.dk>
6
6
  Project-URL: Homepage, https://github.com/areenberg/MDPSolver
@@ -17,13 +17,14 @@ License-File: LICENSE
17
17
 
18
18
  <img src="https://github.com/areenberg/MDPSolver/blob/anders_development/Images/MDPSolver_logo_3.png" alt="Logo" width="180">
19
19
 
20
- MDPSolver is a Python package for Markov Decision Processes (MDPs) with discounted rewards and infinite-horizon.
20
+ MDPSolver is a Python package for large Markov Decision Processes (MDPs) with infinite-horizons.
21
21
 
22
22
  ## Features
23
23
 
24
24
  * Fast solver: Our C++-based solver is substantially faster than other MDP packages available for Python. See details in the documentation.
25
+ * Two optimality criteria: *Discounted* and *Average* reward.
25
26
  * Three optimization algorithms: *Value iteration*, *Policy iteration*, and *Modified policy iteration*.
26
- * Three value-update methods: *Standard*, *Gauss–Seidel*, *Successive over-relaxation*.
27
+ * Three value-update methods: *Standard*, *Gauss–Seidel*, and *Successive over-relaxation*.
27
28
  * Supports sparse matrices.
28
29
  * Employs parallel computing.
29
30
 
@@ -37,7 +38,7 @@ Install directly from PyPI with:
37
38
  pip install mdpsolver
38
39
  ```
39
40
 
40
- After the installation, MDPSolver works *out of the box*.
41
+ MDPSolver works *out of the box* on Linux.
41
42
 
42
43
  ## Windows
43
44
 
@@ -17,4 +17,6 @@ src/mdpsolver.egg-info/top_level.txt
17
17
  src/mdpsolver/problems/cbmaux.py
18
18
  src/mdpsolver/problems/tbmaux.py
19
19
  src/mdpsolver/problems/__pycache__/cbmaux.cpython-310.pyc
20
- src/mdpsolver/problems/__pycache__/tbmaux.cpython-310.pyc
20
+ src/mdpsolver/problems/__pycache__/tbmaux.cpython-310.pyc
21
+ tests/test1.py
22
+ tests/test2.py
@@ -0,0 +1,646 @@
1
+ import mdpsolver
2
+ import random
3
+ from random import randint
4
+
5
+ #TEST 1
6
+ #Simple MDP with 3 states and 2 actions in each state.
7
+
8
+ #---------------------------------------
9
+ # CONFIGURATION 1
10
+ #---------------------------------------
11
+
12
+ print("## CONFIG. 1 ##\n")
13
+
14
+ #rewards
15
+ #1st index: from (current) states
16
+ #2nd index: actions
17
+ rewards = [[5,-1],
18
+ [1,-2],
19
+ [50,0]]
20
+
21
+ #transition probabilities
22
+ #1st index: from (current) states
23
+ #2nd index: actions
24
+ #3rd index: to (next) states
25
+ tranMatWithZeros = [[[0.9,0.1,0.0],[0.1,0.9,0.0]],
26
+ [[0.4,0.5,0.1],[0.3,0.5,0.2]],
27
+ [[0.2,0.2,0.6],[0.5,0.5,0.0]]]
28
+
29
+ #initial policy
30
+ random.seed(10)
31
+ initPolicy = [randint(0, 1) for p in range(0, 3)]
32
+
33
+ #Model 1a (discounted reward, parallel)
34
+ print("# Model 1a (discounted reward, parallel) #")
35
+ mdl1a = mdpsolver.model()
36
+ mdl1a.mdp(discount=0.95,
37
+ rewards=rewards,
38
+ tranMatWithZeros=tranMatWithZeros)
39
+ mdl1a.solve(algorithm="mpi",
40
+ update="standard",
41
+ parallel=True,
42
+ initPolicy=initPolicy)
43
+ print(mdl1a.getPolicy())
44
+ print(mdl1a.getValueVector())
45
+
46
+ #Model 2a (discounted reward, parallel)
47
+ print("# Model 2a (discounted reward, parallel) #")
48
+ mdl2a = mdpsolver.model()
49
+ mdl2a.mdp(discount=0.95,
50
+ rewards=rewards,
51
+ tranMatWithZeros=tranMatWithZeros)
52
+ mdl2a.solve(algorithm="pi",
53
+ update="standard",
54
+ parallel=True,
55
+ initPolicy=initPolicy)
56
+ print(mdl2a.getPolicy())
57
+ print(mdl2a.getValueVector())
58
+
59
+ #Model 3a (discounted reward, parallel)
60
+ print("# Model 3a (discounted reward, parallel) #")
61
+ mdl3a = mdpsolver.model()
62
+ mdl3a.mdp(discount=0.95,
63
+ rewards=rewards,
64
+ tranMatWithZeros=tranMatWithZeros)
65
+ mdl3a.solve(algorithm="vi",
66
+ update="standard",
67
+ parallel=True)
68
+ print(mdl3a.getPolicy())
69
+ print(mdl3a.getValueVector())
70
+
71
+ #Model 1b (discounted reward, unparallel)
72
+ print("# Model 1b (discounted reward, unparallel) #")
73
+ mdl1b = mdpsolver.model()
74
+ mdl1b.mdp(discount=0.95,
75
+ rewards=rewards,
76
+ tranMatWithZeros=tranMatWithZeros)
77
+ mdl1b.solve(algorithm="mpi",
78
+ update="standard",
79
+ parallel=False,
80
+ initPolicy=initPolicy)
81
+ print(mdl1b.getPolicy())
82
+ print(mdl1b.getValueVector())
83
+
84
+ #Model 2b (discounted reward, unparallel)
85
+ print("# Model 2b (discounted reward, unparallel) #")
86
+ mdl2b = mdpsolver.model()
87
+ mdl2b.mdp(discount=0.95,
88
+ rewards=rewards,
89
+ tranMatWithZeros=tranMatWithZeros)
90
+ mdl2b.solve(algorithm="pi",
91
+ update="standard",
92
+ parallel=False,
93
+ initPolicy=initPolicy)
94
+ print(mdl2b.getPolicy())
95
+ print(mdl2b.getValueVector())
96
+
97
+ #Model 3b (discounted reward, unparallel)
98
+ print("# Model 3b (discounted reward, unparallel) #")
99
+ mdl3b = mdpsolver.model()
100
+ mdl3b.mdp(discount=0.95,
101
+ rewards=rewards,
102
+ tranMatWithZeros=tranMatWithZeros)
103
+ mdl3b.solve(algorithm="vi",
104
+ update="standard",
105
+ parallel=False)
106
+ print(mdl3b.getPolicy())
107
+ print(mdl3b.getValueVector())
108
+
109
+ #Model 1a (average reward, parallel)
110
+ print("# Model 1a (average reward, parallel) #")
111
+ mdl1a = mdpsolver.model()
112
+ mdl1a.mdp(rewards=rewards,
113
+ tranMatWithZeros=tranMatWithZeros)
114
+ mdl1a.solve(algorithm="mpi",
115
+ update="standard",
116
+ criterion="average",
117
+ parallel=True,
118
+ initPolicy=initPolicy)
119
+ print(mdl1a.getPolicy())
120
+ print(mdl1a.getValueVector())
121
+
122
+ #Model 2a (average reward, parallel)
123
+ print("# Model 2a (average reward, parallel) #")
124
+ mdl2a = mdpsolver.model()
125
+ mdl2a.mdp(rewards=rewards,
126
+ tranMatWithZeros=tranMatWithZeros)
127
+ mdl2a.solve(algorithm="pi",
128
+ update="standard",
129
+ criterion="average",
130
+ parallel=True,
131
+ initPolicy=initPolicy)
132
+ print(mdl2a.getPolicy())
133
+ print(mdl2a.getValueVector())
134
+
135
+ #Model 3a (average reward, parallel)
136
+ print("# Model 3a (average reward, parallel) #")
137
+ mdl3a = mdpsolver.model()
138
+ mdl3a.mdp(rewards=rewards,
139
+ tranMatWithZeros=tranMatWithZeros)
140
+ mdl3a.solve(algorithm="vi",
141
+ update="standard",
142
+ criterion="average",
143
+ parallel=True)
144
+ print(mdl3a.getPolicy())
145
+ print(mdl3a.getValueVector())
146
+
147
+ #Model 1b (average reward, unparallel)
148
+ print("# Model 1b (average reward, unparallel) #")
149
+ mdl1b = mdpsolver.model()
150
+ mdl1b.mdp(rewards=rewards,
151
+ tranMatWithZeros=tranMatWithZeros)
152
+ mdl1b.solve(algorithm="mpi",
153
+ update="standard",
154
+ criterion="average",
155
+ parallel=False,
156
+ initPolicy=initPolicy)
157
+ print(mdl1b.getPolicy())
158
+ print(mdl1b.getValueVector())
159
+
160
+ #Model 2b (average reward, unparallel)
161
+ print("# Model 2b (average reward, unparallel) #")
162
+ mdl2b = mdpsolver.model()
163
+ mdl2b.mdp(rewards=rewards,
164
+ tranMatWithZeros=tranMatWithZeros)
165
+ mdl2b.solve(algorithm="pi",
166
+ update="standard",
167
+ criterion="average",
168
+ parallel=False,
169
+ initPolicy=initPolicy)
170
+ print(mdl2b.getPolicy())
171
+ print(mdl2b.getValueVector())
172
+
173
+ #Model 3b (average reward, unparallel)
174
+ print("# Model 3b (average reward, unparallel) #")
175
+ mdl3b = mdpsolver.model()
176
+ mdl3b.mdp(rewards=rewards,
177
+ tranMatWithZeros=tranMatWithZeros)
178
+ mdl3b.solve(algorithm="vi",
179
+ update="standard",
180
+ criterion="average",
181
+ parallel=False)
182
+ print(mdl3b.getPolicy())
183
+ print(mdl3b.getValueVector())
184
+
185
+ #Model 1c (discounted, Gauss-Seidel)
186
+ print("# Model 1c (discounted reward, Gauss-Seidel) #")
187
+ mdl1c = mdpsolver.model()
188
+ mdl1c.mdp(discount=0.95,
189
+ rewards=rewards,
190
+ tranMatWithZeros=tranMatWithZeros)
191
+ mdl1c.solve(algorithm="mpi",
192
+ update="gs",
193
+ parallel=False,
194
+ initPolicy=initPolicy)
195
+ print(mdl1c.getPolicy())
196
+ print(mdl1c.getValueVector())
197
+
198
+ #Model 2c (Gauss-Seidel)
199
+ print("# Model 2c (discounted reward, Gauss-Seidel) #")
200
+ initPolicy=[1,1,1]
201
+ mdl2c = mdpsolver.model()
202
+ mdl2c.mdp(discount=0.95,
203
+ rewards=rewards,
204
+ tranMatWithZeros=tranMatWithZeros)
205
+ mdl2c.solve(algorithm="pi",
206
+ update="gs",
207
+ parallel=False,
208
+ initPolicy=initPolicy)
209
+ print(mdl2c.getPolicy())
210
+ print(mdl2c.getValueVector())
211
+
212
+ #Model 3c (Gauss-Seidel)
213
+ print("# Model 3c (discounted reward, Gauss-Seidel) #")
214
+ mdl3c = mdpsolver.model()
215
+ mdl3c.mdp(discount=0.95,
216
+ rewards=rewards,
217
+ tranMatWithZeros=tranMatWithZeros)
218
+ mdl3c.solve(algorithm="vi",
219
+ update="gs",
220
+ parallel=False)
221
+ print(mdl3c.getPolicy())
222
+ print(mdl3c.getValueVector())
223
+
224
+ #Model 1d (SOR)
225
+ print("# Model 1d (discounted reward, SOR) #")
226
+ mdl1d = mdpsolver.model()
227
+ mdl1d.mdp(discount=0.95,
228
+ rewards=rewards,
229
+ tranMatWithZeros=tranMatWithZeros)
230
+ mdl1d.solve(algorithm="mpi",
231
+ update="sor",
232
+ SORrelaxation=1.01,
233
+ parallel=False,
234
+ initPolicy=initPolicy)
235
+ print(mdl1d.getPolicy())
236
+ print(mdl1d.getValueVector())
237
+
238
+ #Model 2d (SOR)
239
+ print("# Model 2d (discounted reward, SOR) #")
240
+ mdl2d = mdpsolver.model()
241
+ mdl2d.mdp(discount=0.95,
242
+ rewards=rewards,
243
+ tranMatWithZeros=tranMatWithZeros)
244
+ mdl2d.solve(algorithm="pi",
245
+ update="sor",
246
+ SORrelaxation=1.01,
247
+ parallel=False,
248
+ initPolicy=initPolicy)
249
+ print(mdl2d.getPolicy())
250
+ print(mdl2d.getValueVector())
251
+
252
+ #Model 3d (SOR)
253
+ print("# Model 3d (discounted reward, SOR) #")
254
+ mdl3d = mdpsolver.model()
255
+ mdl3d.mdp(discount=0.95,
256
+ rewards=rewards,
257
+ tranMatWithZeros=tranMatWithZeros)
258
+ mdl3d.solve(algorithm="vi",
259
+ update="sor",
260
+ SORrelaxation=1.01,
261
+ parallel=False)
262
+ print(mdl3d.getPolicy())
263
+ print(mdl3d.getValueVector())
264
+
265
+ #---------------------------------------
266
+ # CONFIGURATION 2
267
+ #---------------------------------------
268
+
269
+ print("\n ## CONFIG. 2 ##\n")
270
+
271
+ #rewards
272
+ #1st index: from (current) states
273
+ #2nd index: actions
274
+ rewards = [[5,-1],
275
+ [1,-2],
276
+ [50,0]]
277
+
278
+ #transition probabilities
279
+ #[from_state,action,to_state,probability]
280
+ tranMatElementwise = [[0,0,0,0.9],
281
+ [0,0,1,0.1],
282
+ [0,1,0,0.1],
283
+ [0,1,1,0.9],
284
+ [1,0,0,0.4],
285
+ [1,0,1,0.5],
286
+ [1,0,2,0.1],
287
+ [1,1,0,0.3],
288
+ [1,1,1,0.5],
289
+ [1,1,2,0.2],
290
+ [2,0,0,0.2],
291
+ [2,0,1,0.2],
292
+ [2,0,2,0.6],
293
+ [2,1,0,0.5],
294
+ [2,1,1,0.5]]
295
+
296
+ #initial policy
297
+ random.seed(10)
298
+ initPolicy = [randint(0, 1) for p in range(0, 3)]
299
+
300
+ #Model 1a
301
+ print("# Model 1a #")
302
+ mdl1a = mdpsolver.model()
303
+ mdl1a.mdp(discount=0.95,
304
+ rewards=rewards,
305
+ tranMatElementwise=tranMatElementwise)
306
+ mdl1a.solve(algorithm="mpi",
307
+ update="standard",
308
+ parallel=True,
309
+ initPolicy=initPolicy)
310
+ print(mdl1a.getPolicy())
311
+ print(mdl1a.getValueVector())
312
+
313
+ #Model 2a
314
+ print("# Model 2a #")
315
+ mdl2a = mdpsolver.model()
316
+ mdl2a.mdp(discount=0.95,
317
+ rewards=rewards,
318
+ tranMatElementwise=tranMatElementwise)
319
+ mdl2a.solve(algorithm="pi",
320
+ update="standard",
321
+ parallel=True,
322
+ initPolicy=initPolicy)
323
+ print(mdl2a.getPolicy())
324
+ print(mdl2a.getValueVector())
325
+
326
+ #Model 3a
327
+ print("# Model 3a #")
328
+ mdl3a = mdpsolver.model()
329
+ mdl3a.mdp(discount=0.95,
330
+ rewards=rewards,
331
+ tranMatElementwise=tranMatElementwise)
332
+ mdl3a.solve(algorithm="vi",
333
+ update="standard",
334
+ parallel=True)
335
+ print(mdl3a.getPolicy())
336
+ print(mdl3a.getValueVector())
337
+
338
+ #Model 1b
339
+ print("# Model 1b #")
340
+ mdl1b = mdpsolver.model()
341
+ mdl1b.mdp(discount=0.95,
342
+ rewards=rewards,
343
+ tranMatElementwise=tranMatElementwise)
344
+ mdl1b.solve(algorithm="mpi",
345
+ update="standard",
346
+ parallel=False,
347
+ initPolicy=initPolicy)
348
+ print(mdl1b.getPolicy())
349
+ print(mdl1b.getValueVector())
350
+
351
+ #Model 2b
352
+ print("# Model 2b #")
353
+ mdl2b = mdpsolver.model()
354
+ mdl2b.mdp(discount=0.95,
355
+ rewards=rewards,
356
+ tranMatElementwise=tranMatElementwise)
357
+ mdl2b.solve(algorithm="pi",
358
+ update="standard",
359
+ parallel=False,
360
+ initPolicy=initPolicy)
361
+ print(mdl2b.getPolicy())
362
+ print(mdl2b.getValueVector())
363
+
364
+ #Model 3b
365
+ print("# Model 3b #")
366
+ mdl3b = mdpsolver.model()
367
+ mdl3b.mdp(discount=0.95,
368
+ rewards=rewards,
369
+ tranMatElementwise=tranMatElementwise)
370
+ mdl3b.solve(algorithm="vi",
371
+ update="standard",
372
+ parallel=False)
373
+ print(mdl3b.getPolicy())
374
+ print(mdl3b.getValueVector())
375
+
376
+ #Model 1c
377
+ print("# Model 1c #")
378
+ mdl1c = mdpsolver.model()
379
+ mdl1c.mdp(discount=0.95,
380
+ rewards=rewards,
381
+ tranMatElementwise=tranMatElementwise)
382
+ mdl1c.solve(algorithm="mpi",
383
+ update="gs",
384
+ parallel=False,
385
+ initPolicy=initPolicy)
386
+ print(mdl1c.getPolicy())
387
+ print(mdl1c.getValueVector())
388
+
389
+ #Model 2c
390
+ print("# Model 2c #")
391
+ mdl2c = mdpsolver.model()
392
+ mdl2c.mdp(discount=0.95,
393
+ rewards=rewards,
394
+ tranMatElementwise=tranMatElementwise)
395
+ mdl2c.solve(algorithm="pi",
396
+ update="gs",
397
+ parallel=False,
398
+ initPolicy=initPolicy)
399
+ print(mdl2c.getPolicy())
400
+ print(mdl2c.getValueVector())
401
+
402
+ #Model 3c
403
+ print("# Model 3c #")
404
+ mdl3c = mdpsolver.model()
405
+ mdl3c.mdp(discount=0.95,
406
+ rewards=rewards,
407
+ tranMatElementwise=tranMatElementwise)
408
+ mdl3c.solve(algorithm="vi",
409
+ update="gs",
410
+ parallel=False)
411
+ print(mdl3c.getPolicy())
412
+ print(mdl3c.getValueVector())
413
+
414
+ #Model 1d
415
+ print("# Model 1d #")
416
+ mdl1d = mdpsolver.model()
417
+ mdl1d.mdp(discount=0.95,
418
+ rewards=rewards,
419
+ tranMatElementwise=tranMatElementwise)
420
+ mdl1d.solve(algorithm="mpi",
421
+ update="sor",
422
+ SORrelaxation=1.01,
423
+ parallel=False,
424
+ initPolicy=initPolicy)
425
+ print(mdl1d.getPolicy())
426
+ print(mdl1d.getValueVector())
427
+
428
+ #Model 2d
429
+ print("# Model 2d #")
430
+ mdl2d = mdpsolver.model()
431
+ mdl2d.mdp(discount=0.95,
432
+ rewards=rewards,
433
+ tranMatElementwise=tranMatElementwise)
434
+ mdl2d.solve(algorithm="pi",
435
+ update="sor",
436
+ SORrelaxation=1.01,
437
+ parallel=False,
438
+ initPolicy=initPolicy)
439
+ print(mdl2d.getPolicy())
440
+ print(mdl2d.getValueVector())
441
+
442
+ #Model 3d
443
+ print("# Model 3d #")
444
+ mdl3d = mdpsolver.model()
445
+ mdl3d.mdp(discount=0.95,
446
+ rewards=rewards,
447
+ tranMatElementwise=tranMatElementwise)
448
+ mdl3d.solve(algorithm="vi",
449
+ update="sor",
450
+ SORrelaxation=1.01,
451
+ parallel=False)
452
+ print(mdl3d.getPolicy())
453
+ print(mdl3d.getValueVector())
454
+
455
+ #---------------------------------------
456
+ # CONFIGURATION 3
457
+ #---------------------------------------
458
+
459
+ print("\n ## CONFIG. 3 ##\n")
460
+
461
+ #rewards
462
+ #1st index: from (current) states
463
+ #2nd index: actions
464
+ rewards = [[5,-1],
465
+ [1,-2],
466
+ [50,0]]
467
+
468
+ #transition probabilities
469
+ tranMatProbs = [[[0.9,0.1],[0.1,0.9]],
470
+ [[0.4,0.5,0.1],[0.3,0.5,0.2]],
471
+ [[0.2,0.2,0.6],[0.5,0.5]]]
472
+
473
+ tranMatColumns = [[[0,1],[0,1]],
474
+ [[0,1,2],[0,1,2]],
475
+ [[0,1,2],[0,1]]]
476
+
477
+ #initial policy
478
+ random.seed(10)
479
+ initPolicy = [randint(0, 1) for p in range(0, 3)]
480
+
481
+ #Model 1a
482
+ print("# Model 1a #")
483
+ mdl1a = mdpsolver.model()
484
+ mdl1a.mdp(discount=0.95,
485
+ rewards=rewards,
486
+ tranMatProbs=tranMatProbs,
487
+ tranMatColumns=tranMatColumns)
488
+ mdl1a.solve(algorithm="mpi",
489
+ update="standard",
490
+ parallel=True,
491
+ initPolicy=initPolicy)
492
+ print(mdl1a.getPolicy())
493
+ print(mdl1a.getValueVector())
494
+
495
+ #Model 2a
496
+ print("# Model 2a #")
497
+ mdl2a = mdpsolver.model()
498
+ mdl2a.mdp(discount=0.95,
499
+ rewards=rewards,
500
+ tranMatProbs=tranMatProbs,
501
+ tranMatColumns=tranMatColumns)
502
+ mdl2a.solve(algorithm="pi",
503
+ update="standard",
504
+ parallel=True,
505
+ initPolicy=initPolicy)
506
+ print(mdl2a.getPolicy())
507
+ print(mdl2a.getValueVector())
508
+
509
+ #Model 3a
510
+ print("# Model 3a #")
511
+ mdl3a = mdpsolver.model()
512
+ mdl3a.mdp(discount=0.95,
513
+ rewards=rewards,
514
+ tranMatProbs=tranMatProbs,
515
+ tranMatColumns=tranMatColumns)
516
+ mdl3a.solve(algorithm="vi",
517
+ update="standard",
518
+ parallel=True)
519
+ print(mdl3a.getPolicy())
520
+ print(mdl3a.getValueVector())
521
+
522
+ #Model 1b
523
+ print("# Model 1b #")
524
+ mdl1b = mdpsolver.model()
525
+ mdl1b.mdp(discount=0.95,
526
+ rewards=rewards,
527
+ tranMatProbs=tranMatProbs,
528
+ tranMatColumns=tranMatColumns)
529
+ mdl1b.solve(algorithm="mpi",
530
+ update="standard",
531
+ parallel=False,
532
+ initPolicy=initPolicy)
533
+ print(mdl1b.getPolicy())
534
+ print(mdl1b.getValueVector())
535
+
536
+ #Model 2b
537
+ print("# Model 2b #")
538
+ mdl2b = mdpsolver.model()
539
+ mdl2b.mdp(discount=0.95,
540
+ rewards=rewards,
541
+ tranMatProbs=tranMatProbs,
542
+ tranMatColumns=tranMatColumns)
543
+ mdl2b.solve(algorithm="pi",
544
+ update="standard",
545
+ parallel=False,
546
+ initPolicy=initPolicy)
547
+ print(mdl2b.getPolicy())
548
+ print(mdl2b.getValueVector())
549
+
550
+ #Model 3b
551
+ print("# Model 3b #")
552
+ mdl3b = mdpsolver.model()
553
+ mdl3b.mdp(discount=0.95,
554
+ rewards=rewards,
555
+ tranMatProbs=tranMatProbs,
556
+ tranMatColumns=tranMatColumns)
557
+ mdl3b.solve(algorithm="vi",
558
+ update="standard",
559
+ parallel=False)
560
+ print(mdl3b.getPolicy())
561
+ print(mdl3b.getValueVector())
562
+
563
+ #Model 1c
564
+ print("# Model 1c #")
565
+ mdl1c = mdpsolver.model()
566
+ mdl1c.mdp(discount=0.95,
567
+ rewards=rewards,
568
+ tranMatProbs=tranMatProbs,
569
+ tranMatColumns=tranMatColumns)
570
+ mdl1c.solve(algorithm="mpi",
571
+ update="gs",
572
+ parallel=False,
573
+ initPolicy=initPolicy)
574
+ print(mdl1c.getPolicy())
575
+ print(mdl1c.getValueVector())
576
+
577
+ #Model 2c
578
+ print("# Model 2c #")
579
+ mdl2c = mdpsolver.model()
580
+ mdl2c.mdp(discount=0.95,
581
+ rewards=rewards,
582
+ tranMatProbs=tranMatProbs,
583
+ tranMatColumns=tranMatColumns)
584
+ mdl2c.solve(algorithm="pi",
585
+ update="gs",
586
+ parallel=False,
587
+ initPolicy=initPolicy)
588
+ print(mdl2c.getPolicy())
589
+ print(mdl2c.getValueVector())
590
+
591
+ #Model 3c
592
+ print("# Model 3c #")
593
+ mdl3c = mdpsolver.model()
594
+ mdl3c.mdp(discount=0.95,
595
+ rewards=rewards,
596
+ tranMatProbs=tranMatProbs,
597
+ tranMatColumns=tranMatColumns)
598
+ mdl3c.solve(algorithm="vi",
599
+ update="gs",
600
+ parallel=False)
601
+ print(mdl3c.getPolicy())
602
+ print(mdl3c.getValueVector())
603
+
604
+ #Model 1d
605
+ print("# Model 1d #")
606
+ mdl1d = mdpsolver.model()
607
+ mdl1d.mdp(discount=0.95,
608
+ rewards=rewards,
609
+ tranMatProbs=tranMatProbs,
610
+ tranMatColumns=tranMatColumns)
611
+ mdl1d.solve(algorithm="mpi",
612
+ update="sor",
613
+ SORrelaxation=1.01,
614
+ parallel=False,
615
+ initPolicy=initPolicy)
616
+ print(mdl1d.getPolicy())
617
+ print(mdl1d.getValueVector())
618
+
619
+ #Model 2d
620
+ print("# Model 2d #")
621
+ mdl2d = mdpsolver.model()
622
+ mdl2d.mdp(discount=0.95,
623
+ rewards=rewards,
624
+ tranMatProbs=tranMatProbs,
625
+ tranMatColumns=tranMatColumns)
626
+ mdl2d.solve(algorithm="pi",
627
+ update="sor",
628
+ SORrelaxation=1.01,
629
+ parallel=False,
630
+ initPolicy=initPolicy)
631
+ print(mdl2d.getPolicy())
632
+ print(mdl2d.getValueVector())
633
+
634
+ #Model 3d
635
+ print("# Model 3d #")
636
+ mdl3d = mdpsolver.model()
637
+ mdl3d.mdp(discount=0.95,
638
+ rewards=rewards,
639
+ tranMatProbs=tranMatProbs,
640
+ tranMatColumns=tranMatColumns)
641
+ mdl3d.solve(algorithm="vi",
642
+ update="sor",
643
+ SORrelaxation=1.01,
644
+ parallel=False)
645
+ print(mdl3d.getPolicy())
646
+ print(mdl3d.getValueVector())
@@ -0,0 +1,75 @@
1
+ import mdpsolver
2
+ import example_model
3
+
4
+ #TEST 2
5
+ #In this test, we load the rewards and transition probabilities
6
+ #from two CSV-files (rewards_example.csv and transitions.csv).
7
+ #In addition, we test three optimization algorithms and compare
8
+ #the runtimes.
9
+
10
+ #PROBLEM DESCRIPTION: We derive the policy for a decision problem
11
+ #involving a queueing system with finite capacity and two customer
12
+ #types. The system is observed whenever a new customer arrives.
13
+ #Customers are not allowed to wait and can only be accepted if there
14
+ #are idle servers. Thus, with each arrival, we must choose whether
15
+ #to accept or reject the customer. We receive a low reward for
16
+ #accepting the first, more common type, and a high reward for
17
+ #accepting the second, rarer type.
18
+
19
+ #---------------------------------------
20
+ # CREATE PARAMETERS
21
+ #---------------------------------------
22
+
23
+ #rewards
24
+ capacity=100
25
+ rewardCust1=1
26
+ rewardCust2=1000
27
+ example_model.rewards(capacity,rewardCust1,rewardCust2,"rewards_example2.csv")
28
+
29
+ #transitions
30
+ arrRate1=50
31
+ arrRate2=10
32
+ serRate=3/4
33
+ example_model.tranMat(arrRate1,arrRate2,serRate,capacity,"transitions_example2.csv")
34
+
35
+ #---------------------------------------
36
+ # VALUE ITERATION
37
+ #---------------------------------------
38
+
39
+ mdl1 = mdpsolver.model()
40
+
41
+ mdl1.mdp(discount=0.99,
42
+ rewardsFromFile="rewards_example2.csv",
43
+ tranMatFromFile="transitions_example2.csv")
44
+
45
+ mdl1.solve(algorithm="vi")
46
+
47
+ print("Value iteration:",mdl1.getRuntime(),"milliseconds.")
48
+
49
+ #---------------------------------------
50
+ # POLICY ITERATION
51
+ #---------------------------------------
52
+
53
+ mdl2 = mdpsolver.model()
54
+
55
+ mdl2.mdp(discount=0.99,
56
+ rewardsFromFile="rewards_example2.csv",
57
+ tranMatFromFile="transitions_example2.csv")
58
+
59
+ mdl2.solve(algorithm="pi")
60
+
61
+ print("Policy iteration:",mdl2.getRuntime(),"milliseconds.")
62
+
63
+ #---------------------------------------
64
+ # MODIFIED POLICY ITERATION
65
+ #---------------------------------------
66
+
67
+ mdl3 = mdpsolver.model()
68
+
69
+ mdl3.mdp(discount=0.99,
70
+ rewardsFromFile="rewards_example2.csv",
71
+ tranMatFromFile="transitions_example2.csv")
72
+
73
+ mdl3.solve(algorithm="mpi")
74
+
75
+ print("Modified policy iteration:",mdl3.getRuntime(),"milliseconds.")
File without changes
File without changes
File without changes