该答案假定您的“专有软件”是真实环境的模拟或控制器。
是的,您很可能需要编写软件以某种标准方式将您的环境表示为强化学习 (RL) 环境。根据细节,这可能很简单,也可能非常复杂。
RL 中的环境通常必须具有以下特征,才能与 RL 代理软件交互:
状态表示。这通常是与真实环境中的传感器读数相匹配的对象或数据数组。状态具有马尔可夫属性对 RL 很重要,这样价值预测才能准确。对于某些环境,这意味着从观察中计算派生值,或者将来自传感器的最后几次观察的组合历史表示为状态。
动作表示。
- 一个简单的动作表示可以只是一个整数,它标识从 0 开始选择了 N 个动作中的哪一个。这允许在检查值函数估计时进行基本的索引查找。
奖励功能。这是问题定义的一部分,您可能希望将该代码作为环境的一部分或代理的一部分或介于两者之间的某个位置,具体取决于它改变的可能性 - 例如,如果您想运行多个优化的实验控制的不同方面但在相同的环境中,您可以制作一个完全独立的奖励计算模块,您可以将其与代理和环境代码在较高级别结合起来。
时间步长函数。这应该采取行动选择,并且应该更新一个时间步的状态 - 返回下一个状态和立即奖励。如果环境是真实的,那么代码将进行实际更改(例如移动机械臂),可能等待时间步过去,然后读取传感器以获取下一个状态并计算奖励。如果环境是模拟的,那么代码应该调用一些内部模型来计算下一个状态。这个函数应该调用你为你的任务提供的专有软件。
如果可用的操作取决于当前状态,那么其代码可以存在于环境模拟或代理中,或者是代理可以调用的一些辅助函数,因此它可以在选择之前过滤操作。
如果您使用 Python,为了帮助使其更具体,并遵循现有设计,请参阅“如何在 OpenAI 中创建新的健身房环境?” 关于堆栈溢出。Open AI 环境都遵循相同的环境定义约定,这有助于编写代理来解决它们。我还建议找到一个与您的问题相似的 Open AI Gym 环境,看看它是如何工作的,并尝试训练一个代理来解决它。
可能仍有工作将您的环境与可以解决它的代理相匹配。这取决于您使用的代理软件。
即使您编写自己的代理软件,也有助于像这样分离环境代码。环境是要解决的问题,RL 代理是寻找解决方案的一种方式。将这些部分分开是一种有用的设计,可以让您尝试不同类型的代理并比较它们的性能。