0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

给大家推荐一名网友开源的Python库

zhKF_jqr_AI 来源:未知 作者:李倩 2018-11-05 15:04 次阅读

编者按:近年来,虽然关于强化学习进展的新闻屡见报端,对强化学习感兴趣的人也很多,但对普通学习者来说,真正做一个自己感兴趣的强化学习项目还是太麻烦了。今天论智给大家推荐的是一名网友开源的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

fromMAMEToolkit.sf_environment importEnvironment

roms_path = "roms/"

env = Environment("env1", roms_path)

env.start()

whileTrue:

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 importThread

import random

fromMAMEToolkit.sf_environment importEnvironment

def run_env(env):

env.start()

whileTrue:

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 threads

roms_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:

fromMAMEToolkit.emulator importEmulator

emulator = Emulator("env1", "", "", memory_addresses)

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

内存地址

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

fromMAMEToolkit.emulator importEmulator

fromMAMEToolkit.emulator importAddress

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矩阵返回,同时,它也会返回该时间步长的所有内存地址整数值。

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

fromMAMEToolkit.emulator importAction

insert_coin = Action(':INPUTS', 'Coin 1')

data = emulator.step([insert_coin])

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

fromMAMEToolkit.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帧,可以输入以下代码:

fromMAMEToolkit.emulator importEmulator

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关。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7151

    浏览量

    162004
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
  • 强化学习
    +关注

    关注

    4

    文章

    259

    浏览量

    11114

原文标题:MAME:在这里,你可以用Python玩任何街机游戏

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何成为一名嵌入式C语言高手?

    如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心,而C语言则是嵌入式系统开发中最常用的编程语言之。成为一名嵌入式C语言高手需要长时间的学习和实践。下面将介绍些方法和
    发表于 03-25 14:12

    如何成为一名嵌入式C语言高手?

    如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心,而C语言则是嵌入式系统开发中最常用的编程语言之。成为一名嵌入式C语言高手需要长时间的学习和实践。下面将介绍些方法和
    发表于 04-07 16:03

    求协议栈开发工程师一名

    我司求一名协议栈开发工程师,需要DSP开发经验,工作经验3年以上。工作地点在深圳南山区科技园,公司规模1000多人,薪酬具体详谈。我的联系方式是13025445563,欢迎大家用于自荐或者推荐朋友,谢谢各位豪杰。
    发表于 08-05 10:06

    菜鸟一名,求教问题

    本帖最后由 gk320830 于 2015-3-9 00:26 编辑 我是一名大学新生,想学下电路设计,电路板的元件总是焊不好,用万用表测总是短路,求大神指教!!!!!!!!
    发表于 10-23 22:04

    大家好,我是一名大四学生,有些问题想咨询大家

    本帖最后由 eehome 于 2013-1-5 09:53 编辑 我是一名大四的学生,刚去海同笔试过,那边承诺的是很好啦,我也是对软件方面很感兴趣。想问下现在嵌入式这方面在国内人员的需求
    发表于 11-27 18:01

    我是一名小白

    各位友人大家好我是一名在职员工由于向提升自己想学习电气自动化相关的知识可是我不知道从哪学期本人零基础 希望有前辈能指导一二 十分感激
    发表于 09-22 14:43

    一名电子初学者

    大家好,本人是一名电子初学者,平时会根据些学习资料做个小电路,苦于身边没有良师益友,看着书上的原理也是半知半假迷迷糊糊,为了更好的学习于是加了几个电子讨论QQ群.....天呐,怎么
    发表于 12-02 17:15

    怎样做好一名大神

    没想到上班了还能跟总经理(大神)起回味大学上论坛的时光。我现在刚出来的只能看看别人发的求助信息,置顶信息,从别人获取些东西。。。而大神呢?他刚开始也是这样的。。。后面就是那种上论坛别人回答的,因为他解决不了的问题,论坛也解
    发表于 01-30 15:04

    一名大学生求教

    我是一名学应用电子技术大二学生,现在迷茫了。不知道要走那方面,求各位大神给点意见啊。
    发表于 08-30 20:56

    一名数据挖掘工程师新人整理的入门资料

    一名数据挖掘工程师新人整理的入门资料四年前我次听说数据挖掘这个词,三年前我学习了数据挖掘理论知识,两年前我做了几个与数据挖掘有关的项目,年前我成为
    发表于 09-01 11:05

    想要成为一名鸿蒙开源开发者,要如何做呢?

    展开正面竞争,当然这也仅仅只是理论上可能。随着鸿蒙系统的免费开源广大开发者带来了机会,那么要怎么才能成为一名鸿蒙开源开发者呢?大家可以提
    发表于 09-18 10:28

    如何成为一名电源设计师?

    成为一名电源设计师的7个迹象
    发表于 03-11 06:02

    自学python单片机编程-单片机可以使用Python语言来控制了! 精选资料分享

    George是一名计算机工程师,他每天都要使用Python语言工作,同时也在做些机器人项目。有天,他突然冒出了个想法:能否用
    发表于 07-14 06:08

    战“码”先锋直播预告丨如何成为一名优秀的OpenHamrony贡献者?

    ”先锋直播间】,在线讲解贡献指南,帮助热爱开源的你更好的参与开源共建。5月18日(周三)晚上19:00,第期战“码”先锋直播,我们邀请到了润和资深软件开发工程师赵海鹏老师,在直播间与大家
    发表于 05-17 10:52

    祝贺 | 鹏城实验室开源 EDA 团队勇夺 ICCAD 竞赛第一名

    一名的成绩。四、iEDA 课题组介绍 课题组主要围绕开源EDA工具、智能化的芯片设计方法、开源EDA系统平台、开源 EDA 基准测试集等内容开展研究,打造四维
    发表于 12-13 18:29