ready for final revision

This commit is contained in:
Chris Cromer 2023-01-08 22:19:33 -03:00
parent 0b80652689
commit 8a4a399710
Signed by: cromer
GPG Key ID: FA91071797BEEEC2
24 changed files with 285 additions and 39 deletions

BIN
Informe.pdf (Stored with Git LFS)

Binary file not shown.

View File

@ -120,6 +120,8 @@
\pagenumbering{arabic}
\hypersetup{pageanchor=true}
\include{sections/agradecimientos.tex}
\include{sections/composicion}
\include{sections/introduccion}
@ -128,7 +130,17 @@
\include{sections/estado_del_arte}
\include{sections/ambiente_software}
\include{sections/diseño_lenguaje.tex}
\include{sections/implementacion_lenguaje.tex}
\include{sections/incorporacion_lenguaje_motor.tex}
\include{sections/evaluacion_desempeño.tex}
\include{sections/trabajo_futuro.tex}
\include{sections/conclusion.tex}
\include{sections/referencias}

BIN
figures/backend_db_structure.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
figures/diagramacompi.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
figures/ejemploaccion1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
figures/ejemplofunc1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
figures/ejemplohecho1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
figures/ejemploregla1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
figures/kb_diagram.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,15 @@
\section*{Agradecimientos}
\addcontentsline{toc}{section}{\protect{}Agradecimientos}
\noindent\textit{From Chris,}
\textit{I would like to thank my wife Alejandra. Her constant help and support is what has allowed me to go back to college and to achieve my goals and become the professional I am today. I owe her everything and am very lucky to have had someone on my side through this whole process during all these years of working, studying, and investigating.}
\textit{I would also like to thank our thesis supervisor, Clemente Rubio-Manzano who inspired me to dig deeper into video game design and artificial intelligence. His support during this thesis was indispensable and helped us to bring this project to life.}
\\[24pt]
\noindent\textit{De Martin,}
\textit{Agradezco a mi Padre, por su constante apoyo, esfuerzo y sabiduría. A mi madre, por su cariño, paciencia y siempre la disposición a escucharme.}
\textit{Por otro lado, quiero agradecer a nuestro profesor guía Clemente Rubio-Manzano, por darnos todo el apoyo necesario y tener siempre la disposición de ayudarnos para poder hacer de esta idea realidad.}

View File

@ -1,8 +0,0 @@
\section{Descripción del Ambiente del Software}
Para la realización del proyecto se necesita los software siguientes.
\input{sections/ambiente_software/lenguaje}
\input{sections/ambiente_software/videojuego}
\input{sections/ambiente_software/entorno}

View File

@ -1,6 +1,2 @@
\subsection{Entorno}
El entorno usado para el desarrollo es:
\begin{itemize}
\item Linux Mint 21
\item Visual Studio Code 1.69
\end{itemize}
\subsection{Seccion 3}
bla bla

View File

@ -1,6 +1,2 @@
\subsection{Lenguaje de Programación}
Para compilar el lenguaje de programación se necesita:
\begin{itemize}
\item GCC 5 o clang 5
\item LLVM 14
\end{itemize}
\subsection{Seccion 1}
bla bla

View File

@ -1,7 +1,2 @@
\subsection{Videojuego}
Para compilar el videojuego se necesita:
\begin{itemize}
\item GCC 5 o clang 5
\item Godot 3.5
\item Tiled 1.8.6
\end{itemize}
\subsection{Seccion 2}
bla bla

4
sections/conclusion.tex Normal file
View File

@ -0,0 +1,4 @@
\section{Conclusión}
El trabajo realizado y la experiencia que tuvimos con nuestra tesis nos ha enriquecido como futuros profesionales en más de un modo, especialmente en el desarrollo de inteligencia artificial, el cual es una subrama de la programación que ha estado en constante evolución desde ya mas de 50 años.
Cabe destacar de igual forma el arduo camino de aprendizaje que recorrimos para desarrollar este proyecto, conociendo y experimentando con herramientas nuevas, desarrollo de soluciones ante problemas que no conocíamos, entre otros. Todo esto nos dejo valores y maestría necesaria para en un futuro, continuar con esta idea.

View File

