强化学习快餐教程(2) - atari游戏

简介: # 强化学习快餐教程(2) - atari游戏 不知道看了上节的内容,大家有没有找到让杆不倒的好算法。 现在我们晋阶一下,向世界上第一种大规模的游戏机atari前进。 ## 太空入侵者 可以通过 ``` pip install atari_py ``` 来安装atari游戏。 下面我们以SpaceInvaders-v0为例看下Atari游戏的环境的特点。 #

强化学习快餐教程(2) - atari游戏

不知道看了上节的内容,大家有没有找到让杆不倒的好算法。
现在我们晋阶一下,向世界上第一种大规模的游戏机atari前进。

太空入侵者

可以通过

pip install atari_py

来安装atari游戏。

下面我们以SpaceInvaders-v0为例看下Atari游戏的环境的特点。

图形版

在太空入侵者中,支持的输入有6种,一个是什么也不做,一个是开火,另4个是控制方向:

  • 0: NOOP
  • 1: FIRE
  • 2: UP
  • 3: RIGHT
  • 4: LEFT
  • 5: DOWN

我们从环境中获取的信息是什么呢?很不幸,是一个(210, 160, 3)的图片,显示出来是这样的:
pic-0.jpg

我们写代码把这个环境搭起来。策略嘛,我就原地不动一直开火。

import gym
from skimage import io
env = gym.make('SpaceInvaders-v0')
status = env.reset()

for step in range(1000):
    env.render()
    thisstep = 1
    status, reward, done, info = env.step(thisstep)
    jpgname = './pic-%d.jpg' % step
    io.imsave(jpgname,status)
    print(reward)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

大家可以通过保存下来的pic-x.jpg来直观观察游戏的情况,比如我在第138步时,打中了一个5分的入侵者。
pic-138.jpg

太空入侵者这个游戏的策略比起cartpole,需要分析图像,这个是不足。但是它也是有好处的,就是reward参数现在会把分数返回给我们。总算是分数处理上不需要搞图像分析了。

下面我来写个算法吧,以1/4的概率左右移动,另外3/4开火:

import gym
env = gym.make('SpaceInvaders-v0')
status = env.reset()

def policy(step): 
    state_pool = [3,4,3,3,4,4,3,3,3,4,4,4,3,3,3,3,4,4,4,4]
    if step % 4 == 0: 
        pos = step / 4
        result = state_pool[int(pos % (len(state_pool)))] 
        return result
    else: 
        return 1

for step in range(10000):
    env.render()
    thisstep = policy(step)
    print(thisstep)
    status, reward, done, info = env.step(thisstep)
    #print(reward)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

内存版

如果图像分析做起来不方便的话,gym还为我们提供了RAM版的。就是将游戏机中的128个字节的内存信息提供给我们。
下面是env.reset的128个字节的例子:

[  0   7   0  68 241 162  34 183  68  13 124 255 255  50 255 255   0  36
  63  63  63  63  63  63  82   0  23  43  35 117 180   0  36  63  63  63
  63  63  63 110   0  23   1  60 126 126 126 126 255 255 255 195  60 126
 126 126 126 255 255 255 195  60 126 126 126 126 255 255 255 195   0   0
  48   3 129   0   0   0   0   0   0 246 246  63  63 246 246  63  63   0
  21  24   0  52  82 196 246  20   7   0 226   0   0   0   0   0  21  63
   0 128 171   0 255   0 189   0   0   0   0   0  99 255   0   0 235 254
 192 242]

输入的部分跟图像版是一样的,我们代码修改如下:

import gym
env = gym.make('SpaceInvaders-ram-v0')
status = env.reset()
print(status)

def policy(step): 
    state_pool = [3,4,3,3,4,4,3,3,3,4,4,4,3,3,3,3,4,4,4,4]
    if step % 4 == 0: 
        pos = step / 4
        result = state_pool[int(pos % (len(state_pool)))] 
        return result
    else: 
        return 1

for step in range(10000):
    env.render()
    thisstep = policy(step)
    #print(thisstep)
    status, reward, done, info = env.step(thisstep)
    #print(reward)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

breakout

下面我们再来一个弹球游戏。

breakout-0.jpg

弹球游戏的输入是4个值。

图片版的:

import gym
from skimage import io
env = gym.make('Breakout-v0')
status = env.reset()
#print(status)
print(env.action_space)

def policy(step):
    if step % 2 == 0:  
        return 2
    else: 
        return 3

for step in range(100):
    env.render()
    thisstep = policy(step)
    #print(thisstep)
    status, reward, done, info = env.step(thisstep)
    jpgname = './pic-%d.jpg' % step
    io.imsave(jpgname,status)

    #print(reward)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

RAM版的例子:

import gym
env = gym.make('Breakout-ram-v0')
status = env.reset()
print(status)
print(env.action_space)

