Skip to content

Instantly share code, notes, and snippets.

@TheBojda
Last active December 22, 2022 14:57
Show Gist options
  • Save TheBojda/3188064d9596d2c3691eba0372b4e972 to your computer and use it in GitHub Desktop.
Save TheBojda/3188064d9596d2c3691eba0372b4e972 to your computer and use it in GitHub Desktop.
PyGAD (Genetic Algorithm) reinforcement learning example with Tensorflow and OpenAI Gym (CartPole v1)
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "pygad_reinforcement.ipynb",
"provenance": [],
"authorship_tag": "ABX9TyOOXvf/4mnyFRnoz7Svjmi1",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/TheBojda/3188064d9596d2c3691eba0372b4e972/pygad_reinforcement.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BwzHWPMaWp94",
"outputId": "bc6afa1a-5ce3-430c-9009-4245f7a2aca7"
},
"source": [
"!pip install pygad"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting pygad\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/2c/fa/1a862616e125d9ad4e77b60eb9d589ccbef6832d7f33502f596bdde76441/pygad-2.10.2-py3-none-any.whl (41kB)\n",
"\r\u001b[K |███████▉ | 10kB 18.0MB/s eta 0:00:01\r\u001b[K |███████████████▊ | 20kB 16.9MB/s eta 0:00:01\r\u001b[K |███████████████████████▋ | 30kB 14.0MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▌| 40kB 12.7MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 51kB 5.6MB/s \n",
"\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from pygad) (1.19.5)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from pygad) (3.2.2)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->pygad) (1.3.1)\n",
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->pygad) (2.4.7)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->pygad) (0.10.0)\n",
"Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->pygad) (2.8.1)\n",
"Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from cycler>=0.10->matplotlib->pygad) (1.15.0)\n",
"Installing collected packages: pygad\n",
"Successfully installed pygad-2.10.2\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "ZvepasI8ctig",
"outputId": "203f7e6c-56ab-468c-83ba-455633824c1d"
},
"source": [
"import gym\n",
"import numpy as np\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense\n",
"import pygad.kerasga\n",
"import pygad\n",
"\n",
"\n",
"def fitness_func(solution, sol_idx):\n",
" global keras_ga, model, observation_space_size, env\n",
"\n",
" model_weights_matrix = pygad.kerasga.model_weights_as_matrix(model=model, weights_vector=solution)\n",
" model.set_weights(weights=model_weights_matrix)\n",
"\n",
" # play game\n",
" observation = env.reset()\n",
" sum_reward = 0\n",
" done = False\n",
" c = 0\n",
" while (not done) and c<1000:\n",
" state = np.reshape(observation, [1, observation_space_size])\n",
" q_values = model.predict(state)\n",
" action = np.argmax(q_values[0])\n",
" observation_next, reward, done, info = env.step(action)\n",
" observation = observation_next\n",
" sum_reward += reward\n",
" c += 1\n",
"\n",
" return sum_reward\n",
"\n",
"\n",
"def callback_generation(ga_instance):\n",
" print(\"Generation = {generation}\".format(generation=ga_instance.generations_completed))\n",
" print(\"Fitness = {fitness}\".format(fitness=ga_instance.best_solution()[1]))\n",
"\n",
"\n",
"env = gym.make(\"CartPole-v1\")\n",
"observation_space_size = env.observation_space.shape[0]\n",
"action_space_size = env.action_space.n\n",
"\n",
"model = Sequential()\n",
"model.add(Dense(16, input_shape=(observation_space_size,), activation='relu'))\n",
"model.add(Dense(16, activation='relu'))\n",
"model.add(Dense(action_space_size, activation='linear'))\n",
"model.summary()\n",
"\n",
"keras_ga = pygad.kerasga.KerasGA(model=model, num_solutions=10)\n",
"\n",
"# Prepare the PyGAD parameters. Check the documentation for more information: https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#pygad-ga-class\n",
"num_generations = 25 # Number of generations.\n",
"num_parents_mating = 5 # Number of solutions to be selected as parents in the mating pool.\n",
"initial_population = keras_ga.population_weights # Initial population of network weights\n",
"parent_selection_type = \"sss\" # Type of parent selection.\n",
"crossover_type = \"single_point\" # Type of the crossover operator.\n",
"mutation_type = \"random\" # Type of the mutation operator.\n",
"mutation_percent_genes = 10 # Percentage of genes to mutate. This parameter has no action if the parameter mutation_num_genes exists.\n",
"keep_parents = -1 # Number of parents to keep in the next population. -1 means keep all parents and 0 means keep nothing.\n",
"\n",
"ga_instance = pygad.GA(num_generations=num_generations,\n",
" num_parents_mating=num_parents_mating,\n",
" initial_population=initial_population,\n",
" fitness_func=fitness_func,\n",
" parent_selection_type=parent_selection_type,\n",
" crossover_type=crossover_type,\n",
" mutation_type=mutation_type,\n",
" mutation_percent_genes=mutation_percent_genes,\n",
" keep_parents=keep_parents,\n",
" on_generation=callback_generation)\n",
"\n",
"ga_instance.run()\n",
"\n",
"# After the generations complete, some plots are showed that summarize how the outputs/fitness values evolve over generations.\n",
"ga_instance.plot_result(title=\"PyGAD & Keras - Iteration vs. Fitness\", linewidth=4)\n",
"\n",
"# Returning the details of the best solution.\n",
"solution, solution_fitness, solution_idx = ga_instance.best_solution()\n",
"print(\"Fitness value of the best solution = {solution_fitness}\".format(solution_fitness=solution_fitness))\n",
"print(\"Index of the best solution : {solution_idx}\".format(solution_idx=solution_idx))\n",
"\n",
"model_weights_matrix = pygad.kerasga.model_weights_as_matrix(model=model, weights_vector=solution)\n",
"model.set_weights(weights=model_weights_matrix)\n",
"model.save(\"cartpole_weights\")"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"sequential_1\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"dense_3 (Dense) (None, 16) 80 \n",
"_________________________________________________________________\n",
"dense_4 (Dense) (None, 16) 272 \n",
"_________________________________________________________________\n",
"dense_5 (Dense) (None, 2) 34 \n",
"=================================================================\n",
"Total params: 386\n",
"Trainable params: 386\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n",
"Generation = 1\n",
"Fitness = 107.0\n",
"Generation = 2\n",
"Fitness = 124.0\n",
"Generation = 3\n",
"Fitness = 136.0\n",
"Generation = 4\n",
"Fitness = 150.0\n",
"Generation = 5\n",
"Fitness = 140.0\n",
"Generation = 6\n",
"Fitness = 165.0\n",
"Generation = 7\n",
"Fitness = 160.0\n",
"Generation = 8\n",
"Fitness = 322.0\n",
"Generation = 9\n",
"Fitness = 314.0\n",
"Generation = 10\n",
"Fitness = 325.0\n",
"Generation = 11\n",
"Fitness = 304.0\n",
"Generation = 12\n",
"Fitness = 298.0\n",
"Generation = 13\n",
"Fitness = 500.0\n",
"Generation = 14\n",
"Fitness = 500.0\n",
"Generation = 15\n",
"Fitness = 500.0\n",
"Generation = 16\n",
"Fitness = 500.0\n",
"Generation = 17\n",
"Fitness = 500.0\n",
"Generation = 18\n",
"Fitness = 500.0\n",
"Generation = 19\n",
"Fitness = 500.0\n",
"Generation = 20\n",
"Fitness = 500.0\n",
"Generation = 21\n",
"Fitness = 500.0\n",
"Generation = 22\n",
"Fitness = 500.0\n",
"Generation = 23\n",
"Fitness = 500.0\n",
"Generation = 24\n",
"Fitness = 500.0\n",
"Generation = 25\n",
"Fitness = 500.0\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Fitness value of the best solution = 500.0\n",
"Index of the best solution : 0\n",
"INFO:tensorflow:Assets written to: cartpole_weights/assets\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "TX0UX-0yf8qo",
"outputId": "a69a011b-5263-47e0-900e-b33d186825e9"
},
"source": [
"import gym\n",
"import numpy as np\n",
"import tensorflow\n",
"\n",
"model = tensorflow.keras.models.load_model('cartpole_weights')\n",
"\n",
"env = gym.make(\"CartPole-v1\")\n",
"observation_space_size = env.observation_space.shape[0]\n",
"observation = env.reset()\n",
"done = False\n",
"sum_reward = 0\n",
"c = 0\n",
"while not done:\n",
" #env.render()\n",
" state = np.reshape(observation, [1, observation_space_size])\n",
" q_values = model.predict(state)\n",
" action = np.argmax(q_values[0])\n",
" observation, reward, done, info = env.step(action)\n",
" sum_reward += reward\n",
" c += 1\n",
" print(\"Step: {step} Sum reward: {sum_reward}\".format(step=c, sum_reward=sum_reward))\n",
"\n",
"env.close()"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
"Step: 1 Sum reward: 1.0\n",
"Step: 2 Sum reward: 2.0\n",
"Step: 3 Sum reward: 3.0\n",
"Step: 4 Sum reward: 4.0\n",
"Step: 5 Sum reward: 5.0\n",
"Step: 6 Sum reward: 6.0\n",
"Step: 7 Sum reward: 7.0\n",
"Step: 8 Sum reward: 8.0\n",
"Step: 9 Sum reward: 9.0\n",
"Step: 10 Sum reward: 10.0\n",
"Step: 11 Sum reward: 11.0\n",
"Step: 12 Sum reward: 12.0\n",
"Step: 13 Sum reward: 13.0\n",
"Step: 14 Sum reward: 14.0\n",
"Step: 15 Sum reward: 15.0\n",
"Step: 16 Sum reward: 16.0\n",
"Step: 17 Sum reward: 17.0\n",
"Step: 18 Sum reward: 18.0\n",
"Step: 19 Sum reward: 19.0\n",
"Step: 20 Sum reward: 20.0\n",
"Step: 21 Sum reward: 21.0\n",
"Step: 22 Sum reward: 22.0\n",
"Step: 23 Sum reward: 23.0\n",
"Step: 24 Sum reward: 24.0\n",
"Step: 25 Sum reward: 25.0\n",
"Step: 26 Sum reward: 26.0\n",
"Step: 27 Sum reward: 27.0\n",
"Step: 28 Sum reward: 28.0\n",
"Step: 29 Sum reward: 29.0\n",
"Step: 30 Sum reward: 30.0\n",
"Step: 31 Sum reward: 31.0\n",
"Step: 32 Sum reward: 32.0\n",
"Step: 33 Sum reward: 33.0\n",
"Step: 34 Sum reward: 34.0\n",
"Step: 35 Sum reward: 35.0\n",
"Step: 36 Sum reward: 36.0\n",
"Step: 37 Sum reward: 37.0\n",
"Step: 38 Sum reward: 38.0\n",
"Step: 39 Sum reward: 39.0\n",
"Step: 40 Sum reward: 40.0\n",
"Step: 41 Sum reward: 41.0\n",
"Step: 42 Sum reward: 42.0\n",
"Step: 43 Sum reward: 43.0\n",
"Step: 44 Sum reward: 44.0\n",
"Step: 45 Sum reward: 45.0\n",
"Step: 46 Sum reward: 46.0\n",
"Step: 47 Sum reward: 47.0\n",
"Step: 48 Sum reward: 48.0\n",
"Step: 49 Sum reward: 49.0\n",
"Step: 50 Sum reward: 50.0\n",
"Step: 51 Sum reward: 51.0\n",
"Step: 52 Sum reward: 52.0\n",
"Step: 53 Sum reward: 53.0\n",
"Step: 54 Sum reward: 54.0\n",
"Step: 55 Sum reward: 55.0\n",
"Step: 56 Sum reward: 56.0\n",
"Step: 57 Sum reward: 57.0\n",
"Step: 58 Sum reward: 58.0\n",
"Step: 59 Sum reward: 59.0\n",
"Step: 60 Sum reward: 60.0\n",
"Step: 61 Sum reward: 61.0\n",
"Step: 62 Sum reward: 62.0\n",
"Step: 63 Sum reward: 63.0\n",
"Step: 64 Sum reward: 64.0\n",
"Step: 65 Sum reward: 65.0\n",
"Step: 66 Sum reward: 66.0\n",
"Step: 67 Sum reward: 67.0\n",
"Step: 68 Sum reward: 68.0\n",
"Step: 69 Sum reward: 69.0\n",
"Step: 70 Sum reward: 70.0\n",
"Step: 71 Sum reward: 71.0\n",
"Step: 72 Sum reward: 72.0\n",
"Step: 73 Sum reward: 73.0\n",
"Step: 74 Sum reward: 74.0\n",
"Step: 75 Sum reward: 75.0\n",
"Step: 76 Sum reward: 76.0\n",
"Step: 77 Sum reward: 77.0\n",
"Step: 78 Sum reward: 78.0\n",
"Step: 79 Sum reward: 79.0\n",
"Step: 80 Sum reward: 80.0\n",
"Step: 81 Sum reward: 81.0\n",
"Step: 82 Sum reward: 82.0\n",
"Step: 83 Sum reward: 83.0\n",
"Step: 84 Sum reward: 84.0\n",
"Step: 85 Sum reward: 85.0\n",
"Step: 86 Sum reward: 86.0\n",
"Step: 87 Sum reward: 87.0\n",
"Step: 88 Sum reward: 88.0\n",
"Step: 89 Sum reward: 89.0\n",
"Step: 90 Sum reward: 90.0\n",
"Step: 91 Sum reward: 91.0\n",
"Step: 92 Sum reward: 92.0\n",
"Step: 93 Sum reward: 93.0\n",
"Step: 94 Sum reward: 94.0\n",
"Step: 95 Sum reward: 95.0\n",
"Step: 96 Sum reward: 96.0\n",
"Step: 97 Sum reward: 97.0\n",
"Step: 98 Sum reward: 98.0\n",
"Step: 99 Sum reward: 99.0\n",
"Step: 100 Sum reward: 100.0\n",
"Step: 101 Sum reward: 101.0\n",
"Step: 102 Sum reward: 102.0\n",
"Step: 103 Sum reward: 103.0\n",
"Step: 104 Sum reward: 104.0\n",
"Step: 105 Sum reward: 105.0\n",
"Step: 106 Sum reward: 106.0\n",
"Step: 107 Sum reward: 107.0\n",
"Step: 108 Sum reward: 108.0\n",
"Step: 109 Sum reward: 109.0\n",
"Step: 110 Sum reward: 110.0\n",
"Step: 111 Sum reward: 111.0\n",
"Step: 112 Sum reward: 112.0\n",
"Step: 113 Sum reward: 113.0\n",
"Step: 114 Sum reward: 114.0\n",
"Step: 115 Sum reward: 115.0\n",
"Step: 116 Sum reward: 116.0\n",
"Step: 117 Sum reward: 117.0\n",
"Step: 118 Sum reward: 118.0\n",
"Step: 119 Sum reward: 119.0\n",
"Step: 120 Sum reward: 120.0\n",
"Step: 121 Sum reward: 121.0\n",
"Step: 122 Sum reward: 122.0\n",
"Step: 123 Sum reward: 123.0\n",
"Step: 124 Sum reward: 124.0\n",
"Step: 125 Sum reward: 125.0\n",
"Step: 126 Sum reward: 126.0\n",
"Step: 127 Sum reward: 127.0\n",
"Step: 128 Sum reward: 128.0\n",
"Step: 129 Sum reward: 129.0\n",
"Step: 130 Sum reward: 130.0\n",
"Step: 131 Sum reward: 131.0\n",
"Step: 132 Sum reward: 132.0\n",
"Step: 133 Sum reward: 133.0\n",
"Step: 134 Sum reward: 134.0\n",
"Step: 135 Sum reward: 135.0\n",
"Step: 136 Sum reward: 136.0\n",
"Step: 137 Sum reward: 137.0\n",
"Step: 138 Sum reward: 138.0\n",
"Step: 139 Sum reward: 139.0\n",
"Step: 140 Sum reward: 140.0\n",
"Step: 141 Sum reward: 141.0\n",
"Step: 142 Sum reward: 142.0\n",
"Step: 143 Sum reward: 143.0\n",
"Step: 144 Sum reward: 144.0\n",
"Step: 145 Sum reward: 145.0\n",
"Step: 146 Sum reward: 146.0\n",
"Step: 147 Sum reward: 147.0\n",
"Step: 148 Sum reward: 148.0\n",
"Step: 149 Sum reward: 149.0\n",
"Step: 150 Sum reward: 150.0\n",
"Step: 151 Sum reward: 151.0\n",
"Step: 152 Sum reward: 152.0\n",
"Step: 153 Sum reward: 153.0\n",
"Step: 154 Sum reward: 154.0\n",
"Step: 155 Sum reward: 155.0\n",
"Step: 156 Sum reward: 156.0\n",
"Step: 157 Sum reward: 157.0\n",
"Step: 158 Sum reward: 158.0\n",
"Step: 159 Sum reward: 159.0\n",
"Step: 160 Sum reward: 160.0\n",
"Step: 161 Sum reward: 161.0\n",
"Step: 162 Sum reward: 162.0\n",
"Step: 163 Sum reward: 163.0\n",
"Step: 164 Sum reward: 164.0\n",
"Step: 165 Sum reward: 165.0\n",
"Step: 166 Sum reward: 166.0\n",
"Step: 167 Sum reward: 167.0\n",
"Step: 168 Sum reward: 168.0\n",
"Step: 169 Sum reward: 169.0\n",
"Step: 170 Sum reward: 170.0\n",
"Step: 171 Sum reward: 171.0\n",
"Step: 172 Sum reward: 172.0\n",
"Step: 173 Sum reward: 173.0\n",
"Step: 174 Sum reward: 174.0\n",
"Step: 175 Sum reward: 175.0\n",
"Step: 176 Sum reward: 176.0\n",
"Step: 177 Sum reward: 177.0\n",
"Step: 178 Sum reward: 178.0\n",
"Step: 179 Sum reward: 179.0\n",
"Step: 180 Sum reward: 180.0\n",
"Step: 181 Sum reward: 181.0\n",
"Step: 182 Sum reward: 182.0\n",
"Step: 183 Sum reward: 183.0\n",
"Step: 184 Sum reward: 184.0\n",
"Step: 185 Sum reward: 185.0\n",
"Step: 186 Sum reward: 186.0\n",
"Step: 187 Sum reward: 187.0\n",
"Step: 188 Sum reward: 188.0\n",
"Step: 189 Sum reward: 189.0\n",
"Step: 190 Sum reward: 190.0\n",
"Step: 191 Sum reward: 191.0\n",
"Step: 192 Sum reward: 192.0\n",
"Step: 193 Sum reward: 193.0\n",
"Step: 194 Sum reward: 194.0\n",
"Step: 195 Sum reward: 195.0\n",
"Step: 196 Sum reward: 196.0\n",
"Step: 197 Sum reward: 197.0\n",
"Step: 198 Sum reward: 198.0\n",
"Step: 199 Sum reward: 199.0\n",
"Step: 200 Sum reward: 200.0\n",
"Step: 201 Sum reward: 201.0\n",
"Step: 202 Sum reward: 202.0\n",
"Step: 203 Sum reward: 203.0\n",
"Step: 204 Sum reward: 204.0\n",
"Step: 205 Sum reward: 205.0\n",
"Step: 206 Sum reward: 206.0\n",
"Step: 207 Sum reward: 207.0\n",
"Step: 208 Sum reward: 208.0\n",
"Step: 209 Sum reward: 209.0\n",
"Step: 210 Sum reward: 210.0\n",
"Step: 211 Sum reward: 211.0\n",
"Step: 212 Sum reward: 212.0\n",
"Step: 213 Sum reward: 213.0\n",
"Step: 214 Sum reward: 214.0\n",
"Step: 215 Sum reward: 215.0\n",
"Step: 216 Sum reward: 216.0\n",
"Step: 217 Sum reward: 217.0\n",
"Step: 218 Sum reward: 218.0\n",
"Step: 219 Sum reward: 219.0\n",
"Step: 220 Sum reward: 220.0\n",
"Step: 221 Sum reward: 221.0\n",
"Step: 222 Sum reward: 222.0\n",
"Step: 223 Sum reward: 223.0\n",
"Step: 224 Sum reward: 224.0\n",
"Step: 225 Sum reward: 225.0\n",
"Step: 226 Sum reward: 226.0\n",
"Step: 227 Sum reward: 227.0\n",
"Step: 228 Sum reward: 228.0\n",
"Step: 229 Sum reward: 229.0\n",
"Step: 230 Sum reward: 230.0\n",
"Step: 231 Sum reward: 231.0\n",
"Step: 232 Sum reward: 232.0\n",
"Step: 233 Sum reward: 233.0\n",
"Step: 234 Sum reward: 234.0\n",
"Step: 235 Sum reward: 235.0\n",
"Step: 236 Sum reward: 236.0\n",
"Step: 237 Sum reward: 237.0\n",
"Step: 238 Sum reward: 238.0\n",
"Step: 239 Sum reward: 239.0\n",
"Step: 240 Sum reward: 240.0\n",
"Step: 241 Sum reward: 241.0\n",
"Step: 242 Sum reward: 242.0\n",
"Step: 243 Sum reward: 243.0\n",
"Step: 244 Sum reward: 244.0\n",
"Step: 245 Sum reward: 245.0\n",
"Step: 246 Sum reward: 246.0\n",
"Step: 247 Sum reward: 247.0\n",
"Step: 248 Sum reward: 248.0\n",
"Step: 249 Sum reward: 249.0\n",
"Step: 250 Sum reward: 250.0\n",
"Step: 251 Sum reward: 251.0\n",
"Step: 252 Sum reward: 252.0\n",
"Step: 253 Sum reward: 253.0\n",
"Step: 254 Sum reward: 254.0\n",
"Step: 255 Sum reward: 255.0\n",
"Step: 256 Sum reward: 256.0\n",
"Step: 257 Sum reward: 257.0\n",
"Step: 258 Sum reward: 258.0\n",
"Step: 259 Sum reward: 259.0\n",
"Step: 260 Sum reward: 260.0\n",
"Step: 261 Sum reward: 261.0\n",
"Step: 262 Sum reward: 262.0\n",
"Step: 263 Sum reward: 263.0\n",
"Step: 264 Sum reward: 264.0\n",
"Step: 265 Sum reward: 265.0\n",
"Step: 266 Sum reward: 266.0\n",
"Step: 267 Sum reward: 267.0\n",
"Step: 268 Sum reward: 268.0\n",
"Step: 269 Sum reward: 269.0\n",
"Step: 270 Sum reward: 270.0\n",
"Step: 271 Sum reward: 271.0\n",
"Step: 272 Sum reward: 272.0\n",
"Step: 273 Sum reward: 273.0\n",
"Step: 274 Sum reward: 274.0\n",
"Step: 275 Sum reward: 275.0\n",
"Step: 276 Sum reward: 276.0\n",
"Step: 277 Sum reward: 277.0\n",
"Step: 278 Sum reward: 278.0\n",
"Step: 279 Sum reward: 279.0\n",
"Step: 280 Sum reward: 280.0\n",
"Step: 281 Sum reward: 281.0\n",
"Step: 282 Sum reward: 282.0\n",
"Step: 283 Sum reward: 283.0\n",
"Step: 284 Sum reward: 284.0\n",
"Step: 285 Sum reward: 285.0\n",
"Step: 286 Sum reward: 286.0\n",
"Step: 287 Sum reward: 287.0\n",
"Step: 288 Sum reward: 288.0\n",
"Step: 289 Sum reward: 289.0\n",
"Step: 290 Sum reward: 290.0\n",
"Step: 291 Sum reward: 291.0\n",
"Step: 292 Sum reward: 292.0\n",
"Step: 293 Sum reward: 293.0\n",
"Step: 294 Sum reward: 294.0\n",
"Step: 295 Sum reward: 295.0\n",
"Step: 296 Sum reward: 296.0\n",
"Step: 297 Sum reward: 297.0\n",
"Step: 298 Sum reward: 298.0\n",
"Step: 299 Sum reward: 299.0\n",
"Step: 300 Sum reward: 300.0\n",
"Step: 301 Sum reward: 301.0\n",
"Step: 302 Sum reward: 302.0\n",
"Step: 303 Sum reward: 303.0\n",
"Step: 304 Sum reward: 304.0\n",
"Step: 305 Sum reward: 305.0\n",
"Step: 306 Sum reward: 306.0\n",
"Step: 307 Sum reward: 307.0\n",
"Step: 308 Sum reward: 308.0\n",
"Step: 309 Sum reward: 309.0\n",
"Step: 310 Sum reward: 310.0\n",
"Step: 311 Sum reward: 311.0\n",
"Step: 312 Sum reward: 312.0\n",
"Step: 313 Sum reward: 313.0\n",
"Step: 314 Sum reward: 314.0\n",
"Step: 315 Sum reward: 315.0\n",
"Step: 316 Sum reward: 316.0\n",
"Step: 317 Sum reward: 317.0\n",
"Step: 318 Sum reward: 318.0\n",
"Step: 319 Sum reward: 319.0\n",
"Step: 320 Sum reward: 320.0\n",
"Step: 321 Sum reward: 321.0\n",
"Step: 322 Sum reward: 322.0\n",
"Step: 323 Sum reward: 323.0\n",
"Step: 324 Sum reward: 324.0\n",
"Step: 325 Sum reward: 325.0\n",
"Step: 326 Sum reward: 326.0\n",
"Step: 327 Sum reward: 327.0\n",
"Step: 328 Sum reward: 328.0\n",
"Step: 329 Sum reward: 329.0\n",
"Step: 330 Sum reward: 330.0\n",
"Step: 331 Sum reward: 331.0\n",
"Step: 332 Sum reward: 332.0\n",
"Step: 333 Sum reward: 333.0\n",
"Step: 334 Sum reward: 334.0\n",
"Step: 335 Sum reward: 335.0\n",
"Step: 336 Sum reward: 336.0\n",
"Step: 337 Sum reward: 337.0\n",
"Step: 338 Sum reward: 338.0\n",
"Step: 339 Sum reward: 339.0\n",
"Step: 340 Sum reward: 340.0\n",
"Step: 341 Sum reward: 341.0\n",
"Step: 342 Sum reward: 342.0\n",
"Step: 343 Sum reward: 343.0\n",
"Step: 344 Sum reward: 344.0\n",
"Step: 345 Sum reward: 345.0\n",
"Step: 346 Sum reward: 346.0\n",
"Step: 347 Sum reward: 347.0\n",
"Step: 348 Sum reward: 348.0\n",
"Step: 349 Sum reward: 349.0\n",
"Step: 350 Sum reward: 350.0\n",
"Step: 351 Sum reward: 351.0\n",
"Step: 352 Sum reward: 352.0\n",
"Step: 353 Sum reward: 353.0\n",
"Step: 354 Sum reward: 354.0\n",
"Step: 355 Sum reward: 355.0\n",
"Step: 356 Sum reward: 356.0\n",
"Step: 357 Sum reward: 357.0\n",
"Step: 358 Sum reward: 358.0\n",
"Step: 359 Sum reward: 359.0\n",
"Step: 360 Sum reward: 360.0\n",
"Step: 361 Sum reward: 361.0\n",
"Step: 362 Sum reward: 362.0\n",
"Step: 363 Sum reward: 363.0\n",
"Step: 364 Sum reward: 364.0\n",
"Step: 365 Sum reward: 365.0\n",
"Step: 366 Sum reward: 366.0\n",
"Step: 367 Sum reward: 367.0\n",
"Step: 368 Sum reward: 368.0\n",
"Step: 369 Sum reward: 369.0\n",
"Step: 370 Sum reward: 370.0\n",
"Step: 371 Sum reward: 371.0\n",
"Step: 372 Sum reward: 372.0\n",
"Step: 373 Sum reward: 373.0\n",
"Step: 374 Sum reward: 374.0\n",
"Step: 375 Sum reward: 375.0\n",
"Step: 376 Sum reward: 376.0\n",
"Step: 377 Sum reward: 377.0\n",
"Step: 378 Sum reward: 378.0\n",
"Step: 379 Sum reward: 379.0\n",
"Step: 380 Sum reward: 380.0\n",
"Step: 381 Sum reward: 381.0\n",
"Step: 382 Sum reward: 382.0\n",
"Step: 383 Sum reward: 383.0\n",
"Step: 384 Sum reward: 384.0\n",
"Step: 385 Sum reward: 385.0\n",
"Step: 386 Sum reward: 386.0\n",
"Step: 387 Sum reward: 387.0\n",
"Step: 388 Sum reward: 388.0\n",
"Step: 389 Sum reward: 389.0\n",
"Step: 390 Sum reward: 390.0\n",
"Step: 391 Sum reward: 391.0\n",
"Step: 392 Sum reward: 392.0\n",
"Step: 393 Sum reward: 393.0\n",
"Step: 394 Sum reward: 394.0\n",
"Step: 395 Sum reward: 395.0\n",
"Step: 396 Sum reward: 396.0\n",
"Step: 397 Sum reward: 397.0\n",
"Step: 398 Sum reward: 398.0\n",
"Step: 399 Sum reward: 399.0\n",
"Step: 400 Sum reward: 400.0\n",
"Step: 401 Sum reward: 401.0\n",
"Step: 402 Sum reward: 402.0\n",
"Step: 403 Sum reward: 403.0\n",
"Step: 404 Sum reward: 404.0\n",
"Step: 405 Sum reward: 405.0\n",
"Step: 406 Sum reward: 406.0\n",
"Step: 407 Sum reward: 407.0\n",
"Step: 408 Sum reward: 408.0\n",
"Step: 409 Sum reward: 409.0\n",
"Step: 410 Sum reward: 410.0\n",
"Step: 411 Sum reward: 411.0\n",
"Step: 412 Sum reward: 412.0\n",
"Step: 413 Sum reward: 413.0\n",
"Step: 414 Sum reward: 414.0\n",
"Step: 415 Sum reward: 415.0\n",
"Step: 416 Sum reward: 416.0\n",
"Step: 417 Sum reward: 417.0\n",
"Step: 418 Sum reward: 418.0\n",
"Step: 419 Sum reward: 419.0\n",
"Step: 420 Sum reward: 420.0\n",
"Step: 421 Sum reward: 421.0\n",
"Step: 422 Sum reward: 422.0\n",
"Step: 423 Sum reward: 423.0\n",
"Step: 424 Sum reward: 424.0\n",
"Step: 425 Sum reward: 425.0\n",
"Step: 426 Sum reward: 426.0\n",
"Step: 427 Sum reward: 427.0\n",
"Step: 428 Sum reward: 428.0\n",
"Step: 429 Sum reward: 429.0\n",
"Step: 430 Sum reward: 430.0\n",
"Step: 431 Sum reward: 431.0\n",
"Step: 432 Sum reward: 432.0\n",
"Step: 433 Sum reward: 433.0\n",
"Step: 434 Sum reward: 434.0\n",
"Step: 435 Sum reward: 435.0\n",
"Step: 436 Sum reward: 436.0\n",
"Step: 437 Sum reward: 437.0\n",
"Step: 438 Sum reward: 438.0\n",
"Step: 439 Sum reward: 439.0\n",
"Step: 440 Sum reward: 440.0\n",
"Step: 441 Sum reward: 441.0\n",
"Step: 442 Sum reward: 442.0\n",
"Step: 443 Sum reward: 443.0\n",
"Step: 444 Sum reward: 444.0\n",
"Step: 445 Sum reward: 445.0\n",
"Step: 446 Sum reward: 446.0\n",
"Step: 447 Sum reward: 447.0\n",
"Step: 448 Sum reward: 448.0\n",
"Step: 449 Sum reward: 449.0\n",
"Step: 450 Sum reward: 450.0\n",
"Step: 451 Sum reward: 451.0\n",
"Step: 452 Sum reward: 452.0\n",
"Step: 453 Sum reward: 453.0\n",
"Step: 454 Sum reward: 454.0\n",
"Step: 455 Sum reward: 455.0\n",
"Step: 456 Sum reward: 456.0\n",
"Step: 457 Sum reward: 457.0\n",
"Step: 458 Sum reward: 458.0\n",
"Step: 459 Sum reward: 459.0\n",
"Step: 460 Sum reward: 460.0\n",
"Step: 461 Sum reward: 461.0\n",
"Step: 462 Sum reward: 462.0\n",
"Step: 463 Sum reward: 463.0\n",
"Step: 464 Sum reward: 464.0\n",
"Step: 465 Sum reward: 465.0\n",
"Step: 466 Sum reward: 466.0\n",
"Step: 467 Sum reward: 467.0\n",
"Step: 468 Sum reward: 468.0\n",
"Step: 469 Sum reward: 469.0\n",
"Step: 470 Sum reward: 470.0\n",
"Step: 471 Sum reward: 471.0\n",
"Step: 472 Sum reward: 472.0\n",
"Step: 473 Sum reward: 473.0\n",
"Step: 474 Sum reward: 474.0\n",
"Step: 475 Sum reward: 475.0\n",
"Step: 476 Sum reward: 476.0\n",
"Step: 477 Sum reward: 477.0\n",
"Step: 478 Sum reward: 478.0\n",
"Step: 479 Sum reward: 479.0\n",
"Step: 480 Sum reward: 480.0\n",
"Step: 481 Sum reward: 481.0\n",
"Step: 482 Sum reward: 482.0\n",
"Step: 483 Sum reward: 483.0\n",
"Step: 484 Sum reward: 484.0\n",
"Step: 485 Sum reward: 485.0\n",
"Step: 486 Sum reward: 486.0\n",
"Step: 487 Sum reward: 487.0\n",
"Step: 488 Sum reward: 488.0\n",
"Step: 489 Sum reward: 489.0\n",
"Step: 490 Sum reward: 490.0\n",
"Step: 491 Sum reward: 491.0\n",
"Step: 492 Sum reward: 492.0\n",
"Step: 493 Sum reward: 493.0\n",
"Step: 494 Sum reward: 494.0\n",
"Step: 495 Sum reward: 495.0\n",
"Step: 496 Sum reward: 496.0\n",
"Step: 497 Sum reward: 497.0\n",
"Step: 498 Sum reward: 498.0\n",
"Step: 499 Sum reward: 499.0\n",
"Step: 500 Sum reward: 500.0\n"
],
"name": "stdout"
}
]
}
]
}
@connorfuhrman
Copy link

Thanks for posting! A note for people getting here after the gym step API has changed:

  • alter the initial observation to be the 0th element of env.reset(), i.e., observation = env.reset()[0]
  • alter the result of step to be observation_next, reward, done, truncated, info = env.step(action)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment