From 751b8647ab70ec6a90c90d42e64c83bcc6724ac5 Mon Sep 17 00:00:00 2001 From: Krzysztof Stefan Rudnicki Date: Sun, 21 May 2023 14:44:36 +0200 Subject: [PATCH 01/10] Initial commit --- README.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..48cd9c7c --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# group_17_EARIN_lab_6 + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://gitlab-stud.elka.pw.edu.pl/krudnic3/group_17_earin_lab_6.git +git branch -M main +git push -uf origin main +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://gitlab-stud.elka.pw.edu.pl/krudnic3/group_17_earin_lab_6/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. From ccf8380d32802368a72d481e1105ea9f4dcad5ab Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 14:49:12 +0200 Subject: [PATCH 02/10] feat: add project requirements --- EARIN_Lab_6.pdf | Bin 0 -> 46067 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 EARIN_Lab_6.pdf diff --git a/EARIN_Lab_6.pdf b/EARIN_Lab_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c082e1f5573ae43865da6941b025ae8a850bc9a3 GIT binary patch literal 46067 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 L2{*U8p2q(HVvwt- literal 0 HcmV?d00001 From 297fce2a8ab7b4c161bc66d0813b2d96180062e4 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 15:11:56 +0200 Subject: [PATCH 03/10] feat: init requirements --- main.py | 0 requirements.yml | 10 ++++++++++ run_conda.sh | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 main.py create mode 100644 requirements.yml create mode 100755 run_conda.sh diff --git a/main.py b/main.py new file mode 100644 index 00000000..e69de29b diff --git a/requirements.yml b/requirements.yml new file mode 100644 index 00000000..cb483ef2 --- /dev/null +++ b/requirements.yml @@ -0,0 +1,10 @@ +name: rl-env +channels: + - conda-forge + - defaults +dependencies: + - gymnasium + - matplotlib + - moviepy + - numpy + - python=3.9 diff --git a/run_conda.sh b/run_conda.sh new file mode 100755 index 00000000..456b3b80 --- /dev/null +++ b/run_conda.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +conda env create -f environment.yml \ No newline at end of file From 78ea388285024a004d9ac8eb9e459c6c12ba540d Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 15:19:00 +0200 Subject: [PATCH 04/10] feat: update requirements, inital code snippet --- main.py | 28 ++++++++++++++++++++++++++++ requirements.yml | 1 + vid/rl-video-episode-3.meta.json | 1 + vid/rl-video-episode-3.mp4 | Bin 0 -> 35718 bytes 4 files changed, 30 insertions(+) create mode 100644 vid/rl-video-episode-3.meta.json create mode 100644 vid/rl-video-episode-3.mp4 diff --git a/main.py b/main.py index e69de29b..a907164c 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,28 @@ +import gymnasium as gym + +if __name__ == "__main__": + # init env + env = gym.make("MountainCar-v0", render_mode="rgb_array") + + # wrapper to record the video at 3rd episode and saves it to the folder + # 'vid' + env = gym.wrappers.RecordVideo( + env, video_folder="vid", episode_trigger=lambda x: x == 3 + ) + + # an episode ends if goal is reached or other game ending factors (e.g. + # reached max steps) + n_episodes = 4 + for episode in range(n_episodes): # iterate episodes + state, info = env.reset() # reset the env to an initial state + done = False # boolean to stop an episode + + while not done: # iterate steps + # randomly choose a sample + action = env.action_space.sample() + # take the action (step) and observe the state and reward + next_state, reward, terminated, truncated, info = env.step(action) + # condition to stop an episode + done = terminated or truncated + + env.close() diff --git a/requirements.yml b/requirements.yml index cb483ef2..de1caf6d 100644 --- a/requirements.yml +++ b/requirements.yml @@ -8,3 +8,4 @@ dependencies: - moviepy - numpy - python=3.9 + - pygame diff --git a/vid/rl-video-episode-3.meta.json b/vid/rl-video-episode-3.meta.json new file mode 100644 index 00000000..4e13da84 --- /dev/null +++ b/vid/rl-video-episode-3.meta.json @@ -0,0 +1 @@ +{"step_id": 600, "episode_id": 3, "content_type": "video/mp4"} \ No newline at end of file diff --git a/vid/rl-video-episode-3.mp4 b/vid/rl-video-episode-3.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..12d1ce2dfce1d515a19f37927428c587813b57f0 GIT binary patch literal 35718 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
#k)!QA()9~1N-}C{?RKEe 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 Date: Sun, 21 May 2023 19:01:43 +0200 Subject: [PATCH 05/10] feat: initial commit, --- .gitignore | 162 +++++++++++++++++++++++++++++++++++++++++++++++ .pylintrc | 3 + main.py | 161 +++++++++++++++++++++++++++++++++++++++------- requirements.yml | 1 + 4 files changed, 305 insertions(+), 22 deletions(-) create mode 100644 .gitignore create mode 100644 .pylintrc diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c0b6fe20 --- /dev/null +++ b/.gitignore @@ -0,0 +1,162 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +vid \ No newline at end of file diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..aceec323 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,3 @@ +[DESIGN] +# Maximum number of statements in function / method body +max-statements=16 diff --git a/main.py b/main.py index a907164c..0748b9ce 100644 --- a/main.py +++ b/main.py @@ -1,28 +1,145 @@ +""" +Code used to solve MountainCar-v0 gymnasium problem using Q-Learning algorithm +""" +from datetime import datetime import gymnasium as gym +import numpy as np -if __name__ == "__main__": - # init env - env = gym.make("MountainCar-v0", render_mode="rgb_array") - # wrapper to record the video at 3rd episode and saves it to the folder - # 'vid' +def initialize_environment(): + """ + Initialize environment and video recording + """ + # Initialize environment + env = gym.make('MountainCar-v0', render_mode='rgb_array') + # Save video + now = datetime.now() + time_string = now.strftime("%H:%M:%S") env = gym.wrappers.RecordVideo( - env, video_folder="vid", episode_trigger=lambda x: x == 3 - ) + env, + video_folder='vid', + episode_trigger=lambda x: x == 1, + disable_logger=False, + name_prefix=time_string) + return env - # an episode ends if goal is reached or other game ending factors (e.g. - # reached max steps) - n_episodes = 4 - for episode in range(n_episodes): # iterate episodes - state, info = env.reset() # reset the env to an initial state - done = False # boolean to stop an episode - - while not done: # iterate steps - # randomly choose a sample - action = env.action_space.sample() - # take the action (step) and observe the state and reward - next_state, reward, terminated, truncated, info = env.step(action) - # condition to stop an episode - done = terminated or truncated - env.close() +def initialize_q_table(env): + """ + Initialize "empty" Q-table + """ + # Initialize Q-table + n_actions = env.action_space.n # Number of possible actions, should be 3 + # 0 accelerate left + # 1 dont accelerate + # 2 accelerate to the right + q_table = np.zeros((n_actions,)) + return q_table + + +def initialize_hyperparameters(): + """ + Initialize hyperparameters used by algorithm + """ + hyperparameters = { + "learning_rate": 0.1, + "discount_factor": 0.99, + "epsilon": 0.2, + "max_episodes": 1 + } + return hyperparameters + + +def choose_action(hyperparameters, env, q_table): + """ + Choose one of 3 actions possible for the algorithm + """ + # hyperparameters["epsilon"]-greedy exploration-exploitation tradeoff + if np.random.uniform(0, 1) < hyperparameters["epsilon"]: + action = env.action_space.sample() # Choose a random action + else: + # Choose the action with the highest Q-value + action = np.argmax(q_table) + return action + + +def update_q_table(q_table, action, hyperparameters, reward): + """ + Update q_table with newest reward + """ + # Q-table update + q_value = q_table[action] + max_q_value = np.max(q_table) + new_q_value = (1 - hyperparameters["learning_rate"]) * q_value + \ + hyperparameters["learning_rate"] * \ + (reward + hyperparameters["discount_factor"] * max_q_value) + q_table[action] = new_q_value + return q_table + + +def movement(hyperparameters, env, q_table, total_reward=0): + """ + Choose action and observe consequences + """ + action = choose_action(hyperparameters, env, q_table) + # Take the action and observe the next state + next_state, reward, terminated, truncated, info = env.step(action) + done = terminated or truncated + q_table = update_q_table(q_table, action, hyperparameters, reward) + + total_reward += reward + return hyperparameters, env, q_table, done, total_reward + + +def episode_step(env, hyperparameters, q_table, episode_rewards): + """ + Actions done with every episode + """ + state, _ = env.reset() # Reset the environment to an initial state + done = False # Boolean to indicate episode completion + total_reward = 0 # Accumulate rewards for the episode + + while not done: + hyperparameters, env, q_table, done, total_reward = movement( + hyperparameters, env, q_table, total_reward) + + episode_rewards.append(total_reward) + return env, hyperparameters, q_table, episode_rewards + + +def training_loop(hyperparameters, env, q_table): + """ + Actual training for MountainCar + """ + episode_rewards = [] # List to store episode rewards + + for episode in range(hyperparameters["max_episodes"]): + env, hyperparameters, q_table, episode_rewards = episode_step( + env, hyperparameters, q_table, episode_rewards) + + return env, q_table + + +def inference(env, q_table): + """ + Inference using the updated Q-table + """ + state, _ = env.reset() + done = False + + while not done: + # Choose the action with the highest Q-value + action = np.argmax(q_table) + # Take the action and observe the next state + next_state, reward, terminated, truncated, info = env.step(action) + done = terminated or truncated + + +if __name__ == '__main__': + ENV = initialize_environment() + Q_TABLE = initialize_q_table(ENV) + HYPERPARAMETERS = initialize_hyperparameters() + ENV, Q_TABLE = training_loop(HYPERPARAMETERS, ENV, Q_TABLE) + inference(ENV, Q_TABLE) + + ENV.close() diff --git a/requirements.yml b/requirements.yml index de1caf6d..3000663b 100644 --- a/requirements.yml +++ b/requirements.yml @@ -9,3 +9,4 @@ dependencies: - numpy - python=3.9 - pygame + - opencv-python From a605caef2b2918d189e0c4029a58620537c4e79a Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 19:17:38 +0200 Subject: [PATCH 06/10] feat: make code conform to pep8 --- main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 0748b9ce..e46be2f5 100644 --- a/main.py +++ b/main.py @@ -83,7 +83,7 @@ def movement(hyperparameters, env, q_table, total_reward=0): """ action = choose_action(hyperparameters, env, q_table) # Take the action and observe the next state - next_state, reward, terminated, truncated, info = env.step(action) + _, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated q_table = update_q_table(q_table, action, hyperparameters, reward) @@ -95,7 +95,7 @@ def episode_step(env, hyperparameters, q_table, episode_rewards): """ Actions done with every episode """ - state, _ = env.reset() # Reset the environment to an initial state + env.reset() # Reset the environment to an initial state done = False # Boolean to indicate episode completion total_reward = 0 # Accumulate rewards for the episode @@ -113,7 +113,7 @@ def training_loop(hyperparameters, env, q_table): """ episode_rewards = [] # List to store episode rewards - for episode in range(hyperparameters["max_episodes"]): + for _ in range(hyperparameters["max_episodes"]): env, hyperparameters, q_table, episode_rewards = episode_step( env, hyperparameters, q_table, episode_rewards) @@ -124,14 +124,14 @@ def inference(env, q_table): """ Inference using the updated Q-table """ - state, _ = env.reset() + env.reset() done = False while not done: # Choose the action with the highest Q-value action = np.argmax(q_table) # Take the action and observe the next state - next_state, reward, terminated, truncated, info = env.step(action) + _, terminated, truncated, _ = env.step(action) done = terminated or truncated From b8522b90bbc1f606047802e9e93ead8a1cde3d80 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 19:18:50 +0200 Subject: [PATCH 07/10] fix: ValueError: too many values to unpack (expected 4) --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index e46be2f5..03a42d0c 100644 --- a/main.py +++ b/main.py @@ -131,7 +131,7 @@ def inference(env, q_table): # Choose the action with the highest Q-value action = np.argmax(q_table) # Take the action and observe the next state - _, terminated, truncated, _ = env.step(action) + _, _, terminated, truncated, _ = env.step(action) done = terminated or truncated From 135083a5a52ef21da1cc2d706feb43eadfcb938e Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 19:59:14 +0200 Subject: [PATCH 08/10] feat: move hyperparameters before initializaiton of environment --- main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 03a42d0c..6e0d98ed 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ import gymnasium as gym import numpy as np -def initialize_environment(): +def initialize_environment(hyperparameters): """ Initialize environment and video recording """ @@ -18,7 +18,7 @@ def initialize_environment(): env = gym.wrappers.RecordVideo( env, video_folder='vid', - episode_trigger=lambda x: x == 1, + episode_trigger=lambda x: x == hyperparameters["max_episodes"], disable_logger=False, name_prefix=time_string) return env @@ -45,7 +45,7 @@ def initialize_hyperparameters(): "learning_rate": 0.1, "discount_factor": 0.99, "epsilon": 0.2, - "max_episodes": 1 + "max_episodes": 1000 } return hyperparameters @@ -136,9 +136,9 @@ def inference(env, q_table): if __name__ == '__main__': - ENV = initialize_environment() - Q_TABLE = initialize_q_table(ENV) HYPERPARAMETERS = initialize_hyperparameters() + ENV = initialize_environment(HYPERPARAMETERS) + Q_TABLE = initialize_q_table(ENV) ENV, Q_TABLE = training_loop(HYPERPARAMETERS, ENV, Q_TABLE) inference(ENV, Q_TABLE) From 8075421c49b17e17f235bb7144f3cb8c5c764c2b Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 21:16:58 +0200 Subject: [PATCH 09/10] feat: implement positonal and velocity arguments --- main.py | 76 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/main.py b/main.py index 6e0d98ed..3dde8d0a 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,23 @@ from datetime import datetime import gymnasium as gym import numpy as np +# Helper function to discretize the state + + +def discretize_state(state, env, first_time): + # print( + # f"state: {state}, state[0]: {state[0]}, env.observation_space.low: {env.observation_space.low}") + # print(f"state[0] - env {state[0] - env.observation_space.low}") + # print(f"state - env {state - env.observation_space.low}") + if first_time: + substract_from_state = state[0] - env.observation_space.low + else: + substract_from_state = state - env.observation_space.low + discretized_state = ( + substract_from_state) * np.array([10, 100]) + discretized_state = np.round(discretized_state, 0).astype(int) + return discretized_state + def initialize_environment(hyperparameters): """ @@ -18,9 +35,8 @@ def initialize_environment(hyperparameters): env = gym.wrappers.RecordVideo( env, video_folder='vid', - episode_trigger=lambda x: x == hyperparameters["max_episodes"], - disable_logger=False, - name_prefix=time_string) + disable_logger=True, + name_prefix=time_string, episode_trigger=lambda x: x > 600 and x % 2 == 0) return env @@ -29,11 +45,15 @@ def initialize_q_table(env): Initialize "empty" Q-table """ # Initialize Q-table - n_actions = env.action_space.n # Number of possible actions, should be 3 + # n_actions = env.action_space.n # Number of possible actions, should be 3 # 0 accelerate left # 1 dont accelerate # 2 accelerate to the right - q_table = np.zeros((n_actions,)) + # q_table = np.zeros((n_actions,)) + num_states = (env.observation_space.high - + env.observation_space.low) * np.array([10, 100]) + num_states = np.round(num_states, 0).astype(int) + 1 + q_table = np.zeros((num_states[0], num_states[1], env.action_space.n)) return q_table @@ -45,12 +65,17 @@ def initialize_hyperparameters(): "learning_rate": 0.1, "discount_factor": 0.99, "epsilon": 0.2, - "max_episodes": 1000 + "max_episodes": 1000, + "max_steps": 500, + "min_max_car_position": [-1.2, 0.6], + "min_max_car_velocity": [-0.07, 0.07], + "goal_x": 0.5, + "truncation": 200 } return hyperparameters -def choose_action(hyperparameters, env, q_table): +def choose_action(hyperparameters, env, q_table, discretized_state): """ Choose one of 3 actions possible for the algorithm """ @@ -59,7 +84,7 @@ def choose_action(hyperparameters, env, q_table): action = env.action_space.sample() # Choose a random action else: # Choose the action with the highest Q-value - action = np.argmax(q_table) + action = np.argmax(q_table[discretized_state[0], discretized_state[1]]) return action @@ -77,31 +102,40 @@ def update_q_table(q_table, action, hyperparameters, reward): return q_table -def movement(hyperparameters, env, q_table, total_reward=0): +def movement(hyperparameters, env, q_table, discretized_state, total_reward=0, episode_number=0): """ Choose action and observe consequences """ - action = choose_action(hyperparameters, env, q_table) + action = choose_action(hyperparameters, env, q_table, discretized_state) # Take the action and observe the next state - _, reward, terminated, truncated, _ = env.step(action) - done = terminated or truncated - q_table = update_q_table(q_table, action, hyperparameters, reward) + next_state, reward, terminated, truncated, _ = env.step(action) + discretized_next_state = discretize_state(next_state, env, False) + # print(discretized_next_state[0], discretized_next_state[1]) + q_table[discretized_state[0], discretized_state[1], action] += hyperparameters["learning_rate"] * (reward + hyperparameters["discount_factor"] * np.max( + q_table[discretized_next_state[0], discretized_next_state[1]]) - q_table[discretized_state[0], discretized_state[1], action]) total_reward += reward - return hyperparameters, env, q_table, done, total_reward + discretized_state = discretized_next_state + done = terminated or truncated + if terminated: + print("Destination reached on episode: ", episode_number) + return hyperparameters, env, q_table, done, discretized_state, total_reward -def episode_step(env, hyperparameters, q_table, episode_rewards): +def episode_step(env, hyperparameters, q_table, episode_rewards, episode_number): """ Actions done with every episode """ - env.reset() # Reset the environment to an initial state + state = env.reset() # Reset the environment to an initial state + discretized_state = discretize_state(state, env, True) done = False # Boolean to indicate episode completion total_reward = 0 # Accumulate rewards for the episode - while not done: - hyperparameters, env, q_table, done, total_reward = movement( - hyperparameters, env, q_table, total_reward) + for step in range(hyperparameters["max_steps"]): + hyperparameters, env, q_table, done, discretized_state, total_reward = movement( + hyperparameters, env, q_table, discretized_state, total_reward, episode_number) + if done: + break episode_rewards.append(total_reward) return env, hyperparameters, q_table, episode_rewards @@ -113,9 +147,9 @@ def training_loop(hyperparameters, env, q_table): """ episode_rewards = [] # List to store episode rewards - for _ in range(hyperparameters["max_episodes"]): + for episode_number in range(hyperparameters["max_episodes"]): env, hyperparameters, q_table, episode_rewards = episode_step( - env, hyperparameters, q_table, episode_rewards) + env, hyperparameters, q_table, episode_rewards, episode_number) return env, q_table From 8c0efbf20cff93faf45958676245dd7a74b6b378 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 21 May 2023 21:18:00 +0200 Subject: [PATCH 10/10] feat: delete videos alread on repo --- vid/rl-video-episode-3.meta.json | 1 - vid/rl-video-episode-3.mp4 | Bin 35718 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 vid/rl-video-episode-3.meta.json delete mode 100644 vid/rl-video-episode-3.mp4 diff --git a/vid/rl-video-episode-3.meta.json b/vid/rl-video-episode-3.meta.json deleted file mode 100644 index 4e13da84..00000000 --- a/vid/rl-video-episode-3.meta.json +++ /dev/null @@ -1 +0,0 @@ -{"step_id": 600, "episode_id": 3, "content_type": "video/mp4"} \ No newline at end of file diff --git a/vid/rl-video-episode-3.mp4 b/vid/rl-video-episode-3.mp4 deleted file mode 100644 index 12d1ce2dfce1d515a19f37927428c587813b57f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35718 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
#k)!QA()9~1N-}C{?RKEe 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