2022-10-21 15:39:00 +00:00
<!doctype html>
< html class = "no-js" lang = "en" >
< head > < meta charset = "utf-8" / >
< meta name = "viewport" content = "width=device-width,initial-scale=1" / >
< meta name = "color-scheme" content = "light dark" >
< meta name = "description" content = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)" >
< meta property = "og:title" content = "Gymnasium Documentation" / >
< meta property = "og:type" content = "website" / >
< meta property = "og:description" content = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)" / >
< meta property = "og:url" content = "https://gymnasium.farama.org/tutorials/handling_time_limits.html" / > < meta property = "og:image" content = "https://gymnasium.farama.org/_static/img/gymnasium-github.png" / > < meta name = "twitter:card" content = "summary_large_image" > < meta name = "generator" content = "Docutils 0.19: https://docutils.sourceforge.io/" / >
< link rel = "index" title = "Index" href = "../../genindex/" / > < link rel = "search" title = "Search" href = "../../search/" / > < link rel = "prev" title = "Make your own custom environment" href = "../environment_creation/" / >
< link rel = "canonical" href = "https://gymnasium.farama.org/tutorials/handling_time_limits.html" / >
< link rel = "shortcut icon" href = "../../_static/favicon.png" / > < meta name = "generator" content = "sphinx-5.3.0, furo 2022.09.15.dev1" / >
< title > Handling Time Limits - Gymnasium Documentation< / title >
< link rel = "stylesheet" type = "text/css" href = "../../_static/pygments.css" / >
< link rel = "stylesheet" type = "text/css" href = "../../_static/styles/furo.css?digest=9ec31e2665bf879c1d47d93a8ec4893870ee1e45" / >
< link rel = "stylesheet" type = "text/css" href = "../../_static/styles/furo-extensions.css?digest=a614025deca43086db03c234d5a3a2047a0241ae" / >
< style >
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
< / style > < / head >
< body >
< header class = "farama-header" >
< div class = "farama-header__container" >
< div class = "farama-header__left" >
< a href = "../../" >
< img class = "farama-header__logo only-light" src = "../../_static/img/gymnasium_black.svg" alt = "Light Logo" / >
< img class = "farama-header__logo only-dark" src = "../../_static/img/gymnasium_white.svg" alt = "Dark Logo" / >
< h1 class = "farama-header__title" > Gymnasium Documentation< / h1 >
< / a >
< / div >
< div class = "farama-header__right" >
< div class = "farama-header-menu" >
< div class = "farama-header-menu__btn" >
< span class = "farama-header-menu__btn-name" >
Farama Foundation
< / span >
< svg viewBox = "0 0 32 32" xmlns = "http://www.w3.org/2000/svg" xmlns:bx = "https://boxy-svg.com" >
< defs > < / defs >
< path d = "M 3 4.677 C 3 3.751 3.659 3 4.474 3 L 27.526 3 C 28.341 3 29 3.751 29 4.677 C 29 5.603 28.341 6.354 27.526 6.354 L 4.474 6.354 C 3.659 6.354 3 5.603 3 4.677 Z" bx:origin = "0.622825 3.875593" > < / path >
< path d = "M 3 16 C 3 15.074 3.659 14.323 4.474 14.323 L 27.526 14.323 C 28.341 14.323 29 15.074 29 16 C 29 16.926 28.341 17.677 27.526 17.677 L 4.474 17.677 C 3.659 17.677 3 16.926 3 16 Z" bx:origin = "0.622825 0.5" > < / path >
< path d = "M 3 27.323 C 3 26.397 3.659 25.646 4.474 25.646 L 27.526 25.646 C 28.341 25.646 29 26.397 29 27.323 C 29 28.249 28.341 29 27.526 29 L 4.474 29 C 3.659 29 3 28.249 3 27.323 Z" bx:origin = "0.622825 -2.875591" > < / path >
< / svg >
< / div >
< div class = "farama-header-menu-container" >
< div class = "farama-header-menu__header" >
< a href = "https://farama.org" >
< img class = "farama-header-menu__logo" src = "../../_static/img/farama_solid_white.svg" alt = "Farama Foundation" >
< span > Farama Foundation< / span >
< / a >
< button id = "farama-close-menu" >
< svg viewBox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon-close">
< line x1 = "3" y1 = "21" x2 = "21" y2 = "3" > < / line >
< line x1 = "3" y1 = "3" x2 = "21" y2 = "21" > < / line >
< / svg >
< / button >
< / div >
< div class = "farama-header-menu__body" >
< div class = "farama-header-menu__section" style = "padding-left: 24px;" >
< span class = "farama-header-menu__section-title" > Documentation< / span >
< ul class = "farama-header-menu-list" >
< li >
< a href = "https://gymnasium.farama.org" >
< img src = "../../_static/img/gymnasium-white.svg" >
Gymnasium
< / a >
< / li >
< li >
< a href = "https://pettingzoo.farama.org" >
< img src = "../../_static/img/pettingzoo-white.svg" >
PettingZoo
< / a >
< / li >
< li >
< a href = "https://minigrid.farama.org" >
< img src = "../../_static/img/minigrid-white.svg" >
MiniGrid
< / a >
< / li >
< li >
< a href = "https://robotics.farama.org" >
< img src = "../../_static/img/gymrobotics-white.svg" >
Gymnasium-Robotics
< / a >
< / li >
< / ul >
< / div >
< div class = "farama-header-menu__section" style = "padding-left: 24px;" >
< span class = "farama-header-menu__section-title" > Mature Projects< / span >
< ul class = "farama-header-menu-list" >
< li >
< a href = "https://github.com/Farama-Foundation/SuperSuit" >
< img src = "../../_static/img/supersuit-white.svg" >
SuperSuit
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/tinyscaler" >
< img src = "../../_static/img/tinyscaler-white.svg" >
Tinyscaler
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/AutoROM" >
< img src = "../../_static/img/autorom-white.svg" >
AutoROM
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/Jumpy" >
< img src = "../../_static/img/jumpy-white.svg" >
JumPy
< / a >
< / li >
< / ul >
< / div >
< div class = "farama-header-menu__section" style = "padding-left: 24px;" >
< span class = "farama-header-menu__section-title" > Incubating Projects< / span >
< ul class = "farama-header-menu-list" >
< li >
< a href = "https://github.com/Farama-Foundation/MAgent2" >
< img src = "../../_static/img/MAgent2-white.svg" >
MAgent2
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/procgen2" >
< img src = "../../_static/img/procgen2-white.svg" >
Procgen2
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/MiniWorld" >
< img src = "../../_static/img/miniworld-white.svg" >
Miniworld
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/D4RL" >
< img src = "../../_static/img/d4rl-white.svg" >
D4RL
< / a >
< / li >
< li >
< a href = "https://github.com/Farama-Foundation/Kabuki" >
< img src = "../../_static/img/kabuki-white.svg" >
Kabuki
< / a >
< / li >
< / ul >
< / div >
< div class = "farama-header-menu__section" style = "padding-left: 24px;" >
< span class = "farama-header-menu__section-title" > Foundation< / span >
< ul class = "farama-header-menu-list" >
< li >
< a href = "https://farama.org/about" >
About
< / a >
< / li >
< li >
< a href = "https://farama.org/project_standards" >
Standards
< / a >
< / li >
< li >
< a href = "https://farama.org/donations" >
Donate
< / a >
< / li >
< / ul >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / header >
< div class = "farama-header-menu__overlay" > < / div >
< script >
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
< / script >
< svg xmlns = "http://www.w3.org/2000/svg" style = "display: none;" >
< symbol id = "svg-toc" viewBox = "0 0 24 24" >
< title > Contents< / title >
< svg stroke = "currentColor" fill = "currentColor" stroke-width = "0" viewBox = "0 0 1024 1024" >
< path d = "M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z" / >
< / svg >
< / symbol >
< symbol id = "svg-menu" viewBox = "0 0 24 24" >
< title > Menu< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
< line x1 = "3" y1 = "12" x2 = "21" y2 = "12" > < / line >
< line x1 = "3" y1 = "6" x2 = "21" y2 = "6" > < / line >
< line x1 = "3" y1 = "18" x2 = "21" y2 = "18" > < / line >
< / svg >
< / symbol >
< symbol id = "svg-arrow-right" viewBox = "0 0 24 24" >
< title > Expand< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
< polyline points = "9 18 15 12 9 6" > < / polyline >
< / svg >
< / symbol >
< symbol id = "svg-sun" viewBox = "0 0 24 24" >
< title > Light mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
< circle cx = "12" cy = "12" r = "5" > < / circle >
< line x1 = "12" y1 = "1" x2 = "12" y2 = "3" > < / line >
< line x1 = "12" y1 = "21" x2 = "12" y2 = "23" > < / line >
< line x1 = "4.22" y1 = "4.22" x2 = "5.64" y2 = "5.64" > < / line >
< line x1 = "18.36" y1 = "18.36" x2 = "19.78" y2 = "19.78" > < / line >
< line x1 = "1" y1 = "12" x2 = "3" y2 = "12" > < / line >
< line x1 = "21" y1 = "12" x2 = "23" y2 = "12" > < / line >
< line x1 = "4.22" y1 = "19.78" x2 = "5.64" y2 = "18.36" > < / line >
< line x1 = "18.36" y1 = "5.64" x2 = "19.78" y2 = "4.22" > < / line >
< / svg >
< / symbol >
< symbol id = "svg-moon" viewBox = "0 0 24 24" >
< title > Dark mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< path d = "M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" / >
< / svg >
< / symbol >
< symbol id = "svg-sun-half" viewBox = "0 0 24 24" >
< title > Auto light/dark mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< circle cx = "12" cy = "12" r = "9" / >
< path d = "M13 12h5" / >
< path d = "M13 15h4" / >
< path d = "M13 18h1" / >
< path d = "M13 9h4" / >
< path d = "M13 6h1" / >
< / svg >
< / symbol >
< / svg >
< input type = "checkbox" class = "sidebar-toggle" name = "__navigation" id = "__navigation" >
< input type = "checkbox" class = "sidebar-toggle" name = "__toc" id = "__toc" >
< label class = "overlay sidebar-overlay" for = "__navigation" >
< div class = "visually-hidden" > Hide navigation sidebar< / div >
< / label >
< label class = "overlay toc-overlay" for = "__toc" >
< div class = "visually-hidden" > Hide table of contents sidebar< / div >
< / label >
< div class = "page" >
< header class = "mobile-header" >
< div class = "header-left" >
< label class = "nav-overlay-icon" for = "__navigation" >
< div class = "visually-hidden" > Toggle site navigation sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-menu" > < / use > < / svg > < / i >
< / label >
< / div >
< div class = "header-center" >
< a href = "../../" > < div class = "brand" > Gymnasium Documentation< / div > < / a >
< / div >
< div class = "header-right" >
< div class = "theme-toggle-container theme-toggle-header" >
< button class = "theme-toggle" >
< div class = "visually-hidden" > Toggle Light / Dark / Auto color theme< / div >
< svg class = "theme-icon-when-auto" > < use href = "#svg-sun-half" > < / use > < / svg >
< svg class = "theme-icon-when-dark" > < use href = "#svg-moon" > < / use > < / svg >
< svg class = "theme-icon-when-light" > < use href = "#svg-sun" > < / use > < / svg >
< / button >
< / div >
< label class = "toc-overlay-icon toc-header-icon" for = "__toc" >
< div class = "visually-hidden" > Toggle table of contents sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-toc" > < / use > < / svg > < / i >
< / label >
< / div >
< / header >
< aside class = "sidebar-drawer" >
< div class = "sidebar-container" >
< div class = "sidebar-sticky" > < form class = "sidebar-search-container" method = "get" action = "../../search/" role = "search" >
< input class = "sidebar-search" placeholder = Search name = "q" aria-label = "Search" >
< input type = "hidden" name = "check_keywords" value = "yes" >
< input type = "hidden" name = "area" value = "default" >
< / form >
< div id = "searchbox" > < / div > < div class = "sidebar-scroll" > < div class = "sidebar-tree" >
< p class = "caption" role = "heading" > < span class = "caption-text" > Introduction< / span > < / p >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../content/basic_usage/" > Basic Usage< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../content/gym_compatibility/" > Compatibility with Gym< / a > < / li >
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > API< / span > < / p >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../api/env/" > Env< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../api/registry/" > Registry< / a > < / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../api/spaces/" > Spaces< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-1" name = "toctree-checkbox-1" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-1" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/spaces/fundamental/" > Fundamental Spaces< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/spaces/composite/" > Composite Spaces< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/spaces/utils/" > Spaces Utils< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/spaces/vector_utils/" > Spaces Vector Utils< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../api/wrappers/" > Wrappers< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-2" name = "toctree-checkbox-2" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-2" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/wrappers/misc_wrappers/" > Misc Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/wrappers/action_wrappers/" > Action Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/wrappers/observation_wrappers/" > Observation Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../api/wrappers/reward_wrappers/" > Reward Wrappers< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../api/vector/" > Vector< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../api/utils/" > Utils< / a > < / li >
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > Environments< / span > < / p >
< ul >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../environments/classic_control/" > Classic Control< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-3" name = "toctree-checkbox-3" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-3" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/classic_control/acrobot/" > Acrobot< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/classic_control/cart_pole/" > Cart Pole< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/classic_control/mountain_car_continuous/" > Mountain Car Continuous< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/classic_control/mountain_car/" > Mountain Car< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/classic_control/pendulum/" > Pendulum< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../environments/box2d/" > Box2D< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-4" name = "toctree-checkbox-4" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-4" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/box2d/bipedal_walker/" > Bipedal Walker< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/box2d/car_racing/" > Car Racing< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/box2d/lunar_lander/" > Lunar Lander< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../environments/toy_text/" > Toy Text< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-5" name = "toctree-checkbox-5" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-5" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/toy_text/blackjack/" > Blackjack< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/toy_text/taxi/" > Taxi< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/toy_text/cliff_walking/" > Cliff Walking< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/toy_text/frozen_lake/" > Frozen Lake< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../environments/mujoco/" > MuJoCo< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-6" name = "toctree-checkbox-6" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-6" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/ant/" > Ant< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/half_cheetah/" > Half Cheetah< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/hopper/" > Hopper< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/humanoid_standup/" > Humanoid Standup< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/humanoid/" > Humanoid< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/inverted_double_pendulum/" > Inverted Double Pendulum< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/inverted_pendulum/" > Inverted Pendulum< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/reacher/" > Reacher< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/swimmer/" > Swimmer< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/pusher/" > Pusher< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/mujoco/walker2d/" > Walker2D< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../environments/atari/" > Atari< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-7" name = "toctree-checkbox-7" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-7" > < div class = "visually-hidden" > Toggle child pages in navigation< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/adventure/" > Adventure< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/air_raid/" > Air Raid< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/alien/" > Alien< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/amidar/" > Amidar< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/assault/" > Assault< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/asterix/" > Asterix< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/asteroids/" > Asteroids< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/atlantis/" > Atlantis< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/bank_heist/" > Bank Heist< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/battle_zone/" > Battle Zone< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/beam_rider/" > Beam Rider< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/berzerk/" > Berzerk< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/bowling/" > Bowling< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/boxing/" > Boxing< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/breakout/" > Breakout< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/carnival/" > Carnival< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/centipede/" > Centipede< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/chopper_command/" > Chopper Command< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/crazy_climber/" > Crazy Climber< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/defender/" > Defender< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/demon_attack/" > Demon Attack< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/double_dunk/" > Double Dunk< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/elevator_action/" > Elevator Action< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/enduro/" > Enduro< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/fishing_derby/" > FishingDerby< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/freeway/" > Freeway< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/frostbite/" > Frostbite< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/gopher/" > Gopher< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/gravitar/" > Gravitar< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/hero/" > Hero< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/ice_hockey/" > IceHockey< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/jamesbond/" > Jamesbond< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/journey_escape/" > JourneyEscape< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/kangaroo/" > Kangaroo< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/krull/" > Krull< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/kung_fu_master/" > Kung Fu Master< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/montezuma_revenge/" > Montezuma Revenge< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/ms_pacman/" > Ms Pacman< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/name_this_game/" > Name This Game< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/phoenix/" > Phoenix< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/pitfall/" > Pitfall< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/pong/" > Pong< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/pooyan/" > Pooyan< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/private_eye/" > PrivateEye< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/qbert/" > Qbert< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/riverraid/" > Riverraid< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/road_runner/" > Road Runner< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/robotank/" > Robot Tank< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/seaquest/" > Seaquest< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/skiing/" > Skiings< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/solaris/" > Solaris< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/space_invaders/" > SpaceInvaders< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/star_gunner/" > StarGunner< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/tennis/" > Tennis< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/time_pilot/" > TimePilot< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/tutankham/" > Tutankham< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/up_n_down/" > Up n’ Down< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/venture/" > Venture< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/video_pinball/" > Video Pinball< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/wizard_of_wor/" > Wizard of Wor< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../environments/atari/zaxxon/" > Zaxxon< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../environments/third_party_environments/" > Third-Party Environments< / a > < / li >
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > Tutorials< / span > < / p >
< ul class = "current" >
< li class = "toctree-l1" > < a class = "reference internal" href = "../environment_creation/" > Make your own custom environment< / a > < / li >
< li class = "toctree-l1 current current-page" > < a class = "current reference internal" href = "#" > Handling Time Limits< / a > < / li >
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > Development< / span > < / p >
< ul >
< li class = "toctree-l1" > < a class = "reference external" href = "https://github.com/Farama-Foundation/Gymnasium" > Github< / a > < / li >
< / ul >
< / div >
< / div >
< / div >
< / div >
< / aside >
< div class = "main" >
< div class = "content" >
< div class = "article-container" >
< a href = "#" class = "back-to-top muted-link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" >
< path d = "M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z" > < / path >
< / svg >
< span > Back to top< / span >
< / a >
< div class = "content-icon-container" >
< div class = "edit-this-page" >
< a class = "muted-link" href = "https://github.com/Farama-Foundation/Gymnasium/edit/main/docs/tutorials/handling_time_limits.py" title = "Edit this page" >
< svg aria-hidden = "true" viewBox = "0 0 24 24" stroke-width = "1.5" stroke = "currentColor" fill = "none" stroke-linecap = "round" stroke-linejoin = "round" >
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< path d = "M4 20h4l10.5 -10.5a1.5 1.5 0 0 0 -4 -4l-10.5 10.5v4" / >
< line x1 = "13.5" y1 = "6.5" x2 = "17.5" y2 = "10.5" / >
< / svg >
< span class = "visually-hidden" > Edit this page< / span >
< / a >
< / div > < div class = "theme-toggle-container theme-toggle-content" >
< button class = "theme-toggle" >
< div class = "visually-hidden" > Toggle Light / Dark / Auto color theme< / div >
< svg class = "theme-icon-when-auto" > < use href = "#svg-sun-half" > < / use > < / svg >
< svg class = "theme-icon-when-dark" > < use href = "#svg-moon" > < / use > < / svg >
< svg class = "theme-icon-when-light" > < use href = "#svg-sun" > < / use > < / svg >
< / button >
< / div >
< label class = "toc-overlay-icon toc-content-icon" for = "__toc" >
< div class = "visually-hidden" > Toggle table of contents sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-toc" > < / use > < / svg > < / i >
< / label >
< / div >
< article role = "main" >
< section id = "handling-time-limits" >
< h1 > Handling Time Limits< a class = "headerlink" href = "#handling-time-limits" title = "Permalink to this heading" > #< / a > < / h1 >
< p > In using Gymnasium environments with reinforcement learning code, a common problem observed is how time limits are incorrectly handled. The < code class = "docutils literal notranslate" > < span class = "pre" > done< / span > < / code > signal received (in previous versions of OpenAI Gym < 0.26) from < code class = "docutils literal notranslate" > < span class = "pre" > env.step< / span > < / code > indicated whether an episode has ended. However, this signal did not distinguish whether the episode ended due to < code class = "docutils literal notranslate" > < span class = "pre" > termination< / span > < / code > or < code class = "docutils literal notranslate" > < span class = "pre" > truncation< / span > < / code > .< / p >
< section id = "termination" >
< h2 > Termination< a class = "headerlink" href = "#termination" title = "Permalink to this heading" > #< / a > < / h2 >
< p > Termination refers to the episode ending after reaching a terminal state that is defined as part of the environment
definition. Examples are - task success, task failure, robot falling down etc. Notably, this also includes episodes
ending in finite-horizon environments due to a time-limit inherent to the environment. Note that to preserve Markov
property, a representation of the remaining time must be present in the agent’ s observation in finite-horizon environments.
< a class = "reference external" href = "https://arxiv.org/abs/1712.00378" > (Reference)< / a > < / p >
< / section >
< section id = "truncation" >
< h2 > Truncation< a class = "headerlink" href = "#truncation" title = "Permalink to this heading" > #< / a > < / h2 >
< p > Truncation refers to the episode ending after an externally defined condition (that is outside the scope of the Markov
Decision Process). This could be a time-limit, a robot going out of bounds etc.< / p >
< p > An infinite-horizon environment is an obvious example of where this is needed. We cannot wait forever for the episode
to complete, so we set a practical time-limit after which we forcibly halt the episode. The last state in this case is
not a terminal state since it has a non-zero transition probability of moving to another state as per the Markov
Decision Process that defines the RL problem. This is also different from time-limits in finite horizon environments
as the agent in this case has no idea about this time-limit.< / p >
< / section >
< section id = "importance-in-learning-code" >
< h2 > Importance in learning code< a class = "headerlink" href = "#importance-in-learning-code" title = "Permalink to this heading" > #< / a > < / h2 >
< p > Bootstrapping (using one or more estimated values of a variable to update estimates of the same variable) is a key
aspect of Reinforcement Learning. A value function will tell you how much discounted reward you will get from a
particular state if you follow a given policy. When an episode stops at any given point, by looking at the value of
the final state, the agent is able to estimate how much discounted reward could have been obtained if the episode has
continued. This is an example of handling truncation.< / p >
< p > More formally, a common example of bootstrapping in RL is updating the estimate of the Q-value function,< / p >
< div class = "math-wrapper docutils container" >
< div class = "math notranslate nohighlight" >
\[Q_{target}(o_t, a_t) = r_t + \gamma . \max_a(Q(o_{t+1}, a_{t+1}))\]< / div >
< / div >
< p > In classical RL, the new < code class = "docutils literal notranslate" > < span class = "pre" > Q< / span > < / code > estimate is a weighted average of the previous < code class = "docutils literal notranslate" > < span class = "pre" > Q< / span > < / code > estimate and < code class = "docutils literal notranslate" > < span class = "pre" > Q_target< / span > < / code > while in Deep
Q-Learning, the error between < code class = "docutils literal notranslate" > < span class = "pre" > Q_target< / span > < / code > and the previous < code class = "docutils literal notranslate" > < span class = "pre" > Q< / span > < / code > estimate is minimized.< / p >
< p > However, at the terminal state, bootstrapping is not done,< / p >
< div class = "math-wrapper docutils container" >
< div class = "math notranslate nohighlight" >
\[Q_{target}(o_t, a_t) = r_t\]< / div >
< / div >
< p > This is where the distinction between termination and truncation becomes important. When an episode ends due to
termination we don’ t bootstrap, when it ends due to truncation, we bootstrap.< / p >
< p > While using gymnasium environments, the < code class = "docutils literal notranslate" > < span class = "pre" > done< / span > < / code > signal (default for < v0.26) is frequently used to determine whether to
bootstrap or not. However, this is incorrect since it does not differentiate between termination and truncation.< / p >
< p > A simple example of value functions is shown below. This is an illustrative example and not part of any specific algorithm.< / p >
< div class = "highlight-python notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # INCORRECT< / span >
< span class = "n" > vf_target< / span > < span class = "o" > =< / span > < span class = "n" > rew< / span > < span class = "o" > +< / span > < span class = "n" > gamma< / span > < span class = "o" > *< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "o" > -< / span > < span class = "n" > done< / span > < span class = "p" > )< / span > < span class = "o" > *< / span > < span class = "n" > vf_next_state< / span >
< / pre > < / div >
< / div >
< p > This is incorrect in the case of episode ending due to a truncation, where bootstrapping needs to happen but it doesn’ t.< / p >
< / section >
< section id = "solution" >
< h2 > Solution< a class = "headerlink" href = "#solution" title = "Permalink to this heading" > #< / a > < / h2 >
< p > From v0.26 onwards, Gymnasium’ s < code class = "docutils literal notranslate" > < span class = "pre" > env.step< / span > < / code > API returns both termination and truncation information explicitly.
In the previous version truncation information was supplied through the info key < code class = "docutils literal notranslate" > < span class = "pre" > TimeLimit.truncated< / span > < / code > .
The correct way to handle terminations and truncations now is,< / p >
< div class = "highlight-python notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # terminated = done and ' TimeLimit.truncated' not in info< / span >
< span class = "c1" > # This was needed in previous versions.< / span >
< span class = "n" > vf_target< / span > < span class = "o" > =< / span > < span class = "n" > rew< / span > < span class = "o" > +< / span > < span class = "n" > gamma< / span > < span class = "o" > *< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "o" > -< / span > < span class = "n" > terminated< / span > < span class = "p" > )< / span > < span class = "o" > *< / span > < span class = "n" > vf_next_state< / span >
< / pre > < / div >
< / div >
< div class = "sphx-glr-footer sphx-glr-footer-example docutils container" id = "sphx-glr-download-tutorials-handling-time-limits-py" >
< div class = "sphx-glr-download sphx-glr-download-python docutils container" >
< p > < a class = "reference download internal" download = "" href = "../../_downloads/1ddb20b882782d2f22f1dd33432af412/handling_time_limits.py" > < code class = "xref download docutils literal notranslate" > < span class = "pre" > Download< / span > < span class = "pre" > Python< / span > < span class = "pre" > source< / span > < span class = "pre" > code:< / span > < span class = "pre" > handling_time_limits.py< / span > < / code > < / a > < / p >
< / div >
< div class = "sphx-glr-download sphx-glr-download-jupyter docutils container" >
< p > < a class = "reference download internal" download = "" href = "../../_downloads/bee952c8ccdb09b22233577d70a62253/handling_time_limits.ipynb" > < code class = "xref download docutils literal notranslate" > < span class = "pre" > Download< / span > < span class = "pre" > Jupyter< / span > < span class = "pre" > notebook:< / span > < span class = "pre" > handling_time_limits.ipynb< / span > < / code > < / a > < / p >
< / div >
< / div >
< / section >
< / section >
< / article >
< / div >
< footer >
< div class = "related-pages" >
< / div >
< div class = "bottom-of-page" >
< div class = "left-details" >
< div class = "copyright" >
2022-10-23 09:15:41 +00:00
Copyright © 2022 Farama Foundation
2022-10-21 15:39:00 +00:00
< / div >
<!--
Made with < a href = "https://www.sphinx-doc.org/" > Sphinx< / a > and < a class = "muted-link" href = "https://pradyunsg.me" > @pradyunsg< / a > 's
< a href = "https://github.com/pradyunsg/furo" > Furo< / a >
-->
< / div >
< div class = "right-details" >
< div class = "icons" >
< / div >
< / div >
< / div >
< / footer >
< / div >
< aside class = "toc-drawer" >
< div class = "toc-sticky toc-scroll" >
< div class = "toc-title-container" >
< span class = "toc-title" >
On this page
< / span >
< / div >
< div class = "toc-tree-container" >
< div class = "toc-tree" >
< ul >
< li > < a class = "reference internal" href = "#" > Handling Time Limits< / a > < ul >
< li > < a class = "reference internal" href = "#termination" > Termination< / a > < / li >
< li > < a class = "reference internal" href = "#truncation" > Truncation< / a > < / li >
< li > < a class = "reference internal" href = "#importance-in-learning-code" > Importance in learning code< / a > < / li >
< li > < a class = "reference internal" href = "#solution" > Solution< / a > < / li >
< / ul >
< / li >
< / ul >
< / div >
< / div >
< / div >
< / aside >
< / div >
< / div >
< script >
let toggleMenu = () => {
document.querySelector(".farama-header-menu").classList.toggle("active");
document.querySelector(".farama-header-menu__overlay").classList.toggle("active");
}
document.querySelector(".farama-header-menu__btn").addEventListener("click", toggleMenu);
document.getElementById("farama-close-menu").addEventListener("click", toggleMenu);
document.querySelector(".farama-header-menu__overlay").addEventListener("click", toggleMenu);
window.onclick = function(event) {
if (!event.target.matches('.farama-header-menu__btn')) {
const dropdown = document.querySelector(".farama-header-menu-container");
if (dropdown.classList.contains('active')) {
dropdown.classList.remove('active');
document.querySelector(".farama-header-menu__overlay").classList.remove("active");
}
}
}
< / script >
< script >
(() => {
if (!localStorage.getItem("shownCookieAlert")) {
const boxElem = document.createElement("div");
boxElem.classList.add("cookie-alert");
const containerElem = document.createElement("div");
containerElem.classList.add("cookie-alert__container");
const textElem = document.createElement("p");
textElem.innerHTML = `This page uses < a href = "https://analytics.google.com/" >
Google Analytics< / a > to collect statistics. You can disable it by blocking
the JavaScript coming from www.google-analytics.com.`;
containerElem.appendChild(textElem);
const closeBtn = document.createElement("button");
closeBtn.innerHTML = `<?xml version="1.0" ?> < svg viewBox = "0 0 32 32" xmlns = "http://www.w3.org/2000/svg" > < defs > < style > . cls-1 { fill : none ; stroke : #000 ; stroke-linecap : round ; stroke-linejoin : round ; stroke-width : 2 px ; } < / style > < / defs > < title / > < g id = "cross" > < line class = "cls-1" x1 = "7" x2 = "25" y1 = "7" y2 = "25" / > < line class = "cls-1" x1 = "7" x2 = "25" y1 = "25" y2 = "7" / > < / g > < / svg > `
closeBtn.onclick = () => {
localStorage.setItem("shownCookieAlert", "true");
boxElem.style.display = "none";
}
containerElem.appendChild(closeBtn);
boxElem.appendChild(containerElem);
document.body.appendChild(boxElem);
}
})()
< / script >
< script async src = "https://www.googletagmanager.com/gtag/js?id=G-6H9C8TWXZ8" > < / script >
< script >
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-6H9C8TWXZ8');
< / script >
< script data-url_root = "../../" id = "documentation_options" src = "../../_static/documentation_options.js" > < / script >
< script src = "../../_static/jquery.js" > < / script >
< script src = "../../_static/underscore.js" > < / script >
< script src = "../../_static/_sphinx_javascript_frameworks_compat.js" > < / script >
< script src = "../../_static/doctools.js" > < / script >
< script src = "../../_static/sphinx_highlight.js" > < / script >
< script src = "../../_static/scripts/furo.js" > < / script >
< script async = "async" src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" > < / script >
< / body >
< / html >