Dqn
DQN学习与实验
实验环境
dqn本质上只是使用函数去拟合qlearning中的qtable
本文将训练ai完成 Frozen Lake 游戏,一个4*4大小的格子表示一块冰面,冰面中有一些随机的破洞,这些洞一旦指定就不会改变,agent的目标就是从格子的左上角成功走到右下角。
每个格子标号为1-16,即agent的observation为1-16。agent的action为0-3,分别表示上下左右移动
详见:https://www.gymlibrary.dev/environments/toy_text/frozen_lake/
QLearning
import gym
import numpy as np
import random
# qTable
qtable = np.zeros(shape=(4 * 4, 4))
# 学习率,
alpha = 0.5
# 折损率,未来得到的奖励多大程度上依赖当前行为
gamma = 0.8
def choose_act(state):
# return random.sample(range(3), 1)[0]
# 在qTable中找到当前状态下最优的动作,若最优动作有多个,则随机从中选择一个
return random.sample(np.where(qtable[state] == np.max(qtable[state]))[0].tolist(), 1)[0]
def qlearning():
env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=False, render_mode='human', new_step_api=True)
state = env.reset()
# 进行1000局游戏
for i in range(1000):
# 每一局都可以进行无限步,知道该局游戏结束
while True:
act = choose_act(state)
# terminate表示该局游戏是否终止,truncated表示该局游戏是否为不正常结束,例如由于时间限制,或agent跑到地图边界外了
next_state, reward, terminate, truncated, info = env.step(act)
# 惩罚条件,由于该游戏原本只有成功奖励,而没设置惩罚条件,所以导致agent学不到错误的知识,训练过程异常缓慢
# if state == next_state or truncated or (terminate and reward == 0):
# reward -= 1
# reward -= 0.1
# 根据贝尔曼方程更新qTable
qtable[state, act] = (1 - alpha) * qtable[state, act] + alpha * (reward + gamma * np.max(qtable[next_state]))
state = next_state
env.render()
if terminate or truncated:
state = env.reset()
break
if __name__ == "__main__":
qlearning()
使用qlearning处理这种小型离散认为可以很快收敛