def policy(step): 
    return step % 4

for step in range(100):
    env.render()
    thisstep = policy(step)
    #print(thisstep)
    status, reward, done, info = env.step(thisstep)
    #print(reward)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

RAM的初始值:

[ 63  63  63  63  63  63 255 255 255 255 255 255 255 255 255 255 255 255
 255 255 255 255 255 255 255 255 255 255 255 255 192 192 192 192 192 192
 255 255 255 255 255 255 255 255 255 255 255 255 255 240   0   0 255   0
   0 240   0   5   0   0   6   0  70 182 134 198  22  38  54  70  88   6
 146   0   8   0   0   0   0   0   0 241   0 242   0 242  25 241   5 242
   0   0 255   0 228   0   0   0   0   0   0   0   0   0   0   0   0   0
   8   0 255 255 255 255 255 255 255   0   0   5   0   0 186 214 117 246
 219 242]
目录
相关文章
|
数据库
【latex】在Overleaf的IEEE会议模板中,快速插入参考文献
【latex】在Overleaf的IEEE会议模板中,快速插入参考文献
3036 1
|
2月前
|
存储 缓存 API
信息检索重排序技术深度解析:Cross-Encoders、ColBERT与大语言模型方法的实践对比
本文将深入分析三种主流的重排序技术:Cross-Encoders(交叉编码器)、ColBERT以及基于大语言模型的重排序器,并详细阐述各方案在实际应用中的性能表现、成本考量以及适用场景。
195 3
信息检索重排序技术深度解析:Cross-Encoders、ColBERT与大语言模型方法的实践对比
|
7月前
|
机器学习/深度学习 人工智能 算法
DeepSeek-R1论文细节时间线梳理
中国AI初创公司DeepSeek发布了大语言模型R1,该模型在推理任务上媲美OpenAI的ChatGPT,且训练成本仅600万美元。DeepSeek由杭州对冲基金High-Flyer支持,总部位于杭州和北京。R1基于V3-Base,使用监督微调和强化学习训练,针对硬件限制进行了优化。模型在多语言处理、推理风格等方面表现出色,但存在一些局限性,如法语表现欠佳、偶尔切换语言等。DeepSeek的创新技术包括FP8量化、多头潜在注意力和蒸馏方法,引发了广泛关注和讨论。开源社区正积极尝试复现其结果,但面临训练数据和代码未公开的挑战。DeepSeek的低成本高效训练策略为AI领域带来了新的思考方向。
452 2
|
7月前
|
Web App开发 编解码 弹性计算
实时云渲染技术布道 | 像素流送技术与商业化实时云渲染产品的指标对比
随着虚幻引擎(UE)在高品质应用开发中的广泛应用,大内容与轻终端的矛盾日益突出。实时云渲染技术应运而生,成为解决这一矛盾的关键。本文以LarkXR实时云渲染平台为例,对比UE自带的像素流送插件,探讨云渲染技术的革新。LarkXR提供完整的实时云渲染PaaS服务,涵盖云端算力管理、网络传输优化和异构终端接入全流程,支持2K-8K分辨率、30-120FPS帧率,具备强大的集群并发能力和多引擎兼容性,整体性价比远高于像素流送,为开发者提供了更高效、专业可靠的解决方案。
|
Ubuntu Linux Shell
mc实现目录同步并封装成Linux服务形式
mc实现目录同步并封装成Linux服务形式
472 95
|
传感器 自动驾驶 算法
【OpenAI】Python:基于 Gym-CarRacing 的自动驾驶项目(1) | 前置知识介绍 | 项目环境准备 | 手把手带你一步步实现
【OpenAI】Python:基于 Gym-CarRacing 的自动驾驶项目(1) | 前置知识介绍 | 项目环境准备 | 手把手带你一步步实现
1313 0
|
11月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
11月前
|
网络协议 Windows
Windows Server 2019 DHCP服务器搭建
Windows Server 2019 DHCP服务器搭建
244 3
|
关系型数据库 MySQL 数据库
MySQL 复制A的表结构和数据到表B
在MySQL中复制表A至表B可通过不同方法实现。一种是先用`CREATE TABLE B LIKE A;`复制结构,再用`INSERT INTO B SELECT * FROM A;`填充数据。另一种更简便的方法是直接使用`CREATE TABLE B AS SELECT * FROM A;`一次性完成结构和数据的复制。还有一种高级方法是通过`SHOW CREATE TABLE A;`获取表A的创建语句,手动调整后创建表B,如有需要再用`INSERT INTO ... SELECT`复制数据。注意权限问题、跨数据库复制时需指定数据库名,以及大表复制时可能影响性能。
671 1
|
IDE Java 开发工具
【Eclipse安装及使用(面向小白)】
【Eclipse安装及使用(面向小白)】