一个在Linux上针对Mame Arcade游戏训练RL算法的库

MAMEToolkit的Python项目详细描述


MAME RL算法训练工具包

关于

这个python库有潜力在几乎所有的街机游戏上训练你的强化学习算法。它目前在Linux系统上可用,并且可以作为mame的包装器。工具包允许您的算法逐步完成游戏,同时接收帧数据和用于跟踪游戏状态的内部内存地址值,以及发送与游戏交互的操作。

安装

您可以使用pip安装库,只需运行:

pip install MAMEToolkit

免责声明:我们无法为您提供任何游戏ROM。获取游戏rom进行仿真是用户的法律责任。此库只能用于非商业研究目的。

有一些免费的rom可在:[https://www.mamedev.org/roms/]

街头斗士随机代理演示

该工具包目前已应用于街头斗士iii第三次打击:为未来而战(日本990608,没有光盘),但可以修改为任何游戏可用的妈妈。下面演示如何为街头斗士环境编写随机代理。

importrandomfromMAMEToolkit.sf_environmentimportEnvironmentroms_path="roms/"# Replace this with the path to your ROMsenv=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)ifgame_done:env.new_game()elifstage_done:env.next_stage()elifround_done:env.next_round()

工具包还支持hogwild培训:

frommultiprocessingimportProcessimportrandomfromMAMEToolkit.sf_environmentimportEnvironmentdefrun_env(worker_id,roms_path):env=Environment(f"env{worker_id}",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)ifgame_done:env.new_game()elifstage_done:env.next_stage()elifround_done:env.next_round()workers=8# Environments must be created outside of the threadsroms_path="roms/"# Replace this with the path to your ROMsthreads=[Process(target=run_env,args=(i,roms_path))foriinrange(workers)][thread.start()forthreadinthreads]

 src=

设置自己的游戏环境

游戏ID
要创建游戏的模拟,您必须首先拥有正在模拟的游戏的rom,并知道mame使用的游戏id,例如,对于这个版本的街头斗士,它是"sfii3n"。 您的游戏ID可以通过运行:

fromMAMEToolkit.emulatorimportsee_gamessee_games()

这将打开mame模拟器。你可以搜索游戏列表来找到你想要的。游戏的ID始终位于游戏标题末尾的括号中。

内存地址
使用工具包与仿真器本身进行交互并不需要太多时间,但是挑战来自于找到与所关心的内部状态相关联的内存地址值,以及使用环境类跟踪所述状态。 可以使用mame作弊调试器跟踪游戏的内部内存状态,该调试器允许您跟踪游戏的内存地址值随时间的变化。

作弊调试器可以使用以下命令运行:

fromMAMEToolkit.emulatorimportrun_cheat_debuggerroms_path="roms/"# Replace this with the path to your ROMsgame_id="sfiii3n"run_cheat_debugger(roms_path,game_id)

有关使用调试器的信息,请参阅本教程的内存转储部分[https://www.dorkbotpdx.org/blog/skinny/use_mames_debugger_to_reverse_engineer_and_extend_old_games]

一旦确定了要跟踪的内存地址,就可以使用:

fromMAMEToolkit.emulatorimportEmulatorfromMAMEToolkit.emulatorimportAddressroms_path="roms/"# Replace this with the path to your ROMsgame_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)

这将立即启动仿真,并在工具包链接到仿真进程时停止仿真。

单步执行模拟器 链接工具包后,您可以使用step函数来单步执行仿真器:

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.emulatorimportActioninsert_coin=Action(':INPUTS','Coin 1')data=emulator.step([insert_coin])

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

fromMAMEToolkit.emulatorimportlist_actionsroms_path="roms/"# Replace this with the path to your ROMsgame_id="sfiii3n"print(list_actions(roms_path,game_id))

哪个for street fighter返回列表,其中包含可用于向step函数发送操作的所有端口和字段:

pip install MAMEToolkit
0

我们建议您创建所有可能操作的枚举,然后将它们的操作值发送到模拟器,请参见示例操作枚举

还有一个问题是在不可学习的游戏屏幕(如标题屏幕和字符选择)之间调整游戏。要了解如何实现这一点,请查看提供的步骤脚本和街头斗士III第三次打击:为未来环境而战实施

Emulator类还有一个frame_ratio参数,可用于调整算法看到的帧速率。默认情况下,mame以每秒60帧的速度生成帧,但是,对于您的算法来说,这可能是太多的帧。默认情况下,工具箱将使用3的帧速率,这意味着每3帧中就有1帧通过工具箱发送,这将帧速率转换为每秒20帧。使用更高的帧频也会提高工具包的性能。

pip install MAMEToolkit
1

带PC规格的库性能基准

该工具包的开发和测试已经在一个8核amd fx-8300 3.3ghz cpu和一个3gb的geforce gtx 1060 gpu上完成。 使用一个随机代理,街头斗士环境可以运行在600%以上的正常游戏速度。对于8个随机代理的hogwild训练,环境可以以300%以上的正常游戏速度运行。

简单的convnet代理

为了确保工具包能够训练算法,只需最少的调整就可以建立一个简单的5层convnet。该算法能够成功地学习一些简单的街头拳击技术,如组合拳和拦网。街头斗士游戏的工作原理是让玩家在10个增加难度的阶段与不同的对手战斗。最初,该算法平均可以达到第2阶段,但经过2200次训练后,最终平均可以达到第5阶段。使用每集的净伤害和单次播放的伤害来跟踪学习率。

 src=

主要变化

库的工作方式是充当修改后的mame实现的包装器。 进行了以下更改:

  • 更新了lua控制台以允许检索帧数据格式
  • 更新lua控制台以允许检索当前帧数据
  • 禁用的游戏开始警告

下列文件受到影响:

  • src/emu/machine.cpp
  • src/emu/video.cpp
  • src/emu/video.h
  • src/frontend/mame/luaengine.cpp
  • src/frontend/mame/ui/ui.cpp
  • src/osd/sdl/window.cpp

修改后的mame实现可以在[https://github.com/m-j-murray/mame]上找到

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在收到spring mqtt集成中停止重复订阅保留的消息   java改造安卓在textview中显示数据   读取CSV Java时获取While循环中的最后一行数据   将Java程序转换为小程序的部署   java如何在不向Src添加文件的情况下将文件放入GitLab测试   java包含字节数组列表的方法   java十进制转换错误   eclipse是由java引起的。lang.ClassNotFoundException:org。springframework。js。资源ResourceServlet   继承Java向上与向下   java自动调整标签内容的大小   java从Android中的AlertDialog返回信息   java在声明按钮时仿真程序中出现错误   java编写刷新线程的最佳方法   Java初学者错误   java需要帮助重置JComboBox   java如何用Spring/MultipartFile捕获中断流   java是否可以在JUnit中设置被测试类的方法的返回值?