Pregunta

Tengo un agente que toma estados y devuelve acciones, mientras mantiene una representación interna de la utilidad de los pares de estado / acción. También tengo un entorno que toma acciones y devuelve pares de estado / recompensa.

Necesito poder configurar el agente con un estado de inicio y luego ir continuamente del agente - (acción) - > entorno - (estado, recompensa) - > agente - (acción) - > ... Sin embargo, los estados internos (que deben actualizarse cada iteración) deben permanecer privados (es decir, dentro del agente o del entorno). Esto significa que no puedo simplemente llamar al entorno como una función dentro del agente usando el estado y la acción como argumentos.

Soy un novato de Haskell, así que ni siquiera estoy seguro de si esto es posible.

¿Fue útil?

Solución

Dos preguntas:

  • Si el agente debe usar un estado para calcular una acción, ¿cómo espera mantener en secreto la representación de estados del agente?

  • Si el entorno espera producir un estado (y una recompensa) dada una acción, ¿cómo espera mantener en secreto la representación de los estados del entorno?

Ambos son posibles, pero cada uno debe involucrar algún tipo de abstracción para consultar estados o crear estados. No tengo un buen presentimiento sobre este diseño.

Sería útil aclarar la pregunta

  • Proporcionar firmas de tipo para las funciones de interés

  • Identificar a qué funciones desea que se exponga la representación de estados no .

P.S. Estas dificultades son bastante separables de Haskell y estarían en discusión independientemente de la elección del lenguaje de implementación (siempre que el lenguaje de implementación admita alguna forma de privacidad).

Otros consejos

Tendrá que decidir cuál de los agentes y el entorno se encuentra " en la parte superior " - supongamos para el resto de esta respuesta que es el entorno el que llama al agente, ya que generalmente tiene más sentido.

Puede mantener privadas las representaciones de datos del Agente utilizando el sistema de módulos; simplemente exporte el nombre del tipo de datos sin ninguno de sus componentes internos.

module Agent (AgentState, other_stuff) where

en oposición a

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

Si el agente también necesita pasar el estado del entorno (aunque no veo ninguna razón, esto sería necesario ya que el entorno puede seguirlo por sí mismo), entonces haga que el agente funcione polimórfico para que pueda ser pasó cualquier tipo de estado, entonces el entorno puede pasar lo que quiera sin que su representación esté expuesta.

También debería ser posible usar mónadas de estado para lograr un mayor control sobre lo que le sucede al estado, por ejemplo, evitar que el entorno duplique un estado que el agente le da y llamar al agente repetidamente con ese mismo estado, pero si usted ' Si eres nuevo en Haskell, probablemente sea mejor obtener un poco de experiencia sin mónadas primero. (No es que las mónadas sean particularmente aterradoras ni nada, pero te ocultan detalles, por lo que es más difícil ver lo que está sucediendo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top