OpenAI Retro 中的 2 人游戏

人工智能 机器学习 深度学习 强化学习 Python 开放式
2021-10-22 02:12:24

我使用OpenAI Retro已经有一段时间了,我想尝试两个玩家的游戏。我所说的两人游戏是指合作游戏,例如“Tennis-Atari2600”甚至是 Pong,其中 2 个代理存在于一个环境中。

players在 OpenAI 文档中有一个参数 for ,但是将这个变量设置2为对游戏没有任何作用。

您如何正确实施这一点?这甚至可以做到吗? 最终目标是每个环境有 2 个独立的网络。

1个回答

OpenAI RetroOpenAI Gym的扩展。

因此,它不支持多人环境中的多个代理。相反,环境总是从需要解决控制问题的单个代理的角度呈现。

当 Gym 问题中存在多个代理时,除第一个代理之外的所有内容都被视为环境的一部分。通常,2 人游戏中的 2 人游戏是由已经存在的任何游戏 AI 控制的。

您可以通过多种方式解决此问题,都涉及修改现有环境,需要对 Gym 中的集成和包装层有深入的了解,以便您可以进行正确的编辑。但是,您可能会发现其中任何一个都为您完成的环境。

事实上,在 Retro 环境中,使用下面的第二个选项支持某些多人游戏环境。

1. 提供额外的玩家作为环境的一部分

您可以修改环境代码,使其接受一个参数,该参数是用于控制其他玩家的代理。通常,这样的代理不会被设置为学习,它可能只是正在学习的代理的某个早期版本。您需要对提供的代理和游戏引擎之间的接口进行编码 - 注意允许其可能不同的成功观点。

如果已经为您(或任何人)设置了 Gym 环境以使用键盘与您自己的代理竞争,那么该解决方案已经完成了一半。您可以查看为此设置了 Gym 环境的位置,并修改代码以允许自动输入,而不是通过键盘选择动作。

这种方法可能最适合竞技游戏,您可以使用随机选择的先前插入环境的代理来训练下一代“一代”。

2. 为多个玩家呈现动作,就好像只有一个玩家一样

如果游戏模拟器允许您这样做,您可以编辑代码以便同时控制多个玩家。Gym 环境没有指定你如何构建你的动作选择,因此你可以自由地分割动作向量,以便它的一部分由一个训练有素的代理选择,一部分由另一个代理选择。

在这种情况下,您可能需要处理环境和/或奖励信号的不同视图。例如,在竞技游戏(或具有诸如个人分数等竞技元素的合作游戏)中,您将需要添加自定义代码来重新解释与单人游戏相比的奖励值。对于像 Pong 这样简单的事情,可能只是玩家 2 收到了玩家 1 奖励信号的负数。

这种方法可能最适用于成功结合的合作游戏。在这种情况下,您可以选择编写任意数量的独立代理来控制动作空间的不同方面——这包括让代理分别控制 P1 和 P2 游戏控制器输入。

每个代理仍将有效地将其伙伴视为环境的一部分,因此您可能希望混合训练场景,以便每个控制器的代理不会过于依赖。例如,如果您希望介入控制 P1,您可能不希望运行 P2 的 AI 对 P1 在游戏中的角色和行为有太具体的期望。

这第二个选项就是OpenAI Retro 界面所做的。例如 Pong 支持这个:

env = retro.make(game='Pong-Atari2600', players=2)

我使用文档中的示例代码验证了这一点,该代码控制两个桨,并以 Python 的形式接收奖励信号,list[0.0, 0.0]每当玩家得分时,它就会变成[-1.0, 1.0][1.0, -1.0]取决于哪个玩家获得积分。

这只会在有人努力使其如上工作的复古游戏中得到支持。如果您的游戏不这样做,但理论上支持 ROM 上的多人游戏,您将需要查看并更改 AI 复古包装器或模拟器或两者兼而有之。