强化学习快餐教程(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]
目录
相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
强化学习:从游戏到机器人的技术之旅
【6月更文挑战第14天】强化学习是智能体通过与环境互动学习决策策略的方法,已在游戏(如AlphaGo和OpenAI Five)和机器人技术中展现出巨大潜力。在机器人领域,它应用于控制、动作学习和交互沟通,帮助机器人适应复杂环境和任务。尽管面临挑战,但随着技术发展,强化学习有望在更多领域发挥关键作用。
|
7月前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏中的应用:打造智能对手
【6月更文挑战第5天】强化学习,让机器通过试错在环境中学习最优策略,尤其在游戏领域中展现出强大的能力。如AlphaGo,通过学习大量围棋数据,成为顶尖对手。它不仅适用于围棋,也在现代电子游戏中让智能对手预测玩家行为,提升游戏体验。以下简短代码示例展示了使用Q-learning算法训练智能对手的基本过程,揭示了强化学习在游戏AI中的潜力。
110 1
|
8月前
|
存储 人工智能 C++
C++ 实现对战AI五子棋
C++ 实现对战AI五子棋
|
8月前
|
机器学习/深度学习 算法 机器人
深度强化学习之gym扫地机器人环境的搭建(持续更新算法,附源码,python实现)
深度强化学习之gym扫地机器人环境的搭建(持续更新算法,附源码,python实现)
244 0
|
人工智能 区块链
聊聊学习制作游戏的方法,以及最近大火的ChatGPT
先跟着入门课程把基础知识掌握好,把工具使用熟练,学习做游戏最重要的是动手做,尽可能完成每节课程后面的实践练习,只有做的多了,知识才能掌握的扎实,才能更快的入门。
196 0
|
机器学习/深度学习 Web App开发 自然语言处理
强化学习大牛Sergey Levine新作:三个大模型教会机器人认路
强化学习大牛Sergey Levine新作:三个大模型教会机器人认路
333 0
|
人工智能 机器人 测试技术
谷歌亮出 AI“王牌”,生成超逼真图片,网友:OpenAI DALL-E 要被碾压了?
如今的AI领域出现了一波新趋势——文本到图像生成器。只要把文本描述输入这些程序,它们主涌生成与描述内容高度匹配的精准图片。这些程序还支持各种风格,从油画、CGI 渲染再到实景照片无所不包。总之,只有你想不到,没有它画不出。
831 0
谷歌亮出 AI“王牌”,生成超逼真图片,网友:OpenAI DALL-E 要被碾压了?
|
机器学习/深度学习 算法 Python
强化学习快餐教程(3) - 一条命令搞定atari游戏
# 强化学习快餐教程(3) - 一条命令搞定atari游戏 通过上节的例子,我们试验出来,就算是像cartpole这样让一个杆子不倒这样的小模型,都不是特别容易搞定的。 那么像太空入侵者这么复杂的问题,建模都建不出来,算法该怎么写? 别急,我们从强化学习的基础来讲起,学习马尔可夫决策过程,了解贝尔曼方程、最优值函数、最优策略及其求解。然后学习动态规划法、蒙特卡洛法、时间差分法、值
1553 0
|
机器学习/深度学习 人工智能 定位技术
【DOTA之后新里程碑】DeepMind强化学习重大突破:AI在多人射击游戏完胜人类!
继OpenAI之后,DeepMind也在多智能体强化学习方面秀肌肉:首次在第一人称射击游戏的多人模式中完胜人类,而且没有使用大量训练局数,轻松超过了人类水平。
1893 0
|
机器学习/深度学习 移动开发 数据可视化
使用机器学习预测电子竞技游戏《守望先锋》的胜负
机器学习可以预测游戏的输赢?来看看Bowen Yang博士是如何构建这一模型的。
2489 0