La evaluación del agente tiene como propósito estimar el correcto comportamiento de la inteligencia artificial dentro del videojuego, como por ejemplo la cantidad de monedas recolectadas, veces que murió, etc.
\subsection{Sistema}
\subsubsection{Monitor}
Desarrollamos un monitor hecho en el lenguaje GDScript, que es parte del motor de videojuegos Godot y que graba todo la sesión del agente y/o jugadores. La grabación del partido es basado en el ciclo de update del motor Godot, es decir que si la pantalla del jugador tiene 60Hz como su taza de refresco, se grabará 60 cuadros de información cada segundo. Al terminar un partido toda esta información se envía a un servidor donde se procesa y guarda para futuro análisis. Cabe mencionar que se envía todo los datos en formato JSON a un servidor de REST.
\subsubsection{Servidor}
El servidor fue programado en el lenguaje Go. La razón es por su alto nivel de rendimiento y bajo nivel de uso de recursos, tales como CPU y RAM. Esto nos permite recibir muchos más datos simultáneamente de varios partidos al mismo tiempo sin complicaciones. También el servidor provee una API de tipo REST con varios endpoints que permiten almacenar las partidas del juego y consultar la información guardada en ello para futuro estudio.
\subsubsubsection{Estructura de Base de Datos}
Todo la información de las partidas jugadas se almacenan en un base de datos MySQL.
\caption{Estructura del Base de Datos del Backend}
\label{fig:dbstructure-backend}
\end{figure}
\begin{table}[H]
\centering
\begin{tabular}{|l|p{0.66\linewidth}|}
\hline
\multicolumn{1}{|c|}{\textbf{Nombre de Tabla}}&\multicolumn{1}{c|}{\textbf{Propósito}}\\\hline
frame & La tabla frame se utiliza para almacenar la cantidad de puntos, monedas, tiempo que pasó y posiciones de los objetos en el mundo cada cuadro que dibuja el juego. \\\hline
game & La tabla game contiene información sobre el partido y el equipo que corre tal partido, incluyendo sistema operativo dimensiones de la pantalla y datos similares. \\\hline
godot\_version & La tabla godot\_version se usa para almacenar las versiones de Godot que han corrido un partido del juego. \\\hline
level & La tabla level es una tabla de parametros que contiene los nombres de los niveles que se puede jugar. \\\hline
object & La tabla object se utiliza para almacenar el estado, posición y velocidad de un objeto en un cuadro especifico del partido. \\\hline
object\_name & La tabla object\_name es una tabla de parámetros que contiene los nombres de todos los objetos que existen en un partido del juego. \\\hline
object\_state & La tabla object\_state tiene todos los nombres de los estados de un objeto. \\\hline
os & La tabla os es una tabla de parámetros que contiene los posibles sistemas operativos que pueden jugar el juego. \\\hline
player & La tabla player es una tabla opcional donde se puede almacenar los datos de la persona que está jugando un partido para poder hacer un análisis sin ser anónima. \\\hline
user & La tabla user contiene los usuarios y contraseñas de los personas que tienen permiso hacer consultas al API para obtener los datos y usarlos. \\\hline
\end{tabular}
\caption{Estructura del Base de Datos del Backend}
Muchos tipos de análisis son posibles con los datos que recolectamos. Para facilitar el análisis utilizamos el lenguaje de programación R para calcular todas las estadísticas de los partidos. El lenguaje R se genera gráficos basados en los datos y formulas que utilizamos para ayudar entender el comportamiento del agente/jugador.
\subsubsection{Distribución Normal}
La distribución normal nos permite analizar el comportamiento de varios partidos del juego y ver la probabilidades que un evento ocurriría.
\caption{Distribución Normal de Densidad de Probabilidad vs. Moneda}
\label{fig:normal-coin}
\end{figure}
En la figura anterior podemos ver en el eje X la cantidad de monedas obtenidos por el agente y/o jugador. En el eje Y tenemos la densidad de probabilidad. La densidad de probabilidad se puede interpretar como la probabilidad relativa en que un valor de un variable al azar seria igual a la muestra correspondiente.
La linea verde es el valor medio representado por la formula $\bar{X}=\frac{\Sigma_{i=1}^{n} X_{i}}{n}$ donde $\bar{X}$ es el valor medio, $ n $ es la cantidad de partidos y $\Sigma_{i=1}^{n} X_{i}$ es la sumatorio de los monedas en cada partido. Las lineas rojas se llaman la desviación estándar. Para obtener la desviación estándar el primer paso es obtener la varianza que es representado por la formula $\sigma^2=\frac{\Sigma_{i=1}^{n}(X_{i})^2}{n}$ donde $\sigma^2$ es la varianza. Finalmente obtenemos la desviación estándar con la formula $\sigma=\sqrt{\sigma^2}$ donde $\sigma$ es la desviación estándar.
De 9 partidos del juego, tuvimos un valor medio de 4 monedas representado en la linea verde. Al calcular la desviación estándar obtuvimos el valor 3, por lo tanto la primera linea roja se coloca en 1 moneda porque 4 menos 3 es 1. Y en el caso de la segunda linea roja 4 mas 3 es 7.
Si la densidad de probabilidad en un punto X es muy grande, eso significa que un valor de un variable es probablemente cerca el punto X. En el caso de la figura \ref{fig:normal-coin}, se puede interpretar eso en que es muy probable que el valor de un variable sería entre 1 a 7 acercando a 4.
\caption{Distribución Normal de Densidad de Probabilidad vs. Tiempo}
\label{fig:normal-time}
\end{figure}
En la figura anterior analizamos 28 partidos con un valor medio de 22 segundos y un desviación estándar de 14 segundos. Podemos concluir que en un valor de un variable es muy probable ser entre 8 segundos y 36 segundos un partido, acercando a 22 segundos.
\subsubsection{Serie de Tiempo}
Utilizamos el serie de tiempo para analizar el comportamiento del agente durante un partido. Eso nos permite entender mejor sus decisiones y cuanto demoró en lograr los objetivos.
\caption{Serie de Tiempo de Monedas en un Partido}
\label{fig:serie-tiempo}
\end{figure}
En la figura \ref{fig:serie-tiempo} analizamos un partido de un jugador humano que demoró 58 segundos y recolectó 7 monedas. En el eje X tenemos el tiempo medido en segundos, y en el eje Y tenemos la cantidad de monedas que tiene el agente y/o jugador en cualquier momento.
La mejor forma de utilizar un gráfico de serie tiempo en el análisis del agente y/o jugador es compararlo con otros partidos para ver que tan cerca el gráfico es con los demás. Idealmente el agente bien desarrollado debe demorar menos tiempo en completar sus objetivos y estar similar a un partido de jugador humano por cantidad de monedas obtenidas y en el tiempo que demoró en llegar a la meta final.