@ -0,0 +1,108 @@
\section{Diseño del Lenguaje}
Nuestro lenguaje de programación, de nombre \textit{''Obelisk''}, tiene como pilar fundamental en su diseño el paradigma declarativo, es decir, posee un fuerte enfoque en definir el resultado al que se desea llegar, en contraste a describir el flujo de control para obtener la solución.
En consecuencia, el idioma posee por naturaleza un nivel de abstracción alto.
Por otro lado, las palabras claves utilizadas están inspiradas en el lenguaje Prolog, el cual posee hechos y reglas. Esto es para luego agregar una palabra propia de las acciones a tomar, dependiendo de los hechos y las reglas.
Debido a esto, se abren posibilidades para ser perfeccionado con facilidad ya que al escribir código no es necesario determinar el procedimiento al cual se desea llegar, dándole la poderosa cualidad de ser bastante flexible.
\textit{''Obelisk''} contiene palabras claves que cuando sean utilizadas permitan que ciertas operaciones lógicas sean declaradas y ejecutadas, y por lo tanto reconocidas para su posterior uso, las cuales serán descritas a continuación.
\subsection{Sintaxis}
La sintaxis del lenguaje fue diseñado teniendo en mente el asemejarse al lenguaje humano, específicamente el idioma inglés. La razón es debido a que el inglés es utilizado en todas partes del mundo y es muy fácil de aprender y usar.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth, height=0.8\textheight, keepaspectratio]{figures/ejemplofunc1.png}
\caption{Estructura Básica de una Palabra Clave Lógica}
\label{fig:ejemplofunc1}
\end{figure}
La estructura de la sintaxis del lenguaje de programación \textit{''Obelisk''} se desglosa en tres partes. El nombre, los elementos y el punto y coma (;) componen en su totalidad lo que nuestro idioma comprende como una palabra clave del lenguaje. Cabe señalar que las palabras claves del lenguaje están restringidas solo en el idioma inglés.
En este caso, el idioma posee tres palabras claves implementadas, las cuales son las acciones, los hechos y las reglas. Cada una de ellas tiene un orden ligeramente similar y difieren sólo en el contenido de los elementos, el cual se describirá a continuación.
\subsubsection{Hechos}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth, height=0.8\textheight, keepaspectratio]{figures/ejemplohecho1.png}
\caption{Estructura Básica de un Hecho}
\label{fig:ejemplohecho1}
\end{figure}
Los hechos tienen su contenido dividido en dos porciones. Sin embargo, la separación semántica es hecha por un verbo.
Por lo tanto, tenemos:
\begin{itemize}
\item 1°ra Entidad(es) (primera porción): Deben estar en comillas dobles, pueden ser más de uno y deben estar separados por la conjunción \textit{and}. Ej. \textit{''chris and martin...etc''}.
\item Verbo: Representa la división semántica y la relación entre las dos porciones. Ej. \textit{''can''}
\item 2°da Entidad(es) (segunda porción): Deben estar en comillas dobles, pueden ser más de uno y deben estar separados por la conjunción \textit{and}. Ej. \textit{''program and speak english...etc''}
\end{itemize}
\subsubsection{Acciones}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth, height=0.8\textheight, keepaspectratio]{figures/ejemploaccion1.png}
\caption{Estructura Básica de una Acción}
\label{fig:ejemploaccion1}
\end{figure}
La sintaxis de las acciones destaca principalmente, como las demás palabras clave, en los parámetros.
El contenido esta compuesto por dos porciones, divididos por el adverbio.
Usando como referencia el ejemplo anterior, la estructura es:
\begin{itemize}
\item 1°ra Entidad (primera porción): Debe estar en comillas dobles. Ej. \textit{''martin''}.
\item Verbo: Representa la relación entre las dos entidades de la primera porción. Ej. \textit{''is''}.
\item 2°da Entidad (primera porción): Debe estar en comillas dobles. Ej. \textit{''dangerous''}.
\item Separación semántica: El adverbio describe la implicación que tiene la primera porción sobre la segunda.
. Ej. \textit{''then''}.
\item Sugerencia verdadera(segunda porción): Presenta la opción a sugerir en caso en que el hecho sea verdad. Ej. \textit{''avoid''}.
\item Sugerencia falsa (segunda porción): Manifiesta la elección a suscitar si es que el hecho sea falso. Ej. \textit{''ignore''}.
\end{itemize}
\subsubsection{Reglas}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth, height=0.8\textheight, keepaspectratio]{figures/ejemploregla1.png}
\caption{Estructura Básica de una Regla}
\label{fig:ejemploregla1}
\end{figure}
La sintaxis de las reglas, como en el resto de las palabras claves, posee una división semántica que divide el contenido de los elementos en dos fragmentos. Cabe mencionar que las reglas deben contener si o si dos entidades por cada porción, separados por un verbo
Por tanto, su estructura es:
\begin{itemize}
\item 1°era Entidad (primera porción): Debe estar entre comillas dobles. Ej. \textit{''player''}.
\item Verbo (primera porción): Es la relación entre ambas entidades de la primera porción.
\item 2°da Entidad (primera porción): Debe estar entre comillas dobles. Ej. \textit{''die''}.
\item Conjunción condicional: Indica la división semántica entre las dos porciones. En español expresa ''cuando, a ser, etc.''. Ej. \textit{''if''}.
\item 1°ra Entidad (segunda porción): Debe estar entre comillas dobles. Ej. \textit{''enemy1''}.
\item Verbo (primera porción): Es la relación entre ambas entidades de la segunda porción.
\item 2°da Entidad (segunda porción): Debe estar entre comillas dobles. Ej. \textit{''dangerous''}.
\end{itemize}
\subsection{Semántica}
La semasiología de \textit{Obelisk} es en base a las palabras claves contenidas en el lenguaje y en consecuencia, describen la lógica y funcionamiento que tendrán.
Cabe mencionar que cada vez que se agreguen nuevas palabras claves, quedará un registro de estos en la base de conocimientos, el cual almacena toda la información contenida en el lenguaje. Este ultimo será explicado con detalle más adelante.
Finalmente, nuestro lenguaje posee tres palabras claves y su funcionamiento será descrito a continuación:
\subsubsection{Hechos}
Los hechos, como su nombre indica, describen una afirmación en referencia a la entidad declarada en los elementos de la palabra clave.
Es importante mencionar que si un hecho no esta presente en la base de conocimiento, se deja a entender que por defecto su valor booleano es \textit{false}.
\subsubsection{Reglas}
Las reglas se utilizan para crear condiciones y el resultado de estas dependen fundamentalmente de los hechos.
Esto quiere decir que una regla tendrá un valor booleano \textit{true} si existe el hecho que respalde tal regla. En caso contrario la regla quedará con valor \textit{false}.
\subsubsection{Acciones}
Finalmente, las acciones definen que acto(s) se realizará(n) dependiendo si el hecho al cual alude tenga valor booleano \textit{true}.

