强化学习算法回顾 Q-learning 玩 OpenAI 的 Taxi 游戏

2023-11-05

在这里插入图片描述
这里使用的是 OpenAI Taxi-V3 环境

这里有 4 个地点,分别用 4 个字母表示,任务是要从一个地点接上乘客,送到另外 3 个中的一个放下乘客,越快越好。
在这里插入图片描述

  • 成功运送一个客人获得 20 分奖励
  • 每走一步损失 1 分(希望尽快送到目的地)
  • 没有把客人放到指定的位置,损失 10 分
  • 渲染图中显示,一共 R,G,B,Y 这 4 个地点,黄色的块是 taxi,其中 “:” 栅栏可以穿越,"|" 栅栏不能穿越
  • 蓝色显示的就是有乘客的地方,红色显示的就是乘客的目的地

Step 0: 安装依赖

需要 3 个库:

  • Numpy 用来存储和更新 Q 表
  • OpenAI Gym 用来创建交互环境
  • Random 用来产生随机数
import numpy as np
import gym
import random

Step 1: 创建环境

  • 创建 Taxi environment
  • OpenAI Gym 里面有很多环境提供给强化学习使用
env = gym.make("Taxi-v3")
env.render()

Step 2: 创建 Q 表并初始化

  • 创建 Q 表的前提,是知道有多少状态和动作的维度
  • OpenAI Gym 提供了两个接口 env.action_space.nenv.observation_space.n
action_size = env.action_space.n # 获取动作维度(一个状态下有几种动作选择)
print("Action size ", action_size)

state_size = env.observation_space.n # 获取状态维度(一共多少种状态)
print("State size ", state_size)
qtable = np.zeros((state_size, action_size)) # 初始化 Q 表
print(qtable)

Step 3: 超参数设置

明确超参数:

total_episodes = 50000        # 一共玩多少局游戏
total_test_episodes = 100     # 测试中一共走几步
max_steps = 99                # 每一局游戏最多走几步

learning_rate = 0.7           # 学习率
gamma = 0.618                 # 未来奖励折扣率

# 探索相关参数
epsilon = 1.0                 # 探索概率
max_epsilon = 1.0             # 一开始的探索概率
min_epsilon = 0.01            # 最低的探索概率 
decay_rate = 0.01             # 探索概率的指数衰减概率

Step 4: Q learning 算法

  • Q learning 算法具体实施:
# 循环 50000 局游戏
for episode in range(total_episodes):
		# 重置环境
    state = env.reset()
    step = 0
    done = False
    
    for step in range(max_steps): # 每一局游戏最多 99 步
        # 3. Choose an action a in the current world state (s)
        ## 生成 0~1 之间的随机数
        exp_exp_tradeoff = random.uniform(0,1)
        
        ## 如果这个数字大于 探索概率(开始时为 1),则进行开发(选择最大 Q 的动作)
        if exp_exp_tradeoff > epsilon:
            action = np.argmax(qtable[state,:])
        
        ## 否则,进行探索(选择随机动作)
        else:
            action = env.action_space.sample()
        
        # 这个动作与环境交互后,获得奖励,环境变成新的状态
        new_state, reward, done, info = env.step(action)

        # 按照公式 Q(s,a):= Q(s,a) + lr [R(s,a) + gamma * max Q(s',a') - Q(s,a)] 更新 Q 表
        qtable[state, action] = qtable[state, action] + learning_rate * (reward + gamma * 
                                    np.max(qtable[new_state, :]) - qtable[state, action])
                
        # 迭代环境状态
        state = new_state
        
        # 如果游戏结束,则跳出循环
        if done == True: 
            break
    
    # 减小探索概率(由于不确定性越来越小)
    epsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episode) 

Step 5: 使用 Q 表来玩 Taxi !

  • 大约 50 000 局以后,就达到很好的训练结果
  • 看看我们训练的智能体如何玩 Taxi
env.reset()
rewards = []

for episode in range(total_test_episodes):
    state = env.reset()
    step = 0
    done = False
    total_rewards = 0
    print("****************************************************")
    print("EPISODE ", episode)

    for step in range(max_steps):
        env.render()
        # 测试中我们就不需要探索了,只要选择最优动作
        action = np.argmax(qtable[state,:])
        
        new_state, reward, done, info = env.step(action)
        
        total_rewards += reward
        
        if done:
            rewards.append(total_rewards)
            print ("Score", total_rewards)
            break
        state = new_state
env.close()
print ("Score over time: " +  str(sum(rewards)/total_test_episodes))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强化学习算法回顾 Q-learning 玩 OpenAI 的 Taxi 游戏 的相关文章

