3

我有一个代理,它接受状态并返回动作,同时保持状态/动作对的效用的内部表示。我还有一个环境,可以采取行动并返回状态/奖励对。

我需要能够将代理设置为开始状态,然后不断地从代理 -(action)-> environment -(state, reward)-> agent -(action)->... 但是,内部状态(每次迭代都需要更新)需要保持私有(即在代理或环境中)。这意味着我不能简单地将环境调用为代理中的一个函数,使用状态和动作作为参数。

我有点像 Haskell noobie,所以我什至不确定这是否可能。

4

2 回答 2

2

您需要决定哪个代理和环境位于“顶部” - 让我们假设对于这个答案的其余部分,它是顶部的环境调用代理,因为这通常最有意义。

您可以使用模块系统将代理的数据表示保持为私有 - 只需导出数据类型名称而无需任何内部结构。

module Agent (AgentState, other_stuff) where

module Agent (AgentState(..), other_stuff) where

如果代理还需要传递环境的状态(尽管我看不出有任何理由这样做是必要的,因为环境可以自己跟踪它),然后使代理函数具有多态性,以便它们可以传递任何状态type - 然后环境可以在不暴露其表示的情况下传递它喜欢的任何内容。

也应该可以使用状态单子来更好地控制状态发生的事情,例如防止环境复制代理给它的状态并以相同的状态重复调用代理,但如果你是新手Haskell 最好先在没有单子的情况下获得一些经验。(并不是说单子特别可怕或任何东西,但它们确实对你隐藏了细节,所以更难看到发生了什么。)

于 2009-05-10T08:22:56.243 回答
2

两个问题:

  • 如果代理必须使用状态来计算动作,那么您如何期望对代理保密的状态表示?

  • 如果环境期望在给定动作的情况下产生状态(和奖励),那么您如何期望对环境的状态表示保密?

这两种方法都是可能的,但每种方法都必须涉及某种抽象,用于查询状态或创建状态。我对这个设计没有好感。

这将有助于通过以下方式澄清问题

  • 为感兴趣的函数提供类型签名

  • 确定您不希望将状态表示暴露给哪些函数。

PS 这些困难与 Haskell 是完全不同的,并且无论选择哪种实现语言都存在问题(前提是实现语言支持某种形式的隐私)。

于 2009-05-10T20:16:32.700 回答