View File

@ -0,0 +1,42 @@
\section{Evaluación del Desempeño del Agente}
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.
\begin{figure}[H]
\centering
\includegraphics[width=1.4\textwidth, height=1.4\textheight, keepaspectratio, angle=270]{figures/backend_db_structure.png}
\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}
\label{tab:db-structure-backend}
\end{table}
\subsection{Análisis}
Muchos tipos de análisis son posibles con los datos que recolectamos. Por ejemplo en algunas partidas podemos calcular el promedio de veces que ganó el agente, cuantas monedas obtuvo, cuanto demoró realizar todas las acciones, o en tomar una decisión, etc.

View File

@ -0,0 +1,44 @@
\section{Implementación del Lenguaje}
\subsection{Arquitectura}
\subsubsection{Compilador}
El compilador de Obelisk tiene como propósito leer el código fuente usando un \textit{Lexer}. Luego se utiliza el \textit{Parser} para analizar y aplicar operaciones en base a los tokens que encontró el \textit{Lexer}.
Tras esto, se crea una Base de Conocimiento, el cual posee la característica de poder consultar su información utilizando un software externo. Finalmente, el código relevante se transforma en código intermedio(IR) que luego será transformado en binario.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth, height=0.6\textheight, keepaspectratio]{figures/diagramacompi.png}
\caption{Diagrama Estructural del Compilador}
\label{fig:diagramacompi}
\end{figure}
\subsubsection{Base de Conocimiento}
La Base de Conocimiento es donde se almacena toda la lógica proveniente de los hechos, reglas y acciones. Su implementación fue hecha utilizando SQLite, el cual permite hacer consultas a la base de conocimiento utilizando el lenguaje SQL.
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth, height=0.6\textheight, keepaspectratio]{figures/kb_diagram.png}
\caption{Estructura del Base de Conocimiento}
\label{fig:kbstructure}
\end{figure}
La estructura de la base de conocimientos consiste en seis tablas principales las cuales se describen en el siguiente cuadro:
\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
entity & La tabla entity es usada para almacenar los nombres de las entidades presentes en los hechos, reglas y acciones. \\ \hline
verb & Se utiliza la tabla verb para almacenar los nombres de los verbos usados en los hechos y reglas. \\ \hline
action & La tabla action almacena los nombres de las posibles acciones que se pueden tomar. \\ \hline
fact & La tabla fact tiene los hechos verdaderos. Si existe una fila en esta tabla, la relación entre las dos entidades es verdadera. \\ \hline
rule & La tabla rule contiene reglas. Si una regla resulta ser verdad, se inserta el hecho en la tabla fact. \\ \hline
suggest\_action & La tabla suggest\_action contiene las dos posibles acciones que se pueden tomar dependiendo si el hecho es verdadero o falso. \\ \hline
\end{tabular}
\caption{Estructura del Base de Conocimiento}
\label{tab:kb-structure}
\end{table}
\subsubsection{Librería}
La librería de Obelisk permite interactuar y consultar a la Base de Conocimiento de Obelisk, con el uso de un software externo. Hay dos tipos de datos que puede devolver la consulta. Un string que representa la acción a tomar o un numero entre 0 y 1 que representa su valor de verdad.

