packages feed

shine-examples-0.1: mountaincar/MountainCar.hs

module MountainCar where

minPosition :: Double
minPosition = -1.2

maxPosition :: Double
maxPosition = 0.6

minInitPos :: Double
minInitPos = -0.6

maxInitPos :: Double
maxInitPos = -0.4

maxSpeed :: Double
maxSpeed = 0.07

goalPosition :: Double
goalPosition = 0.5

force :: Double
force = 0.001

gravity :: Double
gravity = 0.0025

data Action = ActionLeft | ActionNothing | ActionRight

instance Show Action where
    show ActionLeft = "<"
    show ActionRight = ">"
    show ActionNothing = "="

data Observation = Observation
    { _position :: Double
    , _velocity :: Double }

initObs :: Double -> Observation
initObs xi = Observation (minInitPos + xi * (maxInitPos - minInitPos)) 0

goalObs :: Observation -> Bool
goalObs obs = _position obs >= goalPosition

heightObs :: Double -> Double
heightObs x = 0.55 + 0.45 * sin (3 * x)

stepObs :: Action -> Observation -> Observation
stepObs action obs = obs { _position = p2, _velocity = v3 }
    where dv = case action of ActionNothing -> 0
                              ActionLeft -> -force
                              ActionRight -> force
          v1 = _velocity obs + dv - gravity * cos (3 * _position obs)
          v2 = max (-maxSpeed) $ min maxSpeed v1
          p1 = _position obs + v2
          p2 = max minPosition $ min maxPosition p1
          v3 = if p2 == minPosition && v2 < 0 then 0 else v2