mdpsolver 0.9.5__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 (28) hide show
  1. {mdpsolver-0.9.5/src/mdpsolver.egg-info → mdpsolver-0.9.7}/PKG-INFO +22 -7
  2. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/README.md +21 -6
  3. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/pyproject.toml +1 -1
  4. {mdpsolver-0.9.5 → 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.5 → mdpsolver-0.9.7/src/mdpsolver.egg-info}/PKG-INFO +22 -7
  12. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver.egg-info/SOURCES.txt +5 -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.5/src/mdpsolver/solvermodule.cp310-win_amd64.pyd +0 -0
  16. mdpsolver-0.9.5/src/mdpsolver/solvermodule.cp311-win_amd64.pyd +0 -0
  17. mdpsolver-0.9.5/src/mdpsolver/solvermodule.cp312-win_amd64.pyd +0 -0
  18. mdpsolver-0.9.5/src/mdpsolver/solvermodule.cpython-310-x86_64-linux-gnu.so +0 -0
  19. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/LICENSE +0 -0
  20. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/MANIFEST.in +0 -0
  21. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/setup.cfg +0 -0
  22. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver/__init__.py +0 -0
  23. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver/problems/__pycache__/cbmaux.cpython-310.pyc +0 -0
  24. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver/problems/__pycache__/tbmaux.cpython-310.pyc +0 -0
  25. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver/problems/cbmaux.py +0 -0
  26. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver/problems/tbmaux.py +0 -0
  27. {mdpsolver-0.9.5 → mdpsolver-0.9.7}/src/mdpsolver.egg-info/dependency_links.txt +0 -0
  28. {mdpsolver-0.9.5 → 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.5
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,28 +17,43 @@ 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
 
30
- # Quick start guide
31
+ # Installation
31
32
 
32
- The following shows how to get quickly started with `mdpsolver`.
33
+ ## Linux
34
+
35
+ Install directly from PyPI with:
36
+
37
+ ```
38
+ pip install mdpsolver
39
+ ```
33
40
 
34
- ## Installation
41
+ MDPSolver works *out of the box* on Linux.
35
42
 
36
- Download and install `mdpsolver` directly from PyPI.
43
+ ## Windows
44
+
45
+ Requires [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) (17.9) with MSVC C++ compiler and libraries installed.
46
+
47
+ After installing Visual Studio (incl. MSVC C++ compiler and libraries), install directly from PyPI with:
37
48
 
38
49
  ```
39
50
  pip install mdpsolver
40
51
  ```
41
52
 
53
+ # Quick start guide
54
+
55
+ The following shows how to get quickly started with `mdpsolver`.
56
+
42
57
  ## Usage
43
58
 
44
59
  Start by specifying the reward function and transition probabilities as lists. The following is an example of a simple MDP containing **three states** and **two actions in each state**.
@@ -2,28 +2,43 @@
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
 
15
- # Quick start guide
16
+ # Installation
16
17
 
17
- The following shows how to get quickly started with `mdpsolver`.
18
+ ## Linux
19
+
20
+ Install directly from PyPI with:
21
+
22
+ ```
23
+ pip install mdpsolver
24
+ ```
18
25
 
19
- ## Installation
26
+ MDPSolver works *out of the box* on Linux.
20
27
 
21
- Download and install `mdpsolver` directly from PyPI.
28
+ ## Windows
29
+
30
+ Requires [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) (17.9) with MSVC C++ compiler and libraries installed.
31
+
32
+ After installing Visual Studio (incl. MSVC C++ compiler and libraries), install directly from PyPI with:
22
33
 
23
34
  ```
24
35
  pip install mdpsolver
25
36
  ```
26
37
 
38
+ # Quick start guide
39
+
40
+ The following shows how to get quickly started with `mdpsolver`.
41
+
27
42
  ## Usage
28
43
 
29
44
  Start by specifying the reward function and transition probabilities as lists. The following is an example of a simple MDP containing **three states** and **two actions in each state**.
@@ -10,7 +10,7 @@ where = ["src"]
10
10
 
11
11
  [project]
12
12
  name = "mdpsolver"
13
- version = "0.9.5"
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.5
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,28 +17,43 @@ 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
 
30
- # Quick start guide
31
+ # Installation
31
32
 
32
- The following shows how to get quickly started with `mdpsolver`.
33
+ ## Linux
34
+
35
+ Install directly from PyPI with:
36
+
37
+ ```
38
+ pip install mdpsolver
39
+ ```
33
40
 
34
- ## Installation
41
+ MDPSolver works *out of the box* on Linux.
35
42
 
36
- Download and install `mdpsolver` directly from PyPI.
43
+ ## Windows
44
+
45
+ Requires [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) (17.9) with MSVC C++ compiler and libraries installed.
46
+
47
+ After installing Visual Studio (incl. MSVC C++ compiler and libraries), install directly from PyPI with:
37
48
 
38
49
  ```
39
50
  pip install mdpsolver
40
51
  ```
41
52
 
53
+ # Quick start guide
54
+
55
+ The following shows how to get quickly started with `mdpsolver`.
56
+
42
57
  ## Usage
43
58
 
44
59
  Start by specifying the reward function and transition probabilities as lists. The following is an example of a simple MDP containing **three states** and **two actions in each state**.
@@ -8,6 +8,8 @@ src/mdpsolver/solvermodule.cp310-win_amd64.pyd
8
8
  src/mdpsolver/solvermodule.cp311-win_amd64.pyd
9
9
  src/mdpsolver/solvermodule.cp312-win_amd64.pyd
10
10
  src/mdpsolver/solvermodule.cpython-310-x86_64-linux-gnu.so
11
+ src/mdpsolver/solvermodule.cpython-311-x86_64-linux-gnu.so
12
+ src/mdpsolver/solvermodule.cpython-312-x86_64-linux-gnu.so
11
13
  src/mdpsolver.egg-info/PKG-INFO
12
14
  src/mdpsolver.egg-info/SOURCES.txt
13
15
  src/mdpsolver.egg-info/dependency_links.txt
@@ -15,4 +17,6 @@ src/mdpsolver.egg-info/top_level.txt
15
17
  src/mdpsolver/problems/cbmaux.py
16
18
  src/mdpsolver/problems/tbmaux.py
17
19
  src/mdpsolver/problems/__pycache__/cbmaux.cpython-310.pyc
18
- 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