View File

@ -0,0 +1,10 @@
\section{Incorporación del Lenguaje en el Motor de Videojuegos}
Para incorporar el lenguaje en un software externo, como por ejemplo nuestro videojuego, se utiliza la librería de Obelisk, que permite hacer consultas a la base de conocimientos y tomar acciones basado en ello.
\subsection{Toma de decisiones}
En cualquier software que utilice Obelisk, al ser este utilizado, se hacen consultas a la base de conocimientos, siendo la ultima compilada con anterioridad.
Después de esto, son dos los posibles resultados que pueden tener las consultas, siendo estos la acción que debe tomar el agente o un valor numérico que representa su resultado y que se puede interpretarse en el software externo.
\subsection{Puesta en marcha}
Basado en las decisiones elegidas en relación a la consulta de la base de conocimiento, es la responsabilidad del software poner la acción en marcha. Esto se puede llevar a cabo utilizando varias técnicas de inteligencia artificial tales como A*, maquina de estado, planificación de acciones orientados a metas, etc.

View File

@ -6,7 +6,9 @@ Actualmente, la I.A puede considerarse también una tecnología moderna que ha i
En el campo del desarrollo de videojuegos, la I.A. ha tenido mucha presencia. Por ejemplo, se ha empleado con éxito para programar los personajes o las entidades de los mismos, haciéndolos más dinámicos y divertidos. Permitiendo que el juego aprenda del usuario y creando adversarios artificiales del nivel de un humano.
Dado lo anterior, tendrá un gran beneficio implementar una I.A. empleando un lenguaje declarativo ya que no indicamos el cómo se debe computar, solo indicamos el qué se quiere computar. Esto último es importante ya que conseguimos que la tarea de programación se aproxime a la lógica humana y el programador pueda implementar el comportamiento de los agentes de una forma más intuitiva y empleando reglas simples. En este sentido, uno de los lenguajes declarativos más importantes ha sido Prolog demostrando sus buenas propiedades en este ámbito. Por lo tanto, vamos a crear un lenguaje declarativo inspirado en Prolog que se pueda utilizar para programar el comportamiento de los personajes de un videojuego que tienen, al menos, que realizar las siguientes acciones: i) superar obstáculos, con la opción de saltar con velocidad; ii) recoger items que se agregan a la puntuación final; iii) evitar enemigos.
Dado lo anterior, tendrá un gran beneficio implementar una I.A. empleando un lenguaje declarativo ya que no indicamos el cómo se debe computar, solo indicamos el qué se quiere computar. Esto último es importante ya que conseguimos que la tarea de programación se aproxime a la lógica humana y el programador pueda implementar el comportamiento de los agentes de una forma más intuitiva y empleando reglas simples. En este sentido, uno de los lenguajes declarativos más importantes ha sido Prolog demostrando sus buenas propiedades en este ámbito. Por lo tanto, vamos a crear un lenguaje declarativo inspirado en Prolog que se pueda utilizar para programar el comportamiento de los personajes de un videojuego que tienen, al menos, que realizar las siguientes acciones: i) superar obstáculos, con la opción de saltar con velocidad; ii) recoger items que se agregan a la puntuación final; iii) evitar enemigos.
Los objetivos del proyecto de investigación son los siguientes:
\input{sections/introduccion/objetivos}

View File

@ -1,9 +1,9 @@
\subsubsection{Objetivos Específicos}
\begin{enumerate}
\item Revisar bibliografía sobre Prolog, el motor Godot y programación de videojuegos.
\item Analizar la información recopilada de la bibliografía investigada.
\item Crear el lenguaje de programación de tipo declarativo inspirado en Prolog.
\item Implementar un videojuego usando una inteligencia artificial basada en el lenguaje anteriormente creado.
\item Evaluar el desempeño del lenguaje inventado, verificando el cumplimiento exitoso de superación de obstáculos por parte del agente.
\item Se revisó la bibliografía sobre Prolog, el motor Godot y programación de videojuegos.
\item Se analizó la información recopilada de la bibliografía investigada.
\item Se creó el lenguaje de programación de tipo declarativo inspirado en Prolog, de nombre \textit{''Obelisk''}.
\item Se implementó una inteligencia artificial basada en el lenguaje anteriormente creado en un videojuego.
\item Se evalúo del desempeño del lenguaje inventado, con verificación del cumplimiento exitoso de la superación de obstáculos por parte del agente.
\end{enumerate}

View File

@ -1,3 +1,3 @@
\subsubsection{Objetivo General}
Desarrollar un lenguaje de programación de tipo declarativo inspirado en Prolog que permita modelar el comportamiento de los agentes de un videojuego empleando reglas lógicas.
Hemos desarrollado un lenguaje de programación de tipo declarativo inspirado en Prolog que permite modelar el comportamiento de los agentes de un videojuego empleando reglas lógicas.

View File

@ -17,7 +17,7 @@ También la API permite que la Inteligencia Artificial tome decisiones con mayor
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth, height=0.9\textheight, keepaspectratio]{figures/godot-gdnative.png}
\includegraphics[width=0.5\textwidth, height=0.5\textheight, keepaspectratio]{figures/godot-gdnative.png}
\caption{Voxel Data Generation} \cite{GDNative-Benchmarks}
\label{fig:godot_gdnative_comparison}
\end{figure}
@ -26,7 +26,7 @@ En el caso de generación de datos voxel, existe un aumento de 8,846.43\% en su
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth, height=0.9\textheight, keepaspectratio]{figures/godot-gdnative2.png}
\includegraphics[width=0.5\textwidth, height=0.5\textheight, keepaspectratio]{figures/godot-gdnative2.png}
\caption{Mesh Generation} \cite{GDNative-Benchmarks}
\label{fig:godot_gdnative_comparison2}
\end{figure}

View File

@ -0,0 +1,9 @@
\section{Trabajo Futuro}
Dentro de este aspecto, tenemos varios elementos que proponemos desarrollar en un futuro, con la intención de complementar nuestro lenguaje de programación o su funcionalidad. Estos ya poseen una base y solo requieren su finalización.
\begin{itemize}
\item Perfeccionar nuestro lenguaje de programación para que sea \textit{Touring-complete}.
\item Análisis del comportamiento del agente dentro de cualquier software, utilizando los datos obtenidos del videojuego.
\item Pasar la lógica de consultas proveniente de la base de conocimientos y así utilizar la GPU, con librerías tales como CUDA de Nvidia.
\item Implementar lógica difusa en los hechos, reglas y acciones.
\end{itemize}