冰冻湖 (Frozen Lake)

../../../_images/frozen_lake.gif

该环境属于文本玩具 (Toy Text) 环境,其中包含有关该环境的通用信息。

动作空间 (Action Space)

离散(4) (Discrete(4))

观测空间 (Observation Space)

离散(16) (Discrete(16))

导入

gymnasium.make("FrozenLake-v1")

冰冻湖环境涉及从起点到目标跨越一个冰冻的湖,玩家需要走过冰面而不能掉进任何洞里。由于冰面很滑,玩家可能无法总是按预期方向移动。

描述

游戏开始时玩家位于冰冻湖网格世界的 [0,0] 位置,目标位于世界的远端,例如 4x4 环境中的 [3,3]。

当使用预设地图时,冰上的洞分布在固定位置;当生成随机地图时,则分布在随机位置。

玩家持续移动,直到他们到达目标或掉入洞中。

湖面很滑(除非禁用),因此玩家有时可能会垂直于预期方向移动(参见 is_slippery)。

随机生成的世界总会有一条通往目标的路径。

精灵和凳子来自 https://franuka.itch.io/rpg-snow-tileset。所有其他素材由 Mel Tillery 提供 http://www.cyaneus.com/

动作空间

动作形状是 (1,),范围在 {0, 3} 之间,表示玩家移动的方向。

  • 0: 向左移动

  • 1: 向下移动

  • 2: 向右移动

  • 3: 向上移动

观测空间

观测值表示玩家当前位置,计算方式为 current_row * ncols + current_col(行和列都从 0 开始)。

例如,4x4 地图中的目标位置可以计算为:3 * 4 + 3 = 15。可能的观测数量取决于地图的大小。

观测值以 int() 类型返回。

起始状态

剧集开始时玩家处于状态 [0](位置 [0, 0])。

奖励

奖励计划

  • 到达目标: +1

  • 到达洞: 0

  • 到达冰面: 0

剧集结束

如果发生以下情况,剧集结束

  • 终止 (Termination)

    1. 玩家掉进一个洞里。

    2. 玩家到达目标 max(nrow) * max(ncol) - 1(位置 [max(nrow)-1, max(ncol)-1])。

  • 截断 (Truncation) (当使用 time_limit 包装器时)

    1. 4x4 环境的剧集长度为 100,FrozenLake8x8-v1 环境的剧集长度为 200。

信息

step()reset() 返回一个包含以下键的字典

  • p - 状态的转移概率。

有关转移概率信息,请参阅 is_slippery

参数

import gymnasium as gym
gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=True)

desc=None: 用于指定非预加载地图。

指定自定义地图。

    desc=["SFFF", "FHFH", "FFFH", "HFFG"].

瓷砖字母表示

  • “S” 代表起始瓷砖 (Start tile)

  • “G” 代表目标瓷砖 (Goal tile)

  • “F” 代表冰冻瓷砖 (Frozen tile)

  • “H” 代表带洞的瓷砖 (a tile with a hole)

可以通过调用函数 generate_random_map 来指定随机生成的地图。

from gymnasium.envs.toy_text.frozen_lake import generate_random_map

gym.make('FrozenLake-v1', desc=generate_random_map(size=8))

map_name="4x4": 用于使用任何预加载地图的 ID。

    "4x4":[
        "SFFF",
        "FHFH",
        "FFFH",
        "HFFG"
        ]

    "8x8": [
        "SFFFFFFF",
        "FFFFFFFF",
        "FFFHFFFF",
        "FFFFFHFF",
        "FFFHFFFF",
        "FHHFFFHF",
        "FHFFHFHF",
        "FFFHFFFG",
    ]

如果 desc=None,则将使用 map_name。如果 descmap_name 都为 None,将生成一个随机的 8x8 地图,其中 80% 的位置是冰冻的。

is_slippery=True: 如果为 True,玩家将以 1/3 的概率沿预期方向移动,否则将以各 1/3 的概率沿两个垂直方向移动。

例如,如果动作为左,且 is_slippery 为 True,则

  • P(向左移动)=1/3

  • P(向上移动)=1/3

  • P(向下移动)=1/3

版本历史

  • v1: 奖励的 Bug 修复

  • v0: 初始版本发布