commit
						8f7efe48db
					
				 3 changed files with 227 additions and 0 deletions
			
			
		- 
					71first_try.prism
- 
					78test.py
- 
					78test_model.py
| @ -0,0 +1,71 @@ | |||
| mdp | |||
| 
 | |||
| const int initY = 40; | |||
| const int initX = 80; | |||
| 
 | |||
| const int maxY = 240; | |||
| const int minX = 12; | |||
| const int maxX = 147; | |||
| 
 | |||
| 
 | |||
| formula HitTree = (122<x & x<139) & (220<y & y=232); | |||
| formula HitGate = ((x=51 | x=79) & y=164); | |||
| 
 | |||
| formula PassedGates = (158<y & y<165 & 51<x & x<79); | |||
| 
 | |||
| global move : [0..3] init 0; | |||
| 
 | |||
| module skier | |||
|   ski_position : [1..14] init 8; | |||
|   done : bool init false; | |||
| 
 | |||
|   [left]  !done & move=0 & ski_position>1 -> (ski_position'=ski_position-1) & (move'=1) & (done'=(PassedGates|HitTree|HitGate)); | |||
|   [right] !done & move=0 & ski_position<14 -> (ski_position'=ski_position+1) & (move'=1) & (done'=(PassedGates|HitTree|HitGate)); | |||
|   [noop]  !done & move=0 -> (move'=1) & (done'=(PassedGates|HitTree|HitGate)); | |||
| 
 | |||
|   [left]  done & move=0 & ski_position>1 -> (ski_position'=ski_position-1) & (move'=1); | |||
|   [right] done & move=0 & ski_position<14 -> (ski_position'=ski_position+1) & (move'=1); | |||
|   [noop]  done & move=0 -> (move'=1); | |||
| 
 | |||
| endmodule | |||
| 
 | |||
| module updateY | |||
|   y : [initY..maxY] init initY; | |||
|   standstill : [0..8] init 0; | |||
|   [update_y] move=1 & (ski_position=1 | ski_position = 14) & standstill>=5 -> (y'=y)  & (standstill'=min(8,standstill+1)) & (move'=2); | |||
|   [update_y] move=1 & (ski_position=1 | ski_position = 14) & standstill<5  -> (y'=min(maxY,y+4)) & (standstill'=min(8,standstill+1)) & (move'=2); | |||
|   [update_y] move=1 & (ski_position=2 | ski_position = 3 | ski_position = 12 | ski_position = 13) -> (y'=min(maxY,y+8))  & (standstill'=0) & (move'=2); | |||
|   [update_y] move=1 & (ski_position=4 | ski_position = 5 | ski_position = 10 | ski_position = 11) -> (y'=min(maxY,y+12)) & (standstill'=0) & (move'=2); | |||
|   [update_y] move=1 & (ski_position=6 | ski_position = 7 | ski_position =  8 | ski_position =  9) -> (y'=min(maxY,y+16)) & (standstill'=0) & (move'=2); | |||
| endmodule | |||
| 
 | |||
| module updateX | |||
|   x : [minX..maxX] init initX; | |||
| 
 | |||
|   [update_x]  move=2 & standstill>=8                                       -> (move'=0); | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=7 | ski_position=8)    -> (move'=0); | |||
| 
 | |||
|   [update_x]  move=2 & standstill<8 &  ski_position=6                      -> 0.1: (x'=max(minX,x-3)) + 0.7: (x'=max(minX,x-4)) + 0.2: (x'=max(minX,x-5)) & (move'=0); | |||
|   [update_x]  move=2 & standstill<8 &  ski_position=9                      -> 0.1: (x'=min(maxX,x+3)) + 0.7: (x'=min(maxX,x+4)) + 0.2: (x'=min(maxX,x+5)) & (move'=0); | |||
| 
 | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=4 | ski_position=5)    -> 0.1: (x'=max(minX,x-5)) + 0.7: (x'=max(minX,x-6)) + 0.2: (x'=max(minX,x-7)) & (move'=0); | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=10 | ski_position=11)  -> 0.1: (x'=min(maxX,x+5)) + 0.7: (x'=min(maxX,x+6)) + 0.2: (x'=min(maxX,x+7)) & (move'=0); | |||
| 
 | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=2 | ski_position=3)    -> 0.1: (x'=max(minX,x-5)) + 0.7: (x'=max(minX,x-6)) + 0.2: (x'=max(minX,x-7)) & (move'=0); | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=12 | ski_position=13)  -> 0.1: (x'=min(maxX,x+5)) + 0.7: (x'=min(maxX,x+6)) + 0.2: (x'=min(maxX,x+7)) & (move'=0); | |||
| 
 | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=1)                     -> 0.1: (x'=max(minX,x-0)) + 0.7: (x'=max(minX,x-2)) + 0.2: (x'=max(minX,x-3)) & (move'=0); | |||
|   [update_x]  move=2 & standstill<8 & (ski_position=14)                    -> 0.1: (x'=min(maxX,x+0)) + 0.7: (x'=min(maxX,x+2)) + 0.2: (x'=min(maxX,x+3)) & (move'=0); | |||
| endmodule | |||
| 
 | |||
| rewards | |||
|   [left]  !done & PassedGates : 100; | |||
|   [right] !done & PassedGates : 100; | |||
|   [noop]  !done & PassedGates : 100; | |||
|   [left]  !done & (HitTree) : -200; | |||
|   [right] !done & (HitTree) : -200; | |||
|   [noop]  !done & (HitTree) : -200; | |||
|   [left]  !done & (HitGate) : -150; | |||
|   [right] !done & (HitGate) : -150; | |||
|   [noop]  !done & (HitGate) : -150; | |||
| endrewards | |||
| @ -0,0 +1,78 @@ | |||
| import gym | |||
| from PIL import Image | |||
| from copy import deepcopy | |||
| import numpy as np | |||
| 
 | |||
| from matplotlib import pyplot as plt | |||
| import readchar | |||
| 
 | |||
| import queue | |||
| 
 | |||
| ski_position_queue = queue.Queue() | |||
| 
 | |||
| env = gym.make("ALE/Skiing-v5", render_mode="human") | |||
| 
 | |||
| 
 | |||
| observation, info = env.reset() | |||
| y = 40 | |||
| 
 | |||
| 
 | |||
| standstillcounter = 0 | |||
| def update_y(y, ski_position): | |||
|     global standstillcounter | |||
|     if ski_position in [6,7, 8,9]: | |||
|         standstillcounter = 0 | |||
|         y_update = 16 | |||
|     elif ski_position in [4,5, 10,11]: | |||
|         standstillcounter = 0 | |||
|         y_update = 12 | |||
|     elif ski_position in [2,3, 12,13]: | |||
|         standstillcounter = 0 | |||
|         y_update = 8 | |||
|     elif ski_position in [1, 14] and standstillcounter >= 5: | |||
|         if standstillcounter >= 8: | |||
|             print("!!!!!!!!!! no more x updates!!!!!!!!!!!") | |||
|         y_update = 0 | |||
|     elif ski_position in [1, 14]: | |||
|         y_update = 4 | |||
| 
 | |||
|     if ski_position in [1, 14]: | |||
|         standstillcounter += 1 | |||
|     return y_update | |||
| 
 | |||
| def update_ski_position(ski_position, action): | |||
|     if action == 0: | |||
|         return ski_position | |||
|     elif action == 1: | |||
|         return min(ski_position+1, 14) | |||
|     elif action == 2: | |||
|         return max(ski_position-1, 1) | |||
| 
 | |||
| approx_x_coordinate = 80 | |||
| ski_position = 8 | |||
| for _ in range(1000000): | |||
|     action = env.action_space.sample()  # agent policy that uses the observation and info | |||
|     action = int(repr(readchar.readchar())[1]) | |||
|     ski_position = update_ski_position(ski_position, action) | |||
|     y_update = update_y(y, ski_position) | |||
|     y += y_update if y_update else 0 | |||
| 
 | |||
|     old_x = deepcopy(approx_x_coordinate) | |||
|     approx_x_coordinate = int(np.mean(np.where(observation[:,:,1] == 92)[1])) | |||
|     print(f"Action: {action},\tski position: {ski_position},\ty_update: {y_update},\ty: {y},\tx: {approx_x_coordinate},\tx_update:{approx_x_coordinate - old_x}") | |||
|     observation, reward, terminated, truncated, info = env.step(action) | |||
|     if terminated or truncated: | |||
|         observation, info = env.reset() | |||
| 
 | |||
| 
 | |||
|     observation, reward, terminated, truncated, info = env.step(0) | |||
|     observation, reward, terminated, truncated, info = env.step(0) | |||
|     observation, reward, terminated, truncated, info = env.step(0) | |||
|     observation, reward, terminated, truncated, info = env.step(0) | |||
| 
 | |||
|     #plt.imshow(observation) | |||
|     #plt.show() | |||
|     #im = Image.fromarray(observation) | |||
|     #im.save("init.png") | |||
| 
 | |||
| env.close() | |||
| @ -0,0 +1,78 @@ | |||
| import time, re, sys, csv, os | |||
| 
 | |||
| from subprocess import call | |||
| from os import listdir, system | |||
| from os.path import isfile, join, getctime | |||
| from dataclasses import dataclass, field | |||
| 
 | |||
| ski_position_to_rgb_map = {1: "230, 138, 0", | |||
|                            2: "255,153,0", | |||
|                            3: "255, 184, 77", | |||
|                            4: "255, 194, 100", | |||
|                            5: "255, 194, 120", | |||
|                            6: "255, 210, 130", | |||
|                            7: "255, 210, 140", | |||
|                            8: "230, 204, 255", | |||
|                            9: "204, 153, 255", | |||
|                            10: "255, 102, 179", | |||
|                            11: "255, 51, 153", | |||
|                            12: "255, 0, 255", | |||
|                            13: "179, 0, 179", | |||
|                            14: "102, 0, 102"} | |||
| 
 | |||
| def convert(tuples): | |||
|     return dict(tuples) | |||
| @dataclass(frozen=True) | |||
| class State: | |||
|     x: int | |||
|     y: int | |||
|     ski_position: int | |||
| 
 | |||
| def default_value(): | |||
|     return {'action' : None, 'choiceValue' : None} | |||
| 
 | |||
| @dataclass(frozen=True) | |||
| class StateValue: | |||
|     ranking: float | |||
|     choices: dict = field(default_factory=default_value) | |||
| def exec(command): | |||
|     print(f"Executing {command}") | |||
|     system(f"echo {command} >> list_of_exec") | |||
|     return system(command) | |||
| 
 | |||
| def fillStateRanking(file_name, match=""): | |||
|     state_ranking = dict() | |||
|     try: | |||
|         with open(file_name, "r") as f: | |||
|             file_content = f.readlines() | |||
|         for line in file_content: | |||
|             if match and skip_line.match(line): continue | |||
|             stateMapping = convert(re.findall(r"([a-zA-Z_]*[a-zA-Z])=(\d+)?", line)) | |||
|             #print("stateMapping", stateMapping) | |||
|             choices = convert(re.findall(r"[a-zA-Z_]*(left|right|noop)[a-zA-Z_]*:(-?\d+\.?\d*)", line)) | |||
|             #print("choices", choices) | |||
|             ranking_value = float(re.search(r"Value:([+-]?(\d*\.\d+)|\d+)", line)[0].replace("Value:","")) | |||
|             #print("ranking_value", ranking_value) | |||
|             state = State(int(stateMapping["x"]), int(stateMapping["y"]), int(stateMapping["ski_position"])) | |||
|             value = StateValue(ranking_value, choices) | |||
|             state_ranking[state] = value | |||
|         return state_ranking | |||
| 
 | |||
|     except EnvironmentError: | |||
|         print("TODO file not available. Exiting.") | |||
|         sys.exit(1) | |||
| 
 | |||
| ranking = fillStateRanking("action_ranking") | |||
| sorted_ranking = sorted(ranking.items(), key=lambda x: x[1].ranking) | |||
| 
 | |||
| draw_commands = list() | |||
| 
 | |||
| for state in sorted_ranking[-20:-1]: | |||
|     print(state) | |||
|     x = state[0].x | |||
|     y = state[0].y | |||
|     markerSize = 2 | |||
|     print(state[0].ski_position) | |||
|     draw_commands.append(f"-fill 'rgba({ski_position_to_rgb_map[state[0].ski_position]},0.7)' -draw 'rectangle {x-markerSize},{y-markerSize} {x+markerSize},{y+markerSize} '") | |||
| command = f"convert init.png  {' '.join(draw_commands)} first_try.png" | |||
| exec(command) | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue