编者按:近年来,虽然关于强化学习进展的新闻屡见报端,对强化学习感兴趣的人也很多,但对普通学习者来说,真正做一个自己感兴趣的强化学习项目还是太麻烦了。今天论智给大家推荐的是一名网友开源的Python库,它提供了一个可以玩任何旧版街机游戏的API,操作方式非常亲民。

这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用。通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状态,以及发送与游戏交互的动作。

安装

GitHub地址:github.com/M-J-Murray/MAMEToolkit/blob/master/README.md

你可以用pip安装这个库,只需运行以下命令:

pip install MAMEToolkit

演示示例:街霸

在街机爱好者心中,街霸是史上最经典的游戏之一。现在工具包内包含的街霸版本是街头霸王3:三度冲击(Japan 990608, NO CD),我们以此为例,用以下代码写一个随机智能体:

import random
from MAMEToolkit.sf_environment import Environment
roms_path = "roms/"
env = Environment("env1", roms_path)
env.start()
while True:move_action = random.randint(0, 8)attack_action = random.randint(0, 9)frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action)if game_done:env.new_game()elif stage_done:env.next_stage()elif round_done:env.next_round()

这个工具包还支持hogwild!训练:

什么是hogwild!? Niu等人引入了一个叫做 Hogwild! 的更新策略,可以使 SGD 可以在多 CPU 上并行更新。处理器在无需对参数加锁的情况下就可以访问共享内存。但仅在输入的是稀疏数据时才有效,因为每次更新仅修改所有参数的一小部分。他们展示了在这种情况下,更新策略几乎可以达到一个最优的收敛率,因为处理器不太可能覆盖掉有用的信息。

from threading import Thread
import random
from MAMEToolkit.sf_environment import Environment
def run_env(env):env.start()while True:move_action = random.randint(0, 8)attack_action = random.randint(0, 9)frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action)if game_done:env.new_game()elif stage_done:env.next_stage()elif round_done:env.next_round()
def main():workers = 8# Environments must be created outside of the threadsroms_path = "roms/"envs = [Environment(f"env{i}", roms_path) for i in range(workers)]threads = [Thread(target=run_env, args=(envs[i], )) for i in range(workers)][thread.start() for thread in threads]

建立自己的游戏环境

这个工具包之所以易于上手,是因为它和模拟器本身不需要太多交互,只需注意两点——一是查找你关注的内部状态相关联的内存地址值,二是用选取的环境跟踪状态。你可以用MAME Cheat Debugger,它会反馈游戏的内存地址值如何随时间变化。如果要创建游戏模拟,你得先获得正在模拟的游戏的ROM,并知道MAME使用的游戏ID,比如街霸的ID是'sfiii3n'。

游戏ID

你可以通过运行以下代码找到游戏的ID:

from MAMEToolkit.emulator import Emulator
emulator = Emulator("env1", "", "", memory_addresses)

这个命令会打开MAME仿真器。你可以搜索游戏列表以找到想要的游戏,游戏的ID位于游戏标题末尾的括号中。

内存地址

如果获得了ID,也有了想要跟踪的内存地址,你可以开始模拟:

from MAMEToolkit.emulator import Emulator
from MAMEToolkit.emulator import Address
roms_path = "roms/"
game_id = "sfiii3n"
memory_addresses = {"fighting": Address('0x0200EE44', 'u8'),"winsP1": Address('0x02011383', 'u8'),"winsP2": Address('0x02011385', 'u8'),"healthP1": Address('0x02068D0B', 's8'),"healthP2": Address('0x020691A3', 's8')}
emulator = Emulator("env1", roms_path, "sfiii3n", memory_addresses)

这会启动仿真器,并在工具包连接到模拟器进程时暂停。

分步运行仿真器

连接工具箱后,你可以分步运行仿真器:

data = emulator.step([])
frame = data["frame"]
is_fighting = data["fighting"]
player1_wins = data["winsP1"]
player2_wins = data["winsP2"]
player1_health = data["healthP1"]
player2_health = data["healthP2"]

step函数会把帧数据作为NumPy矩阵返回,同时,它也会返回该时间步长的所有内存地址整数值。

如果要向仿真器输入动作,你还需要确定游戏支持的输入端口和字段。比如玩街霸需要先投币,这个代码是:

from MAMEToolkit.emulator import Action
insert_coin = Action(':INPUTS', 'Coin 1')
data = emulator.step([insert_coin])

要确定哪些端口可用,请使用list actions命令:

from MAMEToolkit.emulator import list_actions
roms_path = "roms/"
game_id = "sfiii3n"
print(list_actions(roms_path, game_id))

下面这个返回的列表就包含街霸环境中可用于向步骤函数发送动作的所有端口和字段:

[{'port': ':scsi:1:cdrom:SCSI_ID', 'field': 'SCSI ID'}, {'port': ':INPUTS', 'field': 'P2 Jab Punch'}, {'port': ':INPUTS', 'field': 'P1 Left'}, {'port': ':INPUTS', 'field': 'P2 Fierce Punch'}, {'port': ':INPUTS', 'field': 'P1 Down'}, {'port': ':INPUTS', 'field': 'P2 Down'}, {'port': ':INPUTS', 'field': 'P2 Roundhouse Kick'}, {'port': ':INPUTS', 'field': 'P2 Strong Punch'}, {'port': ':INPUTS', 'field': 'P1 Strong Punch'}, {'port': ':INPUTS', 'field': '2 Players Start'}, {'port': ':INPUTS', 'field': 'Coin 1'}, {'port': ':INPUTS', 'field': '1 Player Start'}, {'port': ':INPUTS', 'field': 'P2 Right'}, {'port': ':INPUTS', 'field': 'Service 1'}, {'port': ':INPUTS', 'field': 'Coin 2'}, {'port': ':INPUTS', 'field': 'P1 Jab Punch'}, {'port': ':INPUTS', 'field': 'P2 Up'}, {'port': ':INPUTS', 'field': 'P1 Up'}, {'port': ':INPUTS', 'field': 'P1 Right'}, {'port': ':INPUTS', 'field': 'Service Mode'}, {'port': ':INPUTS', 'field': 'P1 Fierce Punch'}, {'port': ':INPUTS', 'field': 'P2 Left'}, {'port': ':EXTRA', 'field': 'P2 Short Kick'}, {'port': ':EXTRA', 'field': 'P2 Forward Kick'}, {'port': ':EXTRA', 'field': 'P1 Forward Kick'}, {'port': ':EXTRA', 'field': 'P1 Roundhouse Kick'}, {'port': ':EXTRA', 'field': 'P1 Short Kick'}
]

仿真器类还有一个frame_ratio参数,可用于调整算法所见的帧速率。默认情况下,MAME以每秒60帧的速度生成帧,如果你觉得这太多了,想把它改成每秒20帧,可以输入以下代码:

from MAMEToolkit.emulator import Emulator
emulator = Emulator(roms_path, game_id, memory_addresses, frame_ratio=3)

MAME性能基准测试

目前这个工具包的开发和测试已在8核AMD FX-8300 3.3GHz CPU以及3GB GeForce GTX 1060 GPU上完成。在使用单个随机智能体的情况下,街头霸王环境可以以正常游戏速度的600%+运行。而如果是用8个随机智能体进行hogwild!训练,环境可以以正常游戏速度的300%+运行。

ConvNet智能体

为了确保工具包能够训练算法,作者还设置了一个简单的5层ConvNet,只需少量调整,你就可以用它进行测试。在街霸实验中,这个算法能够成功学习到游戏的一些简单技巧,比如连击(combo)和格挡(blocking)。街霸本身的游戏机制是分成10个关卡(难度递增),玩家在每个关卡都要迎战不同的对手。刚开始的时候,这个智能体平均只能打到第2关。但在经过2200次训练后,它平均能打到第5关。

至于智能体的学习率,它是用每一局智能体所造成的净伤害和所承受的伤害来计算的。

python打造拳皇97电玩游戏,不信有开源API?先看我玩把八神庵相关推荐

  1. 学生专用计算机玩游戏教学,浅谈信息技术课上学生玩游戏的现象

    浅谈信息技术课上学生玩游戏的现象 单位:南昌十七中  姓名:罗奎   邮编330029 内容摘要:在信息技术教学中,学生玩游戏是一个较为普遍现象.学生专注的玩游戏,影响了教师的教学效果,产生了不良影响 ...

  2. 玩游戏用什么蓝牙耳机比较好?适合玩游戏的无线蓝牙耳机推荐

    随着蓝牙技术的不断进步,越来越多的人喜欢戴蓝牙耳机玩游戏.那么,在品类复杂且多元的蓝牙耳机市场中,玩游戏用什么比较好?下面,我来给大家推荐几款适合玩游戏的无线蓝牙耳机,一起来看看吧. 一.南卡小音舱蓝 ...

  3. 计算机玩游戏用什么系统好,大神处置玩游戏装win7系统好还是win10的使用评价

    大家在操作电脑时一定会遇到很多问题,比如说玩游戏装win7系统好还是win10的使用评价就是我们经常会遇到的,小编及身边的朋友也遇到过玩游戏装win7系统好还是win10的使用评价很多次,针对玩游戏装 ...

  4. 上计算机课学生玩游戏该怎么处理,初中信息技术课学生玩游戏的原因与解决对策...

    莫章 摘 要:我国社会信息科技的飞速发展带动了信息技术教育的改革,社会对于信息技术人才的需求越来越旺盛,初中教育学科中对信息技术的教学质量也加大了重视力度.初中生处于青春期阶段,很容易被电子产品所吸引 ...

  5. 华为云计算机玩游戏,华为云电脑能不能玩游戏?实测告诉你:不仅能玩,还很流畅...

    2018 CES ASIA上海展已经进入了尾声,在此次展会上,华为重磅发布的华为云电脑黑科技让人记忆深刻.它能让手机秒变电脑,能实现随时随地移动办公,能让我们手机连接大屏玩各种吃鸡游戏时操作更精准.更 ...

  6. 云计算机上能联机玩游戏不,华为云电脑到底能不能玩游戏?实践后告诉你:不仅能玩,还很流畅...

    2018 CES ASIA上海展已经进入了尾声,在此次展会上,华为重磅发布的华为云电脑黑科技让人记忆深刻.它能让手机秒变电脑,能实现随时随地移动办公,能让我们手机连接大屏玩各种吃鸡游戏时操作更精准.更 ...

  7. python+java+vue的电竞游戏赛事管理系统

    springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程.在以往我们通过SpringMVC+Spring+Mybatis框架进行开发的时候,我们需要配置web. ...

  8. 玩游戏4g计算机的内存不足,windows8.1玩游戏经常提示内存不足

    您好, 造成这一现象可能是是系统正在运行占用内存多的程序.建议按照以下方法尝试能否解决问题: 一.如果您使用复制.粘贴功能过多的话,尤其是图片,存在剪贴板中,占用很大一部分内存,这种情况您可以重新启动 ...

  9. 玩游戏老显示计算机内存不足,windows8.1玩游戏经常提示内存不足

    您好, 造成这一现象可能是是系统正在运行占用内存多的程序.建议按照以下方法尝试能否解决问题: 一.如果您使用复制.粘贴功能过多的话,尤其是图片,存在剪贴板中,占用很大一部分内存,这种情况您可以重新启动 ...

最新文章

  1. Python3--有道音频下载
  2. Nginx的server_name匹配执行顺序
  3. java数组交集_java数组的交集和并集
  4. ImageView缩放选项
  5. 初步使用计算机说课,初步认识计算机说课稿
  6. CentOS7显卡驱动问题
  7. Java学习笔记2.2.1 常量与变量 - 变量
  8. ECharts插件的使用
  9. kotlin项目开发基础之gradle初识
  10. 进入android数据可视化,Android中的实时数据可视化
  11. 洛谷——P4053 [JSOI2007]建筑抢修
  12. 代码也浪漫——Python烟花秀
  13. VMware15.5.2安装unlocker时下载工具一直失败
  14. 别觉得自己PS很牛,看完这位俄罗斯大神作品后,会觉得只是小牛牛
  15. 远程服务器窗口调大,远程桌面缩放
  16. Tracking相关的文章
  17. 邮电通信业宣传片制作技巧
  18. 陈大年:免费很贵创新很累 我如何做WiFi万能钥匙
  19. SAS学习之基本统计过程
  20. Java导出Excel表格出现文件损坏异常解决方案

热门文章

  1. PostGis 多栅格数据求和函数实现
  2. 简易android手电筒app
  3. 深入Python3阅读day01——从一个Python程序开始
  4. python语法简洁清晰、特色之一是强制用作为语句缩进_Python--day01
  5. 2022年二手车市场分析
  6. 新鲜!宁盾dKey手机动态口令牌简介
  7. 亚商投资顾问 早餐FM/1125氢燃料电池汽车发展驶入快车道
  8. Oracle修改序列(sequence)当前值的两种方法
  9. ❀论文篇❀Context Based Emotion Recognition Using EMOTIC Dataset论文翻译
  10. joda-time常用api实例