5 changed files with 199 additions and 0 deletions
			
			
		- 
					1doc/source/advanced_topics.rst
- 
					30examples/exploration/01-exploration.py
- 
					38examples/exploration/02-exploration.py
- 
					4lib/stormpy/examples/files.py
- 
					126lib/stormpy/examples/files/mdp/maze_2.nm
| @ -0,0 +1,30 @@ | |||||
|  | import stormpy | ||||
|  | import stormpy.core | ||||
|  | 
 | ||||
|  | import stormpy.examples | ||||
|  | import stormpy.examples.files | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | def example_exploration_01(): | ||||
|  |     """ | ||||
|  |     Example to exploration of MDPs. | ||||
|  |     :return: | ||||
|  |     """ | ||||
|  |     program = stormpy.parse_prism_program(stormpy.examples.files.prism_pomdp_maze) | ||||
|  |     prop = "R=? [F \"goal\"]" | ||||
|  |     properties = stormpy.parse_properties_for_prism_program(prop, program, None) | ||||
|  |     model = stormpy.build_model(program, properties) | ||||
|  |     print(model.model_type) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |     for state in model.states: | ||||
|  |         if state.id in model.initial_states: | ||||
|  |             print(state) | ||||
|  |         for action in state.actions: | ||||
|  |             for transition in action.transitions: | ||||
|  |                 print("From state {} by action {}, with probability {}, go to state {}".format(state, action, transition.value(), | ||||
|  |                                                                                                transition.column)) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | if __name__ == '__main__': | ||||
|  |     example_exploration_01() | ||||
| @ -0,0 +1,38 @@ | |||||
|  | import stormpy | ||||
|  | import stormpy.core | ||||
|  | 
 | ||||
|  | import stormpy.examples | ||||
|  | import stormpy.examples.files | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | def example_exploration_02(): | ||||
|  |     """ | ||||
|  |     Example to exploration of POMDPs. | ||||
|  |     :return: | ||||
|  |     """ | ||||
|  |     program = stormpy.parse_prism_program(stormpy.examples.files.prism_pomdp_maze) | ||||
|  |     prop = "R=? [F \"goal\"]" | ||||
|  |     properties = stormpy.parse_properties_for_prism_program(prop, program, None) | ||||
|  |     model = stormpy.build_model(program, properties) | ||||
|  |     print(model.model_type) | ||||
|  |     # Internally, POMDPs are just MDPs with additional observation information. | ||||
|  |     # Thus, data structure exploration for MDPs can be applied as before. | ||||
|  |     initial_state = model.initial_states[0] | ||||
|  | 
 | ||||
|  |     for state in model.states: | ||||
|  |         if state.id in model.initial_states: | ||||
|  |             print(state) | ||||
|  |         for action in state.actions: | ||||
|  |             for transition in action.transitions: | ||||
|  |                 print("From state {} by action {}, with probability {}, go to state {}".format(state, action, transition.value(), | ||||
|  |                                                                                   transition.column)) | ||||
|  | 
 | ||||
|  |     print(model.nr_observations) | ||||
|  | 
 | ||||
|  |     for state in model.states: | ||||
|  |         print("State {} has observation id {}".format(state.id, model.observations[state.id])) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | if __name__ == '__main__': | ||||
|  |     example_exploration_02() | ||||
| @ -0,0 +1,126 @@ | |||||
|  | 
 | ||||
|  | 
 | ||||
|  | // maze example (POMDP) | ||||
|  | // slightly extends that presented in | ||||
|  | // Littman, Cassandra and Kaelbling | ||||
|  | // Learning policies for partially observable environments: Scaling up | ||||
|  | // Technical Report CS, Brown University | ||||
|  | // gxn 29/01/16 | ||||
|  | // Made into a MDP for documentation of stormpy. | ||||
|  | 
 | ||||
|  | // state space (value of variable "s") | ||||
|  | 
 | ||||
|  | //  0  1  2  3  4 | ||||
|  | //  5     6     7 | ||||
|  | //  8     9    10 | ||||
|  | // 11     13   12 | ||||
|  | 
 | ||||
|  | // 13 is the target | ||||
|  | 
 | ||||
|  | mdp | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | module maze | ||||
|  | 
 | ||||
|  | 	s : [-1..13]; | ||||
|  | 
 | ||||
