mirror of
https://github.com/Farama-Foundation/Gymnasium.git
synced 2025-08-24 07:22:43 +00:00
Clean up mountain car environment (#1961)
* Clean up mountain car environment. * Add whitespace around division operator.
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
http://incompleteideas.net/sutton/MountainCar/MountainCar1.cp
|
http://incompleteideas.net/sutton/MountainCar/MountainCar1.cp
|
||||||
permalink: https://perma.cc/6Z2N-PFWC
|
permalink: https://perma.cc/6Z2N-PFWC
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import math
|
import math
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@@ -11,6 +10,7 @@ import gym
|
|||||||
from gym import spaces
|
from gym import spaces
|
||||||
from gym.utils import seeding
|
from gym.utils import seeding
|
||||||
|
|
||||||
|
|
||||||
class MountainCarEnv(gym.Env):
|
class MountainCarEnv(gym.Env):
|
||||||
"""
|
"""
|
||||||
Description:
|
Description:
|
||||||
@@ -67,13 +67,19 @@ class MountainCarEnv(gym.Env):
|
|||||||
self.force = 0.001
|
self.force = 0.001
|
||||||
self.gravity = 0.0025
|
self.gravity = 0.0025
|
||||||
|
|
||||||
self.low = np.array([self.min_position, -self.max_speed], dtype=np.float32)
|
self.low = np.array(
|
||||||
self.high = np.array([self.max_position, self.max_speed], dtype=np.float32)
|
[self.min_position, -self.max_speed], dtype=np.float32
|
||||||
|
)
|
||||||
|
self.high = np.array(
|
||||||
|
[self.max_position, self.max_speed], dtype=np.float32
|
||||||
|
)
|
||||||
|
|
||||||
self.viewer = None
|
self.viewer = None
|
||||||
|
|
||||||
self.action_space = spaces.Discrete(3)
|
self.action_space = spaces.Discrete(3)
|
||||||
self.observation_space = spaces.Box(self.low, self.high, dtype=np.float32)
|
self.observation_space = spaces.Box(
|
||||||
|
self.low, self.high, dtype=np.float32
|
||||||
|
)
|
||||||
|
|
||||||
self.seed()
|
self.seed()
|
||||||
|
|
||||||
@@ -89,9 +95,12 @@ class MountainCarEnv(gym.Env):
|
|||||||
velocity = np.clip(velocity, -self.max_speed, self.max_speed)
|
velocity = np.clip(velocity, -self.max_speed, self.max_speed)
|
||||||
position += velocity
|
position += velocity
|
||||||
position = np.clip(position, self.min_position, self.max_position)
|
position = np.clip(position, self.min_position, self.max_position)
|
||||||
if (position==self.min_position and velocity<0): velocity = 0
|
if (position == self.min_position and velocity < 0):
|
||||||
|
velocity = 0
|
||||||
|
|
||||||
done = bool(position >= self.goal_position and velocity >= self.goal_velocity)
|
done = bool(
|
||||||
|
position >= self.goal_position and velocity >= self.goal_velocity
|
||||||
|
)
|
||||||
reward = -1.0
|
reward = -1.0
|
||||||
|
|
||||||
self.state = (position, velocity)
|
self.state = (position, velocity)
|
||||||
@@ -113,7 +122,6 @@ class MountainCarEnv(gym.Env):
|
|||||||
carwidth = 40
|
carwidth = 40
|
||||||
carheight = 20
|
carheight = 20
|
||||||
|
|
||||||
|
|
||||||
if self.viewer is None:
|
if self.viewer is None:
|
||||||
from gym.envs.classic_control import rendering
|
from gym.envs.classic_control import rendering
|
||||||
self.viewer = rendering.Viewer(screen_width, screen_height)
|
self.viewer = rendering.Viewer(screen_width, screen_height)
|
||||||
@@ -135,11 +143,15 @@ class MountainCarEnv(gym.Env):
|
|||||||
self.viewer.add_geom(car)
|
self.viewer.add_geom(car)
|
||||||
frontwheel = rendering.make_circle(carheight / 2.5)
|
frontwheel = rendering.make_circle(carheight / 2.5)
|
||||||
frontwheel.set_color(.5, .5, .5)
|
frontwheel.set_color(.5, .5, .5)
|
||||||
frontwheel.add_attr(rendering.Transform(translation=(carwidth/4,clearance)))
|
frontwheel.add_attr(
|
||||||
|
rendering.Transform(translation=(carwidth / 4, clearance))
|
||||||
|
)
|
||||||
frontwheel.add_attr(self.cartrans)
|
frontwheel.add_attr(self.cartrans)
|
||||||
self.viewer.add_geom(frontwheel)
|
self.viewer.add_geom(frontwheel)
|
||||||
backwheel = rendering.make_circle(carheight / 2.5)
|
backwheel = rendering.make_circle(carheight / 2.5)
|
||||||
backwheel.add_attr(rendering.Transform(translation=(-carwidth/4,clearance)))
|
backwheel.add_attr(
|
||||||
|
rendering.Transform(translation=(-carwidth / 4, clearance))
|
||||||
|
)
|
||||||
backwheel.add_attr(self.cartrans)
|
backwheel.add_attr(self.cartrans)
|
||||||
backwheel.set_color(.5, .5, .5)
|
backwheel.set_color(.5, .5, .5)
|
||||||
self.viewer.add_geom(backwheel)
|
self.viewer.add_geom(backwheel)
|
||||||
@@ -148,18 +160,23 @@ class MountainCarEnv(gym.Env):
|
|||||||
flagy2 = flagy1 + 50
|
flagy2 = flagy1 + 50
|
||||||
flagpole = rendering.Line((flagx, flagy1), (flagx, flagy2))
|
flagpole = rendering.Line((flagx, flagy1), (flagx, flagy2))
|
||||||
self.viewer.add_geom(flagpole)
|
self.viewer.add_geom(flagpole)
|
||||||
flag = rendering.FilledPolygon([(flagx, flagy2), (flagx, flagy2-10), (flagx+25, flagy2-5)])
|
flag = rendering.FilledPolygon(
|
||||||
|
[(flagx, flagy2), (flagx, flagy2 - 10), (flagx + 25, flagy2 - 5)]
|
||||||
|
)
|
||||||
flag.set_color(.8, .8, 0)
|
flag.set_color(.8, .8, 0)
|
||||||
self.viewer.add_geom(flag)
|
self.viewer.add_geom(flag)
|
||||||
|
|
||||||
pos = self.state[0]
|
pos = self.state[0]
|
||||||
self.cartrans.set_translation((pos-self.min_position)*scale, self._height(pos)*scale)
|
self.cartrans.set_translation(
|
||||||
|
(pos-self.min_position) * scale, self._height(pos) * scale
|
||||||
|
)
|
||||||
self.cartrans.set_rotation(math.cos(3 * pos))
|
self.cartrans.set_rotation(math.cos(3 * pos))
|
||||||
|
|
||||||
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
|
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
|
||||||
|
|
||||||
def get_keys_to_action(self):
|
def get_keys_to_action(self):
|
||||||
return {():1,(276,):0,(275,):2,(275,276):1} #control with left and right arrow keys
|
# Control with left and right arrow keys.
|
||||||
|
return {(): 1, (276,): 0, (275,): 2, (275, 276): 1}
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self.viewer:
|
if self.viewer:
|
||||||
|
Reference in New Issue
Block a user