前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Q-learning 的 python 实现

Q-learning 的 python 实现

作者头像
杨熹
发布2020-03-20 11:25:36
8250
发布2020-03-20 11:25:36
举报
文章被收录于专栏:杨熹的专栏杨熹的专栏

通过前面的几篇文章可以知道,当我们要用 Q-learning 解决一个问题时,首先需要知道这个问题有多少个 state,每个 state 有多少 action,并且建立一个奖励表格 P,维度是 action * 4,这4列分别标记着采取每个 action 的概率,采取每个 action 下一步会到达的 new state,采取每个 action 会获得的奖励,以及游戏是否结束。

Q-learning 会先建立一个全是 0 的 Q-table,此时agent对环境一无所知,会先进行探索,就是随机选择一个 state,随机选择一个 action,这样通过表格 P,就能得到下一个状态,以及此时的奖励,于是由 Q-function 可以计算出这对 state-action 组合的 Q-value,进而 Q-table 得到更新。

一直重复上述过程,当 agent 对环境有一定的了解后,即 Q-table 有了一些数值后,就可以利用环境,即在选择 action 时不是随机选取,而是选择 Q-table 中当前 state 下所有 action 中选择 Q-value 最大的那个 action,用这对 state-action 得到的下一步状态和奖励来更新 Q-table。

重复上述的过程,最后得到一个收敛的 Q-table,然后就可以用查表的方法查看在每个状态时选哪个 action 会更好呢。

上面的思路用代码写出来就是:

代码语言:javascript
复制
!pip install cmake 'gym[atari]' scipy

import gym

env = gym.make("Taxi-v2").env

env.render()

import numpy as np
q_table = np.zeros([env.observation_space.n, env.action_space.n])

%%time
"""Training the agent"""

import random
from IPython.display import clear_output

# Hyperparameters
alpha = 0.1
gamma = 0.6
epsilon = 0.1

# For plotting metrics
all_epochs = []
all_penalties = []

for i in range(1, 100001):
    state = env.reset()

    epochs, penalties, reward, = 0, 0, 0
    done = False
    
    while not done:
        if random.uniform(0, 1) < epsilon:
            action = env.action_space.sample() # Explore action space
        else:
            action = np.argmax(q_table[state]) # Exploit learned values

        next_state, reward, done, info = env.step(action) 
        
        old_value = q_table[state, action]
        next_max = np.max(q_table[next_state])
        
        new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
        q_table[state, action] = new_value

        if reward == -10:
            penalties += 1

        state = next_state
        epochs += 1
        
    if i % 100 == 0:
        clear_output(wait=True)
        print(f"Episode: {i}")

print("Training finished.\n")

q_table[328]

参考文献 https://www.learndatasci.com/tutorials/reinforcement-q-learning-scratch-python-openai-gym/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档