|  | 	// initialisation | ||||
|  | 	[] s=-1 -> 1/13 : (s'=0) | ||||
|  | 			 + 1/13 : (s'=1) | ||||
|  | 			 + 1/13 : (s'=2) | ||||
|  | 			 + 1/13 : (s'=3) | ||||
|  | 			 + 1/13 : (s'=4) | ||||
|  | 			 + 1/13 : (s'=5) | ||||
|  | 			 + 1/13 : (s'=6) | ||||
|  | 			 + 1/13 : (s'=7) | ||||
|  | 			 + 1/13 : (s'=8) | ||||
|  | 			 + 1/13 : (s'=9) | ||||
|  | 			 + 1/13 : (s'=10) | ||||
|  | 			 + 1/13 : (s'=11) | ||||
|  | 			 + 1/13 : (s'=12); | ||||
|  | 
 | ||||
|  | 	// moving around the maze | ||||
|  | 
 | ||||
|  | 	[east] s=0 -> (s'=1); | ||||
|  | 	[west] s=0 -> (s'=0); | ||||
|  | 	[north] s=0 -> (s'=0); | ||||
|  | 	[south] s=0 -> (s'=5); | ||||
|  | 
 | ||||
|  | 	[east] s=1 -> (s'=2); | ||||
|  | 	[west] s=1 -> (s'=0); | ||||
|  | 	[north] s=1 -> (s'=1); | ||||
|  | 	[south] s=1 -> (s'=1); | ||||
|  | 
 | ||||
|  | 	[east] s=2 -> (s'=3); | ||||
|  | 	[west] s=2 -> (s'=1); | ||||
|  | 	[north] s=2 -> (s'=2); | ||||
|  | 	[south] s=2 -> (s'=6); | ||||
|  | 
 | ||||
|  | 	[east] s=3 -> (s'=4); | ||||
|  | 	[west] s=3 -> (s'=2); | ||||
|  | 	[north] s=3 -> (s'=3); | ||||
|  | 	[south] s=3 -> (s'=3); | ||||
|  | 
 | ||||
|  | 	[east] s=4 -> (s'=4); | ||||
|  | 	[west] s=4 -> (s'=3); | ||||
|  | 	[north] s=4 -> (s'=4); | ||||
|  | 	[south] s=4 -> (s'=7); | ||||
|  | 
 | ||||
|  | 	[east] s=5 -> (s'=5); | ||||
|  | 	[west] s=5 -> (s'=5); | ||||
|  | 	[north] s=5 -> (s'=0); | ||||
|  | 	[south] s=5 -> (s'=8); | ||||
|  | 
 | ||||
|  | 	[east] s=6 -> (s'=6); | ||||
|  | 	[west] s=6 -> (s'=6); | ||||
|  | 	[north] s=6 -> (s'=2); | ||||
|  | 	[south] s=6 -> (s'=9); | ||||
|  | 
 | ||||
|  | 	[east] s=7 -> (s'=7); | ||||
|  | 	[west] s=7 -> (s'=7); | ||||
|  | 	[north] s=7 -> (s'=4); | ||||
|  | 	[south] s=7 -> (s'=10); | ||||
|  | 
 | ||||
|  | 	[east] s=8 -> (s'=8); | ||||
|  | 	[west] s=8 -> (s'=8); | ||||
|  | 	[north] s=8 -> (s'=5); | ||||
|  | 	[south] s=8 -> (s'=11); | ||||
|  | 
 | ||||
|  | 	[east] s=9 -> (s'=9); | ||||
|  | 	[west] s=9 -> (s'=9); | ||||
|  | 	[north] s=9 -> (s'=6); | ||||
|  | 	[south] s=9 -> (s'=13); | ||||
|  | 
 | ||||
|  | 	[east] s=10 -> (s'=9); | ||||
|  | 	[west] s=10 -> (s'=9); | ||||
|  | 	[north] s=10 -> (s'=7); | ||||
|  | 	[south] s=10 -> (s'=12); | ||||
|  | 	[east] s=11 -> (s'=11); | ||||
|  | 	[west] s=11 -> (s'=11); | ||||
|  | 	[north] s=11 -> (s'=8); | ||||
|  | 	[south] s=11 -> (s'=11); | ||||
|  | 
 | ||||
|  | 	[east] s=12 -> (s'=12); | ||||
|  | 	[west] s=12 -> (s'=12); | ||||
|  | 	[north] s=12 -> (s'=10); | ||||
|  | 	[south] s=12 -> (s'=12); | ||||
|  | 
 | ||||
|  | 	// loop when we reach the target | ||||
|  | 	[done] s=13 -> true; | ||||
|  | 
 | ||||
|  | endmodule | ||||
|  | 
 | ||||
|  | // reward structure (number of steps to reach the target) | ||||
|  | rewards | ||||
|  | 
 | ||||
|  | 	[east] true : 1; | ||||
|  | 	[west] true : 1; | ||||
|  | 	[north] true : 1; | ||||
|  | 	[south] true : 1; | ||||
|  | 
 | ||||
|  | endrewards | ||||
|  | 
 | ||||
|  | // target observation | ||||
|  | label "goal" = s=13; | ||||
|  | 
 | ||||
|  | 
 | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue