PyTorch強化學習——模擬FrozenLake環境

語言: CN / TW / HK

theme: hydrogen

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第21天,點選檢視活動詳情

FrozenLake環境

FrozenLake 是典型的具有離散狀態空間的 Gym 環境,在此環境中,智慧體需要在網格中從起始位置移動到目標位置,同時應當避開陷阱。網格的尺寸為四乘四 (FrozenLake-v0) 或八乘八 (FrozenLake8x8-v0),網格中的格子包含以下四種類型: - S:起始位置 - G:目標位置,該位置可用於結束一個回合 - F:結冰的格子,這是智慧體可以移動到的位置 - H:包含陷阱的格子,該位置可用於結束一個回合

FrozenLake 環境中可以執行四個動作:向左移動 (0),向下移動 (1),向右移動 (2) 和向上移動 (3)。如果智慧體成功到達目標位置,則獎勵為 +1,否則為 0。此外,狀態空間以 16 維整數陣列表示。

需要注意的是,在 FrozenLake 環境中,由於冰面很滑,因此智慧體不會始終按照指定的方向移動。例如,當執行向下移動的動作時,智慧體也可能向左或向右移動。

模擬FrozenLake環境

本節中,我們將模擬一個 4x4FrozenLake 環境。 首先,匯入 gym 庫並建立 FrozenLake 環境的例項,並重置環境,智慧體從狀態 0 開始: ```python import gym import torch env = gym.make('FrozenLake-v0') n_state = env.observation_space.n print(n_state)

16

n_action = env.action_space.n print(n_action)

4

env.reset() 渲染環境,可以看到一個4 * 4矩陣,它表示智慧體所在的冰凍湖面網格和當前所在格子(背景為紅色,此時狀態為 `0`):python env.render() ```

FrozenLake環境

因為智慧體當前可以繼續移動,指定智慧體向下移動,渲染動作執行後的環境。可以看到動作執行後的冰凍湖面環境網格,其中智慧體向右移動到狀態 1,看到智慧體並不一定以指定的動作 (1,即向下)執行: python new_state, reward, is_done, info = env.step(1) env.render()

FrozenLake環境

打印出所有返回的資訊,可以看到智慧體會以 33.33% 的概率進入狀態 4python print(new_state) print(reward) print(is_done) print(info) 打印出的結果如下: shell 1 0.0 False {'prob': 0.3333333333333333} 得到的獎勵為 0,因為尚未達到目標位置並且回合尚未結束,同時可能會看到智慧體因格子光滑而移動到狀態 1、狀態 4 或停留在狀態 0。 如果滿足以下兩個條件之一,則回合將終止: - 智慧體移動到 H 格子(狀態 571112):產生的總獎勵為 0 - 智慧體移動到 G 格子(狀態 15):產生的總獎勵為 +1

為了驗證在冰凍的湖面上移動的困難性,使用隨機策略並執行 1000 回合計算平均總報酬。首先,定義函式 run_episode 用於根據給定策略模擬給定一個 FrozenLake 回合並返回總獎勵: python def run_episode(env, policy): state = env.reset() total_reward = 0 is_done = False while not is_done: action = policy[state].item() state, reward, is_done, info = env.step(action) total_reward += reward if is_done: break return total_reward 隨機生成一個策略,並將在每個回合中使用該策略,共執行 1000 回合,並計算平均獎勵: ```python n_episode = 1000 total_rewards = [] for episode in range(n_episode): random_policy = torch.randint(high=n_action, size=(n_state,)) total_reward = run_episode(env, random_policy) total_rewards.append(total_reward)

print('Average total reward under random policy: {}'.format(sum(total_rewards) / n_episode)) 我們使用隨機生成的策略由 `16` 個動作組成,其對應於 `FrozenLake` 中的 `16` 個狀態,指定了在某一狀態時應執行的動作。需要強調的是,在 `FrozenLake` 中,運動方向僅部分取決於所選的動作,這增加了控制的不確定性。打印出的平均獎勵如下所示,我們可以認為,如果採用隨機動作,那麼智慧體平均只有 `1.1%` 的概率可以到達目標:shell Average total reward under random policy: 0.011 ```