内容简介:编者按:近年来,虽然关于强化学习进展的新闻屡见报端,对强化学习感兴趣的人也很多,但对普通学习者来说,真正做一个自己感兴趣的强化学习项目还是太麻烦了。今天论智给大家推荐的是一名网友开源的Python库,它提供了一个可以玩任何旧版街机游戏的API,操作方式非常亲民。这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用。通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状态,以及发送与游戏交互的动作。
编译 Bot 来源 GitHub
编者按:近年来,虽然关于强化学习进展的新闻屡见报端,对强化学习感兴趣的人也很多,但对普通学习者来说,真正做一个自己感兴趣的强化学习项目还是太麻烦了。今天论智给大家推荐的是一名网友开源的 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 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:
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关。
至于智能体的学习率,它是用每一局智能体所造成的净伤害和所承受的伤害来计算的。
- The End -
「若你有原创文章想与大家分享,欢迎投稿。」
加编辑微信ID,备注#投稿#:
程序 丨 druidlost
2018 中国大数据技术大会
◆
BDTC 2018
◆
BDTC 2018中国大数据技术大会携主题“大数据新应用”再度强势来袭。本次大会由 华东师范大学副校长、教授周傲英,百度商业智能实验室主任熊辉,阿里巴巴副总裁李飞飞 三位会议主席对大会内容把关,多位两院院士参与指导,由最了解行业痛点的一线从业者为同行打造。
扫描下方二维码或点击【阅读原文】快速购票 。现在购票还有机会获得大数据图书一本(中国科学院院士梅宏主编的《大数据导论》或华中科技大学教授金海主编的《大数据处理》),数量有限!
推荐阅读:
print_r('点个赞吧'); var_dump('点个赞吧'); NSLog(@"点个赞吧!"); System.out.println("点个赞吧!"); console.log("点个赞吧!"); print("点个赞吧!"); printf("点个赞吧!\n"); cout << "点个赞吧!" << endl; Console.WriteLine("点个赞吧!"); fmt.Println("点个赞吧!"); Response.Write("点个赞吧"); alert(’点个赞吧’)
以上所述就是小编给大家介绍的《用Python玩任一款街机游戏!》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- MAME 0.192 发布,开源街机模拟器
- 1:1 还原,自制树莓派复古街机:教程已开源
- MAME 0.198 发布,重温童年的街机模拟器
- MAME 0.201 发布,重温童年的街机模拟器
- MAME 0.203 发布,重温童年的街机模拟器
- MAME 0.204 发布,重温童年的街机模拟器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Windows内核原理与实现
潘爱民 / 电子工业出版社 / 2010年4月 / 99.00元
本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本书直接以Windows的源代码(WRK, Windows Research Kernel)为参照,因而读者可以了解像Windows这样的复杂操作系统是如何在x86处理器上运行的。 ......一起来看看 《Windows内核原理与实现》 这本书的介绍吧!
MD5 加密
MD5 加密工具
HSV CMYK 转换工具
HSV CMYK互换工具