随机推荐

  • RestTemplate的详解

    引言 在SpringCloud微服务中 通过引入 ribbon实现了服务消费者的客户端负载均衡功能 在这个过程中使用了一个非常有用的对象 RestTemplate 该对象会使用 Ribbon 的自动化配置 同时通过配置 LoadBalanc
  • MATLAB 程序设计

    文章目录 前言 一 M文件操作介绍 M文件的创建与打开 1 建立新的M文件 2 打开已有的 文件 3 脚本文件的运行 二 输入输出语句 1 输入函数 input 2 输出函数 display和disp 3 格式化输出函数 fprintf 4
  • 把单元格一分为二_excel如何把一个单元格分成两个 excel单元格拆分为二行

    excel如何把一个单元格分成两个 excel单元格拆分为二行 excel助手 今天为大家分享一篇干货知识 如何设置excel单元格拆分为二行 今天的分享角度是从工作中常用的角度谈的 正如标题提到的 excel如何把一个单元格分成两个 ex
  • 线性代数笔记 2 - 矩阵的初等变换

    矩阵的初等变换 初等行变换 对换两行 对换i j 两行 记作 r i r j
  • abp web.mvc项目中的菜单加载机制

    abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样 它是在编写代码的时候配置 而我们一般写的通用权限管理系统中 是后期在后台界面中添加的 这一点有很大不同 abp关于菜单的定义及管理挺复杂的 与菜单相关的结构类 接口及扩展
  • ArcGIS Server Linux 10.7压缩包

    ArcGIS Server Linux 10 7压缩包 链接 https pan baidu com s 1GYjElpbXZN0938 vWyWSOA 提取码 nkbp
  • 分享一个去水印接口,完全免费,早点下手啊

    上传到任意空间或者服务器 访问即可用 目前支持很多平台 抖音 快手 皮皮虾 西瓜 红书 微视 最右 哔哩哔哩 皮皮搞笑等常见平台 而且还是免费的 该接口测试 完全免费 如果那天收费了 大家可以直接放弃使用
  • linux下如何清理缓存

    手头的路由本身内存就比较少 上面又跑了一个nginx php的环境 简直慢的爆炸 check的时候发现内存经常被占了很多 linux的虚拟内存机制 很多时候回导致内存得不到及时释放 有时候内存很少了 kill了很多进程 但是内存还是没有释放
  • React_井字棋

    该项目是跟着react官网写的 由于是初学 就只用来记录自己的代码 如果和我一样是初学react建议看官网 react import React from react import ReactDOM from react dom clien
  • C++的范围for语句详解 附易错实例

    博客内容 C 读取一行内个数不定的整数的方式 作 者 陈大大陈 个人简介 一个正在努力学技术的准前端 专注基础和实战分享 欢迎私信 欢迎大家 这里是CSDN 我总结知识和写笔记的地方 喜欢的话请三连 有问题请私信 范围for语句是C 引入的
  • 深度学习做分类时出现list index out of range解决办法之一

    error list index out of range 索引出了问题 首先检查一下自己的数组索引是不是真的有问题 如果没问题就是自己读入的文件里包含不能识别的字符 比如空格 参考 https blog csdn net weixin 3
  • Ubuntu 12.04 下安装ncurses-devel

    解决Ubuntu 12 04 使用 make menuconfig 配置Linux 内核时 出现缺少 ncurses devel 库支持 Unable to find the ncurses libraries or the require
  • Instrusive 【HDU - 5040】【2014 北京 BFS】

    题目链接 一道有着很多需要细节的地方需要注意的题 挺不错的 这题的数据也是给的很好 然后讲一下题意吧 题意 有一个N N的网格 有起点M和终点T 我们从起点需要走到终点 每一步需要花费的时间是单位一 但是呢 我们不能被摄影机拍摄到 摄影机是
  • halcon21.11安装教程详解

    文章目录 1 软件下载 2 安装过程 halcon21 11安装教程详解 1 软件下载 a 官网 https www mvtec com cn b 百度网盘下载 链接 https pan baidu com s 1 Bdz1l54PQWxb
  • Pycharm-Python 下载安装第三方库

    Pycharm Python 下载安装第三方库 一 安装第三方库 00 新建项目 02 两种安装方式 通过代码提示安装 pip install 安装 二 小结 最近我使用 pip install 安装第三方库时出现了一些问题 不知道为什么
  • nvidia自动更新带来的问题

    实验室的ubuntu 14 04 lts server 上的gpu突然不能用了 使用 nvidia smi 查看gpu信息时显示 Failed to initialize NVML GPU access blocked by the ope
  • leetcode 54. 螺旋矩阵 python

    题目描述 题解 1 逆时针的遍历顺序为 右 下 左 上 定义一个directions的list 分别对应这四个方向 如果当前方向的下一个位置到达matrix边界或者已经被访问过 则变换为下一个方向 2 定义一个和输入matrix大小相同的f
  • scala学习-Description Resource Path Location Type value toDF is not a member of org.apache.spark.rdd.R

    编译如下代码时 出现value toDF is not a member of org apache Spark rdd RDD People 错误 val rdd RDD People sparkSession sparkContext
  • 单例模式详解----懒汉式/饿汉式(C++实现)

    单例模式 单例模式是一种常用的软件设计模式 它的核心结构中只包含一个被称为单例的特殊类 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 从而方便对实例个数的控制并节约系统资源 如果希望在系统中某个类的对象只能存在一个 单
  • 强化学习算法回顾 Q-learning 玩 OpenAI 的 Taxi 游戏

    这里使用的是 OpenAI Taxi V3 环境 这里有 4 个地点 分别用 4 个字母表示 任务是要从一个地点接上乘客 送到另外 3 个中的一个放下乘客 越快越好 成功运送一个客人获得 20 分奖励 每走一步损失 1 分 希望尽快送到目的