SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Proyecto Final de Inteligencia Artificial:
Miguel Angel Piña Avelino
Facultad de Ciencias U.N.A.M.
1 de diciembre de 2010
Resumen
En la actualidad los videojuegos forman una parte muy importante de la vida
diaria, los cuales son creados para ofrecer un entretenimiento en general y basado
en la interacción entre una o más personas y un aparato que ejecute dicho video-
juego.
La inteligencia artificial juega un papel importante dentro de los videojuegos, ya
que sus métodos abren nuevas posibilidades en el arte de desarrollo de un videojue-
go, permitiendo que se realicen experiencias ricas en interaccion y entretenimiento
para el usuario.
En este documento se hara un pequeño analisis de una tecnica de inteligencia ar-
tificial en videojuegos en especifico, la cuál será: el aprendizaje, en particular los
algoritmos genéticos.
1. Introducción
Los juegos son parte integral de todas las culturas humanas conocidas. Estos son
una forma de interacción social, además de proveernos modelos de situaciones conflic-
tivas y cooperativas en las que podemos reconocer situaciones y pautas que se repiten
con frecuencia en el mundo real.
Un videojuego es un software creado para el entrenimiento en general y basado en la
interacción entre una o más personas y un aparato que ejecuta dicho videojuego.[1]
Los videojuegos se encuentran en varios géneros y formatos, como la nueva forma de
los viejos métodos de la interacción social dentro de los juegos. Esta nueva expresión
de juegos permite a los investigadores en inteligencia artificial probar nuevos métodos
para el desarrollo de la misma.
La inteligencia artificial es un elemento importante en los videojuegos, aunque es-
ta sea muy sencilla o muy compleja, sirve para controlar a los NPC’s -Non Playing
Characters- (Personajes No Controlados por un jugador), establecer nuevas narrativas
dentro de los videojuegos, es decir, “no solo el manejo de dialogos sencillos y unas
cuantas decisiones, sino de una genuina cuestion sentimental en la que el jugador se
ve completamente sumergido, gracias al poder que los programadores otorgan a los
susodichos NPC’s”.[2]
En este artículo se hará un pequeño análisis de una técnica de inteligencia artificial que
será el aprendizaje, en particular, los algoritmos genéticos para proveer aprendizaje a
1
NPC’s, y el problema será dentro de un pequeño juego cuya temática versará sobre un
apocalipsis zombie, que constará de unos cuantos niveles y al avanzar en los niveles
proveer una mayor dificultad para eliminar a los zombies.
Para estos NPC’s (zombies) se les proveerá de unas habilidades iniciales que al avan-
zar de nivel, los que más acercaron, permitiran generar una nueva población con sus
características aumentando un poco su dificultad para eliminarlos.
2. Inteligencia Artificial
La inteligencia artificial es una rama de las Ciencias de la Computación que se de-
dica al desarrollo de agentes racionales no vivos.
Un agente es cualquier cosa que pueda ser capaz de percibir el entorno en el que se
desenvuelve(percibir entradas), procesar dichas entradas, y realizar acciones en su en-
torno; la racionalidad es la “característica que poseé una elección ser correcta”, más
en concreto, la capacidad de tender a maximizar un resultado esperado. Entonces, en
palabras de la Wikipedia:
“Por lo tanto, y de manera más específica la inteligencia artificial es la dis-
ciplina que se encarga de construir procesos que al ser ejecutados sobre
una arquitectura física producen acciones o resultados que maximizan una
medida de rendimiento determinada, basándose en la secuencia de entra-
das percibidas y en el conocimiento almacenado en tal arquitectura.”[3]
En la inteligencia artificial, existen distintos tipos de conocimiento y representación del
conocimiento, los cuales pueden ser dados por el diseñador del agente y/o aprendidos
por el agente durante la fase de ejecución utilizando diversas técnicas de aprendizaje.
Actualmente, la inteligencia artificial puede dividirse en 2 escuelas de pensamiento:
Inteligencia Artificial Convencional
Inteligencia Computacional
2.1. Inteligencia Artificial Convencional
Esta basada en el análisis formal y estadistico del comportamiento humano ante
diversos problemas. Entre los cuales podemos citar a los siguiente:
Razonamiento basado en casos: Ayuda a tomar decisiones mientras se resuelven
ciertos problemas concretos y aparte que son muy importantes requieren de un
buen funcionamiento.
Sistemas expertos: Infieren una solución a través del conocimiento previo del
contexto en que se aplica y ocupa de ciertas reglas o relaciones.
Redes bayesianas: Propone soluciones mediante inferencia estadística.
Inteligencia artificial basada en comportamientos: que tienen autonomía y pue-
den auto-regularse y controlarse para mejorar.
2
Smart process management: facilita la toma de decisiones complejas, proponien-
do una solución a un determinado problema al igual que lo haría un especialista
en la actividad.
2.2. Inteligencia Artificial Computacional
La inteligencia computacional esta basada en el desarrollo o aprendizaje interacti-
vo. Este aprendizaje se realiza basándose en datos empíricos. Este tipo de inteligencia
artificial se centra en el estudio de mecanismos adaptativos para permitir el comporta-
miento racional del agente en sistemas complejos o cambiantes. Dentro de la inteligen-
cia artificial computacional podemos encontrar técnicas como las siguientes:
Redes Neuronales: Es un paradigma de aprendizaje y procesamiento automático
inspirado en la forma en que funciona el sistema nervioso de los animales. Se
trata de un sistema de interconexión de neuronas en una red que colabora para
producir un estímulo de salida.
Computación Evolutiva: Es un paradigma de la inteligencia artificial, que involu-
cran problemas de optimización combinatoria. Esta inspirada en los mecanismos
de evolución biológica. En la actualidad hay tres corrientes principales que con-
forman la computación evolutiva:
• Programación evolutiva: es una variante de los algoritmos genéticos, donde
lo que cambia es la representación de individuos. En el caso de la progra-
mación evolutiva los individuos son ternas que cuyos valores representan
estados de un autómata finito.
• Estrategias Evolutivas: son métodos computacionales que trabajan con una
población de individuos que pertenecen al dominio de los números reales,
que mediante los procesos de mutación y de recombinación evolucionan
para alcanzar el óptimo de la función objetivo.
• Algoritmos genéticos: Estos algoritmos hacen evolucionar una población
de individuos sometiéndola a acciones aleatorias semejantes a las que ac-
túan en la evolución biológica (mutaciones y recombinaciones genéticas),
así como también a una selección de acuerdo con algún criterio, en función
del cual se decide cuáles son los individuos más adaptados, que sobreviven,
y cuáles los menos aptos, que son descartados. También es denominado al-
goritmos evolutivos, e incluye las estrategias evolutiva, la programación
evolutiva y la programación genética.
3. Algoritmos Genéticos
Los algoritmos genéticos están inspirados en la evolución biológica y su base
genético-molecular.Estos algoritmos hacen evolucionar una población de individuos
sometiéndola a acciones aleatorias semejantes a las que actúan en la evolución bioló-
gica (mutaciones y recombinaciones genéticas), así como también a una selección de
acuerdo con algún criterio, en función del cual se decide cuáles son los individuos más
3
adaptados, que sobreviven, y cuáles los menos aptos, que son descartados. También es
denominado algoritmos evolutivos, e incluye las estrategias evolutiva, la programación
evolutiva y la programación genética.
Un algoritmo genético es un método de busqueda dirigida basada en probabilidad. Bajo
una condición muy débil (que el algoritmo mantenga elitismo, es decir, guarde siem-
pre al mejor elemento de la población sin hacerle ningún cambio) se puede demostrar
que el algoritmo converge en probabilidad al óptimo. En otras palabras, al aumentar
el número de iteraciones, la probabilidad de tener el óptimo en la población tiende a 1
(uno)1
.
3.1. Funcionamiento
Los algoritmos genéticos imitan a la evolución biológica para resolver distintos
tipos de problemas. Dado el problema a resolver, el algoritmo genético toma como
conjunto de entrada un conjunto de potenciales soluciones a ese problema codificán-
dolas de alguna manera, y una métrica llamada función de aptitud(fitness) que permite
evaluar cuantitatívamente a cada candidata. Estás candidatas pueden ser soluciones que
ya se saben que funcionan, con el objetivo que el algoritmo genético las mejore, pero
generalmente son generadas aleatoriamente.
Luego el AG evalúa cada candidata de acuerdo con la función de aptitud(fitness). En un
acervo de candidatas generadas aleatoriamente, por supuesto, la mayoría no funciona-
rán en absoluto, y serán eliminadas. Sin embargo, por puro azar, unas pocas pueden ser
prometedoras -pueden mostrar actividad, aunque sólo sea actividad débil e imperfecta,
hacia la solución del problema-.
Estas candidatas prometedoras se conservan y se les permite reproducirse. Se rea-
lizan múltiples copias de ellas, pero las copias no son perfectas; se introducen cambios
aleatorios durante el proceso de copia. Luego, esta descendencia digital prosigue con
la siguiente generación, formando un nuevo acervo de soluciones candidatas, y son so-
metidas a una ronda de evaluación de aptitud. Las candidatas que han empeorado o no
han mejorado con los cambios en su código son eliminadas de nuevo; pero, de nuevo,
por puro azar, las variaciones aleatorias introducidas en la población pueden haber me-
jorado a algunos individuos, convirtiéndolos en mejores soluciones del problema, más
completas o más eficientes. De nuevo, se selecionan y copian estos individuos vence-
dores hacia la siguiente generación con cambios aleatorios, y el proceso se repite. Las
expectativas son que la aptitud media de la población se incrementará en cada ron-
da y, por tanto, repitiendo este proceso cientos o miles de rondas, pueden descubrirse
soluciones muy buenas del problema.
3.2. Representación (Esquemas)
Antes de iniciar con una posible representación del conocimiento que puedan tener,
es conveniente, determinar cuando usar estos algoritmos:
1La demostración de la convergencia al óptimo la encontrarán en [9]
4
Si la función a optimizar tiene muchos máximos/mínimos locales se requerirán
más iteraciones del algoritmo para “asegurar” el máximo/mínimo global.
Si la función a optimizar contiene varios puntos muy cercanos en valor al ópti-
mo, solamente podemos “asegurar” que encontraremos uno de ellos (no necesa-
riamente el óptimo).
Un enfoque común para representar el conocimiento de entrada, es el establecerlas
como cadenas binarias (es decir cadenas de 1’s y 0’s), donde cada posición determina
el valor de algún aspecto de la solución.
Otro método similar, consiste en codificar las soluciones como cadenas de enteros o
números flotantes, de igual manera que en el método anterior, cada posición determina
algun valor de la solución. Este método tiene mayor ventaja que el anterior, ya que
permite codificar las soluciones con una mayor precisión y complejidad.
3.3. Algoritmo genético simple (AGS)
El algoritmo genético simple, es el nombre popular del algoritmo de Holland[7]
retomada por Goldberg[8]2
El algoritmo es el siguiente:
1. Decidir como codificar el dominio del problema.
2. Generar un conjunto aleatorio (población inicial) de N posibles soluciones.
3. Calificar cada posible solución (individuo) de la población actual.
4. Seleccionar dos individuos de la población actual con una probabilidad propor-
cional a su calificación.
5. Lanzar una moneda al aire (con probabilidad pc caé cara).
6. Si cayó cara mezclar los códigos de los dos individuos seleccionados para formar
dos híbridos, a los que llamaremos nuevos individuos
7. Si cayó cruz llamamos a los individuos seleccionados nuevos individuos.
8. Por cada gen de cada nuevo individuo lanzar otra moneda al aire (con probabili-
dad pm cae cara.
9. Si cae cara cambiar el gen en turno por otro aleatorio, cuyo valor este definido
en el intervalo de codificación del problema.
10. Si cae cruz el gen permanece inalterado.
11. Incluir a los dos nuevos individuos en una nueva población.
12. Si la nueva población tiene ya N individuos, llamarla población actual, y regresar
al paso 3, a menos que se cumpla alguna condición de terminación.
2Para el siguiente algoritmo se modifica principalmente, la forma en que se toman los códigos genéticos
para poder utilizar en nuestro problema, el cual generalizaremos a un tipo de dato Numeric.
5
13. Si no regresar al paso 4.
Dentro del algoritmo, cuando se hace referencia a lanzar una moneda al aire, se refiere
a realizar un experimento de Bernoulli, es decir, aquel que solo se tiene dos eventos
posible, uno con probabilidad p y otro con probabilidad 1-p. Nuestra condición de
terminación en nuestro problema particular será el de la terminación del juego, es decir,
cuando nuestro jugador haya “muerto” o cierre la ventana del juego.
4. Problema
El juego desarrollado tendrá la siguiente temática: crear una serie de agentes que
tienen como único objetivo perseguir a una presa (el usuario) y asi obtener diferentes
tipos de comportamientos ante los posibles comportamientos de los agentes.
Al inicio del juego se crearán 30 individuos con un conjunto de habilidades, y al trans-
currir 7 segundos del juego, se tomarán los más aptos de acuerdo con la función fitness
del algoritmo genético para así crear una nueva generación de individuos que conten-
drán ciertas habilidades de sus antecesores.
Con lo anterior se podrá obtener una nueva generación de individuos con una mayor
probabilidad de ser mejor que sus padres, con ésto se “debería” ir aumentando las pro-
babilidades de poder atrapar a su presa (esto será una selección natural, en la que solo
tendrán descendencia aquellos que mostraron un mejor desempeño).
Además, durante el juego, cada dos generaciones se creará un nuevo agente generado
por el azar, un agente que puede tener mejores características o habilidades que los
agentes que existen en ese momento, o tal vez las mismas características de la pobla-
ción base. Así podemos obtener un agente más apto que cualquier otro (mutación de
ganancia de función) o podría resultar en un agente con características inferiores a los
de las generaciones que la preceden (mutación letal o deletérea).
Lo anterior se realizará durante toda la ejecución del juego hasta el alcance del objetivo.
4.1. Etapas del proyecto
El desarrollo del videojuego consta de tres etapas significativas para el desarrollo y
aplicación de cada una.
1. La función crossover de la aplicación, que en este caso es la única al principio
2. Como el crossover no es suficiente, es necesario agregar una función de muta-
ción.
3. La última etapa es de optimización, la cual es la más dificil de implementar, esta
no se pudo desarrollar, dado que aún faltan muchas cosas por conocer respecto a
coordinación entre agentes; ésta tiene mejores funciones de fitness(más específi-
cas, claras, complejas) y estrategias y coordinación entre agentes.
6
Figura 1: Ejecución del juego
7
5. Desarrollo
En ésta sección se mostrará como se implemento el videojuego en C#.
Primero se mostrará los atributos de los enemigos con base al diseño UML que se mos-
trará enseguida:
Y éste es el código de la implentación en C# para los atributos del agente:
Figura 2: Enemigo
//atributo de la generacion
public float escala;
//atributo de la generacion
public float velocidad;
//atributo de la generacion
public float aceleracion;
//atributo de la generacion
public Color color;
//atributo de la generacion
public int ataq;
Lo anterior es la parte de codificación del dominio de nuestro problema, lo cual esta-
mos restrigiendo a las habilidades del agente, éstos nos servirán como genes para poder
operar sobre ellos.
Descripción de los colores.
public static Color[] c =
{
Color.AliceBlue, Color.Azure,
Color.YellowGreen, Color.Turquoise,
Color.Violet, Color.Tomato,
Color.SteelBlue, Color.Snow,
Color.SkyBlue, Color.Peru,
Color.PaleVioletRed, Color.Olive,
Color.Navy, Color.MintCream,
Color.Magenta, Color.Linen,
Color.Lime, Color.Ivory,
Color.Gold, Color.Crimson,
8
Color.Bisque, Color.LightSalmon,
Color.LightSlateGray, Color.MediumSeaGreen,
Color.MidnightBlue, Color.SeaShell,
Color.Silver
};
Descripción del ataque:
public void Update(GameTime theGameTime, Vector2 pos)
{
switch (ataq)
{
case 0:
mueveteXY();
break;
case 1:
persigue(pos);
break;
case 2:
mueveteX();
break;
case 3:
mueveteY();
break;
case 4:
nada();
break;
default:
break;
}
}
En el código anterior se crean cinco tipos de comportamiento o ataque de los agentes,
los cuales listaré enseguida:
Perseguir jugador
No se mueve
9
Moverse sobre eje X
Moverse sobre eje Y
Moverse sobre XY
Lo siguiente a mostrar es la función prefitness, pero antes de ello es necesario
explicar en que consiste.
La función prefitness lo que hace es que, antes de que uun agente pueda ser evaluado
por la función fitness tiene necesariamente que pasar por un pre-fitness, en el cual se
requiere que el agente haya sobrevivido los 7 segundos antes de poder ser evaluado en
el fitness.
Un agente es eliminado si:
Se sale de la pantalla.
Colisiona con el jugador.
Ya que se tiene esto ahora es pasarlo por una función fitness, para volverlo candidato a
ser parte de la población base para entrar dentro del algoritmo genético.
En el siguiente porción de código se ve de manera sencilla la función fitness
//paso de los elementos por la función fitness
if(enemigos.ElementAt(i).fitness(p.Position) >550)
{
enemigos.RemoveAt(i);
...
...
}
//Función fitness
public float fitness(Vector2 pos)
{
return Vector2.Distance(Position, pos);
}
Como se vé, la función fitness solo pide una distancia menor de 550 pixeles de dis-
tancia hacia el jugador, si esto no se cumple cuando han transcurrido 7 segundos(una
generación), el agente es eliminado del juego.
Ya que hemos mostrado esencialmente las características propias del enemigo, es mo-
mento de mostrar las caractetísticas del usuario:
Figura 3: Usuario
10
Controlado por humano
5 vidas disponibles
Desplazamiento X-Y (7 pixeles)
La implementación para dar el comportamiento deseado del usuario es la siguiente:
public void Update(GameTime theGameTime)
{
KeyboardState aCurrentKeyboardState =
Keyboard.GetState();
if
(aCurrentKeyboardState.IsKeyDown(Keys.Left)
== true){
Position.X -= 7;
}
else if
(aCurrentKeyboardState.IsKeyDown(Keys.Right)
== true)
{
Position.X += 7;
}
if (aCurrentKeyboardState.IsKeyDown(Keys.Up)
== true)
{
Position.Y -= 7;
}
else if
(aCurrentKeyboardState.IsKeyDown(Keys.Down)
== true)
{
Position.Y += 7;
}
inScreen();
}
5.1. Crossover
Ya se comentó sobre las características de los enemigos y el usuario, entonces, aho-
ra se mostrará la forma de operar el crossover entre los individuos.
Se describirá de la forma de descendencia normal, donde solo los que cumplan con
la función fitness serán conservados y podrán tener descendencia. Éstos podrán tener
algunas características en especial.
11
if(generacion % 500 == 0)
{
for (byte i = 0; i < 10; i++)
{
enemigos.Add(new Enemigo(
enemigos.ElementAt(
r1.Next(enemigos.Count)).Position+
new Vector2(30, 30),
enemigos.ElementAt(
r1.Next(enemigos.Count)).velocidad,
enemigos.ElementAt(
r1.Next(enemigos.Count)).aceleracion,
enemigos.ElementAt(
r1.Next(enemigos.Count)).color,
imagen,
enemigos.ElementAt(
r1.Next(enemigos.Count)).escala,
enemigos.ElementAt(
r1.Next(enemigos.Count)).ataq));
}
}
La siguiente imagen se da de manera gráfica la forma de obtener el crossover.
5.2. Mutación
Dado que ahora ya pasamos la parte del crossover, claramente se nota que no es su-
ficiente para resolver nuestro problema. Tenemos a nuestros agentes que sobrevivan y
pasen la función fitness tendrán descendencia, pero su descendencia tendrá solamente
características de sus antecesores, entonces, ahí es donde entra una nueva de tratar de
resolver nuestro problema; la solución dada es la mutación, la cual podrá darle ventaja
o desventaja respecto a sus habilidades actuales, lo cual implica que, o bien gana me-
jores aptitudes respecto a la población o solo empeora.
Para esto analicemos varios escenarios:
Inmóviles: Claramente estos agentes desaparecerán en la primera iteración del
algoritmo, ya que estos no tendrán descendencia.
Siguen una sola dirección: Éstos también se extinguirán ya que el usuario se
puede mover en cualquier dirección y estos tendrán una distancia mayor, lo cual
conllevará a no ser tomados en cuenta por el pre-fitness.
Persiguen por toda la pantalla: Éstos agentes tendrán mayor probabilidad de
dejar descendencia, ya que se estarán aproximando al usuario en mayor medida
que los anteriores.
12
Figura 4: Crossover
13
Figura 5: fig: Juego
Pero en el transcurso del juego, los agentes en su intento de alcanzar al usuario irán
formando una fila. Entonces para el usuario solo le será suficiente utilizar las orillas
para mantenerse a salvo. Ahora si el usuario es lo suficientemente ágil, entonces se
podrían acercar a los agentes a una orilla y esperar el momento de la selección e ir
tratando de ir al otro lado ocasionando la desaparición de todos. ¿Pero si el usuario es
lo suficientemente hábil para ir desapareciendo a los que se mueven e ir dejando solo a
los que están estáticos?
Entonces, es ahí cuando se implementa la mutación para los agentes; la mutación es
un proceso biológico que consiste en alterar la información genética de un ser vivo
y que, por lo tanto, va a producir un cambio en sus caracteríticas, que se presenta de
manera súbita y espontánea, y que se pueden transmitir a su descendencia. La mayo-
ría de las ocasiones este tipo de mutaciones son maléficas para el ser vivo que tiene
ésta mutación, pero hay ocasiones en que es benéfica cuando el ambiente en el que se
desenvuelven, un claro ejemplo es el de la Biston betularia, o mariposa del abedul es
un lepidóptero nocturno que durante el día descansa en las ramas o troncos de los árbo-
les cubiertos de líquenes de color grisáceo. El color blanco sucio de las alas contribuye
a que sean confundidas con la base sobre la que se posan. Pero en los últimos 200 años
14
el color de la gran mayoría se tornó grisáceo y oscuro, dado que los líquenes de los
árboles en los que descansaban también se tornó oscuro y las convirtió a las maripo-
sas de color claro en presas fáciles de los animales insectívoros. Entonces para nuestro
proyecto es una buena idea el de implementar una mutación para poder cambiar ciertos
aspectos que mantienen las generaciones en el transcurso del juego.
De esta manera podriamos tener mejores características para un momento dado, pero
que ya no funcionen para generaciones posteriores, o que características que no fun-
cionaban para un momento dado no significa que no sirva tampoco en generaciones a
posteriori, así que en la simulación vemos si sobreviven los más agresivos o los más
cautos. Esto podría implicar en el éxito o fracaso de estos.
Así que la solución de a este problemas que se están mostrando está basada en el re-
troceso mismo. Igual que antes cuando se haga la selección y la descendencia de los
agentes, se escogerán habilidades de estos, pero cada ciertas generaciones un descen-
diente tendrá características que tal vez ya no se utilizaban. Como ejemplo supongamos
que llegamos de nuevo al momento en que ya ninguno se mueve. Esta vez mientras uno
espera que se termine el ciclo de vida de la generación y se aleja lo suficiente podría
aparecer un agente que base su ataque en algún tipo de movimiento. Así lograría acer-
carse lo suficiente al usuario para mantener a la especie con vida durante otra genera-
ción y esperando que su descendencia conserve la habilidad de moverse. En el caso en
que todos los agentes persigan, la creación de uno estático o que se mueva hacia el lado
contrario de donde están los demás, también podría culminar en la conservación de los
agentes. Claro todo esto se da por probabilidades y siempre existirá la probabilidad de
que este agente no presente ninguna característica nueva, ocasionando así el fracaso y
exterminio de todos. Lo siguiente muestra como se crea un agente con posibilidades de
tener genes recesivos.
if (generacion % 1000 == 0)
{
enemigos.Add(new Enemigo(
new Vector2(r1.Next(900), r1.Next(600)),
velocidad[r.Next(velocidad.Length)],
aceleracion[r.Next(aceleracion.Length)],
Enemigo.c[r1.Next(Enemigo.c.Length)],
imagen,
escala[r.Next(escala.Length)],
r.Next(6)));
Aquí finaliza la segunda etapa. Y todo lo que corresponde a código y partes implemen-
tadas.
5.3. Optimización
Las principales cosas que hacen falta para esto son varias.
Entre las principales cosas se encuentran:
Comunicación para los agentes.
Estrategias entre los agentes.
15
Entre otros problemas de naturaleza estadística.
Para esto se propone lo siguiente:
Para hacer la evaluación se darían 30 segundos, en los cuales se guardarían los
recorridos del usuario y de los agentes.
Se cambiarían las vidas por una barra de puntos, para poder tener el daño inflin-
gido por los agentes al usuario.
Añadir funciones estadísticas, para tener un mejor análisis de puntos de coli-
sión, distribución sobre el área de juego, desempeño de los agentes dadas por las
distancias obtenidas, etc.
Como esto ya sale de alcance del diseño del juego solo se quedan por ahora como
propuestas de mejoramiento.
6. Conclusiones
Los algoritmos genéticos en particular y la computación evolutiva en general son de
las lineas más prometedoras en el campo de la inteligencia artificial, ya que proponen
mejores métodos para la resolución de problemas no algoritmicos, permitiendo que se
haga una analogía con la naturaleza en la busqueda de soluciones probabilísticas.
Bajo condiciones muy simples (mantener elitismo) se puede demostrar que los algorit-
mos genéticos siempre convergen al óptimo de la soluciones propuestas.
En este proyecto se puede notar que no siempre es fácil el simular procesos naturales
como parece en un principio. Cuando se modelan problemas, no siempre es posible
tomar todas las características que estan juego, solo es posible, actualmente, el tomar
solo las necesarias para tener mejores restricciones y aproximaciones para resolver el
problema.
Nuestro agentes en un principio solo eran entidades monótonas que facilmente podría-
mos eliminarlas, entonces, para resolver éste problema fue necesario meter los concep-
tos de mutación y evolución, lo cual lleva a tener agentes con características distintas
en cada paso de la ejecución, introduciendo una especie de “efecto caótico” para poder
así tener una mejor dificultad en contra del usuario.
Cuando se aplican los conceptos antes dichos, los agentes tienden a tener leves mejo-
rías conforme avanzan en las generaciones.
Al tratar de meter una capacidad de optimización para nuestro programa, se puede no-
tar que la complejidad para desarrollarse es cada vez mayor; pero los resultados crecen
para tener mejores capacidades en el desempeño de los agentes.
Por lo que los algoritmos genéticos representan una alternativa de bajo costo para la
resolución de diversos problemas. Los algoritmos genéticos representan una forma de
tener mejores modelos para el diseño de solución de diversos problemas no solo para
nuestro caso particular que es el desarrollar un videojuego sino para problemas de dis-
tinta índole que requieran que los datos no se mantengan estáticos y evolucionen en el
tiempo sin necesidad de observalos de manera constante.
16
Referencias
[1] Wikipedia (Videojuegos)
http://es.wikipedia.org/wiki/Videojuegos
[2] Gamers (articulo “La nueva narrativa de los videojuegos”). Revista. Marzo 2009.
[3] Wikipedia (Inteligencia Artificial).
http://es.wikipedia.org/wiki/inteligencia_artificial
[4] Game Design Workshop. Tracy Fulleron, Christopher Swain, Steven Hoffman.
CMP Books. 2005.
[5] Wikipedia (Algoritmos Genéticos).
http://es.wikipedia.org/wiki/Algoritmos_genéticos
[6] Algoritmos Genéticos. Ángel Kuri Morales, José Galaviz Casas. Fondo de Cultu-
ra Económica. 2002.
[7] Adaptation In Natural And Artificial Systems, Holland J. H., 2a. edición, MIT
Press, 1992.
[8] Genetic Algorithms In Search, Optimization And Machine Learning, Goldberg
D., Addison Wesley, 1989.
[9] ALGORITMOS GENÉTICOS: ALGUNOS RESULTADOS DE CONVERGEN-
CIA.
Mario Alberto Villalobos Arias
Departamento de Matemáticas Centro de Investigación y de Estudios Avanzados
de I.P.N.
http://semana.mat.uson.mx/Memorias/villalobos.pdf
17

Más contenido relacionado

La actualidad más candente

Tema 1 repres mentales alumnos parte 1
Tema 1 repres mentales alumnos parte 1Tema 1 repres mentales alumnos parte 1
Tema 1 repres mentales alumnos parte 1snieva
 
Actividad 5
Actividad 5Actividad 5
Actividad 5CABR1946
 
Trabajo final inteligencia artificial
Trabajo final inteligencia artificial Trabajo final inteligencia artificial
Trabajo final inteligencia artificial adrianacidec
 
Inteligencia laura y jenni
Inteligencia laura y jenniInteligencia laura y jenni
Inteligencia laura y jenniYenifer Callejas
 
La Inteligencia Artificial - IA
La Inteligencia Artificial - IALa Inteligencia Artificial - IA
La Inteligencia Artificial - IAJHONFRANX
 
Avances tecnologicos
Avances tecnologicosAvances tecnologicos
Avances tecnologicosdayannalopz13
 
Inteligenciaartificial 100127141036 Phpapp01
Inteligenciaartificial 100127141036 Phpapp01Inteligenciaartificial 100127141036 Phpapp01
Inteligenciaartificial 100127141036 Phpapp01cardpogi
 
Artificial inteligence and neural networks
Artificial inteligence and neural networksArtificial inteligence and neural networks
Artificial inteligence and neural networksMireya Mendez
 
Trabajo definitivo rafael gutierrez
Trabajo definitivo rafael gutierrezTrabajo definitivo rafael gutierrez
Trabajo definitivo rafael gutierrezRafaelg1010
 

La actualidad más candente (20)

Tema 1 repres mentales alumnos parte 1
Tema 1 repres mentales alumnos parte 1Tema 1 repres mentales alumnos parte 1
Tema 1 repres mentales alumnos parte 1
 
Actividad 5
Actividad 5Actividad 5
Actividad 5
 
Trabajo final inteligencia artificial
Trabajo final inteligencia artificial Trabajo final inteligencia artificial
Trabajo final inteligencia artificial
 
Inteligencia Artificial Vannesa Anama
Inteligencia Artificial Vannesa AnamaInteligencia Artificial Vannesa Anama
Inteligencia Artificial Vannesa Anama
 
Trabajo final inteligencia
Trabajo final inteligenciaTrabajo final inteligencia
Trabajo final inteligencia
 
Ingenieria artifical
Ingenieria artificalIngenieria artifical
Ingenieria artifical
 
Inteligencia artificial salud
Inteligencia artificial saludInteligencia artificial salud
Inteligencia artificial salud
 
Inteligencia laura y jenni
Inteligencia laura y jenniInteligencia laura y jenni
Inteligencia laura y jenni
 
Diapo
DiapoDiapo
Diapo
 
La Inteligencia Artificial - IA
La Inteligencia Artificial - IALa Inteligencia Artificial - IA
La Inteligencia Artificial - IA
 
Avances tecnologicos
Avances tecnologicosAvances tecnologicos
Avances tecnologicos
 
Inteligenciaartificial 100127141036 Phpapp01
Inteligenciaartificial 100127141036 Phpapp01Inteligenciaartificial 100127141036 Phpapp01
Inteligenciaartificial 100127141036 Phpapp01
 
Introducción a la IA
Introducción a la IAIntroducción a la IA
Introducción a la IA
 
Artificial inteligence and neural networks
Artificial inteligence and neural networksArtificial inteligence and neural networks
Artificial inteligence and neural networks
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Trabajo final
Trabajo final Trabajo final
Trabajo final
 
Trabajo definitivo rafael gutierrez
Trabajo definitivo rafael gutierrezTrabajo definitivo rafael gutierrez
Trabajo definitivo rafael gutierrez
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
1 introduccion-a-la-inteligencia-artificial
1 introduccion-a-la-inteligencia-artificial1 introduccion-a-la-inteligencia-artificial
1 introduccion-a-la-inteligencia-artificial
 

Similar a IA en videojuegos usando algoritmos genéticos

Similar a IA en videojuegos usando algoritmos genéticos (20)

Issumitloxa
IssumitloxaIssumitloxa
Issumitloxa
 
Tareas del mundo real
Tareas del mundo realTareas del mundo real
Tareas del mundo real
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial2
Inteligencia artificial2Inteligencia artificial2
Inteligencia artificial2
 
informatica
informaticainformatica
informatica
 
Imformatica
ImformaticaImformatica
Imformatica
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Sistema experto
Sistema expertoSistema experto
Sistema experto
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 

IA en videojuegos usando algoritmos genéticos

  • 1. Proyecto Final de Inteligencia Artificial: Miguel Angel Piña Avelino Facultad de Ciencias U.N.A.M. 1 de diciembre de 2010 Resumen En la actualidad los videojuegos forman una parte muy importante de la vida diaria, los cuales son creados para ofrecer un entretenimiento en general y basado en la interacción entre una o más personas y un aparato que ejecute dicho video- juego. La inteligencia artificial juega un papel importante dentro de los videojuegos, ya que sus métodos abren nuevas posibilidades en el arte de desarrollo de un videojue- go, permitiendo que se realicen experiencias ricas en interaccion y entretenimiento para el usuario. En este documento se hara un pequeño analisis de una tecnica de inteligencia ar- tificial en videojuegos en especifico, la cuál será: el aprendizaje, en particular los algoritmos genéticos. 1. Introducción Los juegos son parte integral de todas las culturas humanas conocidas. Estos son una forma de interacción social, además de proveernos modelos de situaciones conflic- tivas y cooperativas en las que podemos reconocer situaciones y pautas que se repiten con frecuencia en el mundo real. Un videojuego es un software creado para el entrenimiento en general y basado en la interacción entre una o más personas y un aparato que ejecuta dicho videojuego.[1] Los videojuegos se encuentran en varios géneros y formatos, como la nueva forma de los viejos métodos de la interacción social dentro de los juegos. Esta nueva expresión de juegos permite a los investigadores en inteligencia artificial probar nuevos métodos para el desarrollo de la misma. La inteligencia artificial es un elemento importante en los videojuegos, aunque es- ta sea muy sencilla o muy compleja, sirve para controlar a los NPC’s -Non Playing Characters- (Personajes No Controlados por un jugador), establecer nuevas narrativas dentro de los videojuegos, es decir, “no solo el manejo de dialogos sencillos y unas cuantas decisiones, sino de una genuina cuestion sentimental en la que el jugador se ve completamente sumergido, gracias al poder que los programadores otorgan a los susodichos NPC’s”.[2] En este artículo se hará un pequeño análisis de una técnica de inteligencia artificial que será el aprendizaje, en particular, los algoritmos genéticos para proveer aprendizaje a 1
  • 2. NPC’s, y el problema será dentro de un pequeño juego cuya temática versará sobre un apocalipsis zombie, que constará de unos cuantos niveles y al avanzar en los niveles proveer una mayor dificultad para eliminar a los zombies. Para estos NPC’s (zombies) se les proveerá de unas habilidades iniciales que al avan- zar de nivel, los que más acercaron, permitiran generar una nueva población con sus características aumentando un poco su dificultad para eliminarlos. 2. Inteligencia Artificial La inteligencia artificial es una rama de las Ciencias de la Computación que se de- dica al desarrollo de agentes racionales no vivos. Un agente es cualquier cosa que pueda ser capaz de percibir el entorno en el que se desenvuelve(percibir entradas), procesar dichas entradas, y realizar acciones en su en- torno; la racionalidad es la “característica que poseé una elección ser correcta”, más en concreto, la capacidad de tender a maximizar un resultado esperado. Entonces, en palabras de la Wikipedia: “Por lo tanto, y de manera más específica la inteligencia artificial es la dis- ciplina que se encarga de construir procesos que al ser ejecutados sobre una arquitectura física producen acciones o resultados que maximizan una medida de rendimiento determinada, basándose en la secuencia de entra- das percibidas y en el conocimiento almacenado en tal arquitectura.”[3] En la inteligencia artificial, existen distintos tipos de conocimiento y representación del conocimiento, los cuales pueden ser dados por el diseñador del agente y/o aprendidos por el agente durante la fase de ejecución utilizando diversas técnicas de aprendizaje. Actualmente, la inteligencia artificial puede dividirse en 2 escuelas de pensamiento: Inteligencia Artificial Convencional Inteligencia Computacional 2.1. Inteligencia Artificial Convencional Esta basada en el análisis formal y estadistico del comportamiento humano ante diversos problemas. Entre los cuales podemos citar a los siguiente: Razonamiento basado en casos: Ayuda a tomar decisiones mientras se resuelven ciertos problemas concretos y aparte que son muy importantes requieren de un buen funcionamiento. Sistemas expertos: Infieren una solución a través del conocimiento previo del contexto en que se aplica y ocupa de ciertas reglas o relaciones. Redes bayesianas: Propone soluciones mediante inferencia estadística. Inteligencia artificial basada en comportamientos: que tienen autonomía y pue- den auto-regularse y controlarse para mejorar. 2
  • 3. Smart process management: facilita la toma de decisiones complejas, proponien- do una solución a un determinado problema al igual que lo haría un especialista en la actividad. 2.2. Inteligencia Artificial Computacional La inteligencia computacional esta basada en el desarrollo o aprendizaje interacti- vo. Este aprendizaje se realiza basándose en datos empíricos. Este tipo de inteligencia artificial se centra en el estudio de mecanismos adaptativos para permitir el comporta- miento racional del agente en sistemas complejos o cambiantes. Dentro de la inteligen- cia artificial computacional podemos encontrar técnicas como las siguientes: Redes Neuronales: Es un paradigma de aprendizaje y procesamiento automático inspirado en la forma en que funciona el sistema nervioso de los animales. Se trata de un sistema de interconexión de neuronas en una red que colabora para producir un estímulo de salida. Computación Evolutiva: Es un paradigma de la inteligencia artificial, que involu- cran problemas de optimización combinatoria. Esta inspirada en los mecanismos de evolución biológica. En la actualidad hay tres corrientes principales que con- forman la computación evolutiva: • Programación evolutiva: es una variante de los algoritmos genéticos, donde lo que cambia es la representación de individuos. En el caso de la progra- mación evolutiva los individuos son ternas que cuyos valores representan estados de un autómata finito. • Estrategias Evolutivas: son métodos computacionales que trabajan con una población de individuos que pertenecen al dominio de los números reales, que mediante los procesos de mutación y de recombinación evolucionan para alcanzar el óptimo de la función objetivo. • Algoritmos genéticos: Estos algoritmos hacen evolucionar una población de individuos sometiéndola a acciones aleatorias semejantes a las que ac- túan en la evolución biológica (mutaciones y recombinaciones genéticas), así como también a una selección de acuerdo con algún criterio, en función del cual se decide cuáles son los individuos más adaptados, que sobreviven, y cuáles los menos aptos, que son descartados. También es denominado al- goritmos evolutivos, e incluye las estrategias evolutiva, la programación evolutiva y la programación genética. 3. Algoritmos Genéticos Los algoritmos genéticos están inspirados en la evolución biológica y su base genético-molecular.Estos algoritmos hacen evolucionar una población de individuos sometiéndola a acciones aleatorias semejantes a las que actúan en la evolución bioló- gica (mutaciones y recombinaciones genéticas), así como también a una selección de acuerdo con algún criterio, en función del cual se decide cuáles son los individuos más 3
  • 4. adaptados, que sobreviven, y cuáles los menos aptos, que son descartados. También es denominado algoritmos evolutivos, e incluye las estrategias evolutiva, la programación evolutiva y la programación genética. Un algoritmo genético es un método de busqueda dirigida basada en probabilidad. Bajo una condición muy débil (que el algoritmo mantenga elitismo, es decir, guarde siem- pre al mejor elemento de la población sin hacerle ningún cambio) se puede demostrar que el algoritmo converge en probabilidad al óptimo. En otras palabras, al aumentar el número de iteraciones, la probabilidad de tener el óptimo en la población tiende a 1 (uno)1 . 3.1. Funcionamiento Los algoritmos genéticos imitan a la evolución biológica para resolver distintos tipos de problemas. Dado el problema a resolver, el algoritmo genético toma como conjunto de entrada un conjunto de potenciales soluciones a ese problema codificán- dolas de alguna manera, y una métrica llamada función de aptitud(fitness) que permite evaluar cuantitatívamente a cada candidata. Estás candidatas pueden ser soluciones que ya se saben que funcionan, con el objetivo que el algoritmo genético las mejore, pero generalmente son generadas aleatoriamente. Luego el AG evalúa cada candidata de acuerdo con la función de aptitud(fitness). En un acervo de candidatas generadas aleatoriamente, por supuesto, la mayoría no funciona- rán en absoluto, y serán eliminadas. Sin embargo, por puro azar, unas pocas pueden ser prometedoras -pueden mostrar actividad, aunque sólo sea actividad débil e imperfecta, hacia la solución del problema-. Estas candidatas prometedoras se conservan y se les permite reproducirse. Se rea- lizan múltiples copias de ellas, pero las copias no son perfectas; se introducen cambios aleatorios durante el proceso de copia. Luego, esta descendencia digital prosigue con la siguiente generación, formando un nuevo acervo de soluciones candidatas, y son so- metidas a una ronda de evaluación de aptitud. Las candidatas que han empeorado o no han mejorado con los cambios en su código son eliminadas de nuevo; pero, de nuevo, por puro azar, las variaciones aleatorias introducidas en la población pueden haber me- jorado a algunos individuos, convirtiéndolos en mejores soluciones del problema, más completas o más eficientes. De nuevo, se selecionan y copian estos individuos vence- dores hacia la siguiente generación con cambios aleatorios, y el proceso se repite. Las expectativas son que la aptitud media de la población se incrementará en cada ron- da y, por tanto, repitiendo este proceso cientos o miles de rondas, pueden descubrirse soluciones muy buenas del problema. 3.2. Representación (Esquemas) Antes de iniciar con una posible representación del conocimiento que puedan tener, es conveniente, determinar cuando usar estos algoritmos: 1La demostración de la convergencia al óptimo la encontrarán en [9] 4
  • 5. Si la función a optimizar tiene muchos máximos/mínimos locales se requerirán más iteraciones del algoritmo para “asegurar” el máximo/mínimo global. Si la función a optimizar contiene varios puntos muy cercanos en valor al ópti- mo, solamente podemos “asegurar” que encontraremos uno de ellos (no necesa- riamente el óptimo). Un enfoque común para representar el conocimiento de entrada, es el establecerlas como cadenas binarias (es decir cadenas de 1’s y 0’s), donde cada posición determina el valor de algún aspecto de la solución. Otro método similar, consiste en codificar las soluciones como cadenas de enteros o números flotantes, de igual manera que en el método anterior, cada posición determina algun valor de la solución. Este método tiene mayor ventaja que el anterior, ya que permite codificar las soluciones con una mayor precisión y complejidad. 3.3. Algoritmo genético simple (AGS) El algoritmo genético simple, es el nombre popular del algoritmo de Holland[7] retomada por Goldberg[8]2 El algoritmo es el siguiente: 1. Decidir como codificar el dominio del problema. 2. Generar un conjunto aleatorio (población inicial) de N posibles soluciones. 3. Calificar cada posible solución (individuo) de la población actual. 4. Seleccionar dos individuos de la población actual con una probabilidad propor- cional a su calificación. 5. Lanzar una moneda al aire (con probabilidad pc caé cara). 6. Si cayó cara mezclar los códigos de los dos individuos seleccionados para formar dos híbridos, a los que llamaremos nuevos individuos 7. Si cayó cruz llamamos a los individuos seleccionados nuevos individuos. 8. Por cada gen de cada nuevo individuo lanzar otra moneda al aire (con probabili- dad pm cae cara. 9. Si cae cara cambiar el gen en turno por otro aleatorio, cuyo valor este definido en el intervalo de codificación del problema. 10. Si cae cruz el gen permanece inalterado. 11. Incluir a los dos nuevos individuos en una nueva población. 12. Si la nueva población tiene ya N individuos, llamarla población actual, y regresar al paso 3, a menos que se cumpla alguna condición de terminación. 2Para el siguiente algoritmo se modifica principalmente, la forma en que se toman los códigos genéticos para poder utilizar en nuestro problema, el cual generalizaremos a un tipo de dato Numeric. 5
  • 6. 13. Si no regresar al paso 4. Dentro del algoritmo, cuando se hace referencia a lanzar una moneda al aire, se refiere a realizar un experimento de Bernoulli, es decir, aquel que solo se tiene dos eventos posible, uno con probabilidad p y otro con probabilidad 1-p. Nuestra condición de terminación en nuestro problema particular será el de la terminación del juego, es decir, cuando nuestro jugador haya “muerto” o cierre la ventana del juego. 4. Problema El juego desarrollado tendrá la siguiente temática: crear una serie de agentes que tienen como único objetivo perseguir a una presa (el usuario) y asi obtener diferentes tipos de comportamientos ante los posibles comportamientos de los agentes. Al inicio del juego se crearán 30 individuos con un conjunto de habilidades, y al trans- currir 7 segundos del juego, se tomarán los más aptos de acuerdo con la función fitness del algoritmo genético para así crear una nueva generación de individuos que conten- drán ciertas habilidades de sus antecesores. Con lo anterior se podrá obtener una nueva generación de individuos con una mayor probabilidad de ser mejor que sus padres, con ésto se “debería” ir aumentando las pro- babilidades de poder atrapar a su presa (esto será una selección natural, en la que solo tendrán descendencia aquellos que mostraron un mejor desempeño). Además, durante el juego, cada dos generaciones se creará un nuevo agente generado por el azar, un agente que puede tener mejores características o habilidades que los agentes que existen en ese momento, o tal vez las mismas características de la pobla- ción base. Así podemos obtener un agente más apto que cualquier otro (mutación de ganancia de función) o podría resultar en un agente con características inferiores a los de las generaciones que la preceden (mutación letal o deletérea). Lo anterior se realizará durante toda la ejecución del juego hasta el alcance del objetivo. 4.1. Etapas del proyecto El desarrollo del videojuego consta de tres etapas significativas para el desarrollo y aplicación de cada una. 1. La función crossover de la aplicación, que en este caso es la única al principio 2. Como el crossover no es suficiente, es necesario agregar una función de muta- ción. 3. La última etapa es de optimización, la cual es la más dificil de implementar, esta no se pudo desarrollar, dado que aún faltan muchas cosas por conocer respecto a coordinación entre agentes; ésta tiene mejores funciones de fitness(más específi- cas, claras, complejas) y estrategias y coordinación entre agentes. 6
  • 7. Figura 1: Ejecución del juego 7
  • 8. 5. Desarrollo En ésta sección se mostrará como se implemento el videojuego en C#. Primero se mostrará los atributos de los enemigos con base al diseño UML que se mos- trará enseguida: Y éste es el código de la implentación en C# para los atributos del agente: Figura 2: Enemigo //atributo de la generacion public float escala; //atributo de la generacion public float velocidad; //atributo de la generacion public float aceleracion; //atributo de la generacion public Color color; //atributo de la generacion public int ataq; Lo anterior es la parte de codificación del dominio de nuestro problema, lo cual esta- mos restrigiendo a las habilidades del agente, éstos nos servirán como genes para poder operar sobre ellos. Descripción de los colores. public static Color[] c = { Color.AliceBlue, Color.Azure, Color.YellowGreen, Color.Turquoise, Color.Violet, Color.Tomato, Color.SteelBlue, Color.Snow, Color.SkyBlue, Color.Peru, Color.PaleVioletRed, Color.Olive, Color.Navy, Color.MintCream, Color.Magenta, Color.Linen, Color.Lime, Color.Ivory, Color.Gold, Color.Crimson, 8
  • 9. Color.Bisque, Color.LightSalmon, Color.LightSlateGray, Color.MediumSeaGreen, Color.MidnightBlue, Color.SeaShell, Color.Silver }; Descripción del ataque: public void Update(GameTime theGameTime, Vector2 pos) { switch (ataq) { case 0: mueveteXY(); break; case 1: persigue(pos); break; case 2: mueveteX(); break; case 3: mueveteY(); break; case 4: nada(); break; default: break; } } En el código anterior se crean cinco tipos de comportamiento o ataque de los agentes, los cuales listaré enseguida: Perseguir jugador No se mueve 9
  • 10. Moverse sobre eje X Moverse sobre eje Y Moverse sobre XY Lo siguiente a mostrar es la función prefitness, pero antes de ello es necesario explicar en que consiste. La función prefitness lo que hace es que, antes de que uun agente pueda ser evaluado por la función fitness tiene necesariamente que pasar por un pre-fitness, en el cual se requiere que el agente haya sobrevivido los 7 segundos antes de poder ser evaluado en el fitness. Un agente es eliminado si: Se sale de la pantalla. Colisiona con el jugador. Ya que se tiene esto ahora es pasarlo por una función fitness, para volverlo candidato a ser parte de la población base para entrar dentro del algoritmo genético. En el siguiente porción de código se ve de manera sencilla la función fitness //paso de los elementos por la función fitness if(enemigos.ElementAt(i).fitness(p.Position) >550) { enemigos.RemoveAt(i); ... ... } //Función fitness public float fitness(Vector2 pos) { return Vector2.Distance(Position, pos); } Como se vé, la función fitness solo pide una distancia menor de 550 pixeles de dis- tancia hacia el jugador, si esto no se cumple cuando han transcurrido 7 segundos(una generación), el agente es eliminado del juego. Ya que hemos mostrado esencialmente las características propias del enemigo, es mo- mento de mostrar las caractetísticas del usuario: Figura 3: Usuario 10
  • 11. Controlado por humano 5 vidas disponibles Desplazamiento X-Y (7 pixeles) La implementación para dar el comportamiento deseado del usuario es la siguiente: public void Update(GameTime theGameTime) { KeyboardState aCurrentKeyboardState = Keyboard.GetState(); if (aCurrentKeyboardState.IsKeyDown(Keys.Left) == true){ Position.X -= 7; } else if (aCurrentKeyboardState.IsKeyDown(Keys.Right) == true) { Position.X += 7; } if (aCurrentKeyboardState.IsKeyDown(Keys.Up) == true) { Position.Y -= 7; } else if (aCurrentKeyboardState.IsKeyDown(Keys.Down) == true) { Position.Y += 7; } inScreen(); } 5.1. Crossover Ya se comentó sobre las características de los enemigos y el usuario, entonces, aho- ra se mostrará la forma de operar el crossover entre los individuos. Se describirá de la forma de descendencia normal, donde solo los que cumplan con la función fitness serán conservados y podrán tener descendencia. Éstos podrán tener algunas características en especial. 11
  • 12. if(generacion % 500 == 0) { for (byte i = 0; i < 10; i++) { enemigos.Add(new Enemigo( enemigos.ElementAt( r1.Next(enemigos.Count)).Position+ new Vector2(30, 30), enemigos.ElementAt( r1.Next(enemigos.Count)).velocidad, enemigos.ElementAt( r1.Next(enemigos.Count)).aceleracion, enemigos.ElementAt( r1.Next(enemigos.Count)).color, imagen, enemigos.ElementAt( r1.Next(enemigos.Count)).escala, enemigos.ElementAt( r1.Next(enemigos.Count)).ataq)); } } La siguiente imagen se da de manera gráfica la forma de obtener el crossover. 5.2. Mutación Dado que ahora ya pasamos la parte del crossover, claramente se nota que no es su- ficiente para resolver nuestro problema. Tenemos a nuestros agentes que sobrevivan y pasen la función fitness tendrán descendencia, pero su descendencia tendrá solamente características de sus antecesores, entonces, ahí es donde entra una nueva de tratar de resolver nuestro problema; la solución dada es la mutación, la cual podrá darle ventaja o desventaja respecto a sus habilidades actuales, lo cual implica que, o bien gana me- jores aptitudes respecto a la población o solo empeora. Para esto analicemos varios escenarios: Inmóviles: Claramente estos agentes desaparecerán en la primera iteración del algoritmo, ya que estos no tendrán descendencia. Siguen una sola dirección: Éstos también se extinguirán ya que el usuario se puede mover en cualquier dirección y estos tendrán una distancia mayor, lo cual conllevará a no ser tomados en cuenta por el pre-fitness. Persiguen por toda la pantalla: Éstos agentes tendrán mayor probabilidad de dejar descendencia, ya que se estarán aproximando al usuario en mayor medida que los anteriores. 12
  • 14. Figura 5: fig: Juego Pero en el transcurso del juego, los agentes en su intento de alcanzar al usuario irán formando una fila. Entonces para el usuario solo le será suficiente utilizar las orillas para mantenerse a salvo. Ahora si el usuario es lo suficientemente ágil, entonces se podrían acercar a los agentes a una orilla y esperar el momento de la selección e ir tratando de ir al otro lado ocasionando la desaparición de todos. ¿Pero si el usuario es lo suficientemente hábil para ir desapareciendo a los que se mueven e ir dejando solo a los que están estáticos? Entonces, es ahí cuando se implementa la mutación para los agentes; la mutación es un proceso biológico que consiste en alterar la información genética de un ser vivo y que, por lo tanto, va a producir un cambio en sus caracteríticas, que se presenta de manera súbita y espontánea, y que se pueden transmitir a su descendencia. La mayo- ría de las ocasiones este tipo de mutaciones son maléficas para el ser vivo que tiene ésta mutación, pero hay ocasiones en que es benéfica cuando el ambiente en el que se desenvuelven, un claro ejemplo es el de la Biston betularia, o mariposa del abedul es un lepidóptero nocturno que durante el día descansa en las ramas o troncos de los árbo- les cubiertos de líquenes de color grisáceo. El color blanco sucio de las alas contribuye a que sean confundidas con la base sobre la que se posan. Pero en los últimos 200 años 14
  • 15. el color de la gran mayoría se tornó grisáceo y oscuro, dado que los líquenes de los árboles en los que descansaban también se tornó oscuro y las convirtió a las maripo- sas de color claro en presas fáciles de los animales insectívoros. Entonces para nuestro proyecto es una buena idea el de implementar una mutación para poder cambiar ciertos aspectos que mantienen las generaciones en el transcurso del juego. De esta manera podriamos tener mejores características para un momento dado, pero que ya no funcionen para generaciones posteriores, o que características que no fun- cionaban para un momento dado no significa que no sirva tampoco en generaciones a posteriori, así que en la simulación vemos si sobreviven los más agresivos o los más cautos. Esto podría implicar en el éxito o fracaso de estos. Así que la solución de a este problemas que se están mostrando está basada en el re- troceso mismo. Igual que antes cuando se haga la selección y la descendencia de los agentes, se escogerán habilidades de estos, pero cada ciertas generaciones un descen- diente tendrá características que tal vez ya no se utilizaban. Como ejemplo supongamos que llegamos de nuevo al momento en que ya ninguno se mueve. Esta vez mientras uno espera que se termine el ciclo de vida de la generación y se aleja lo suficiente podría aparecer un agente que base su ataque en algún tipo de movimiento. Así lograría acer- carse lo suficiente al usuario para mantener a la especie con vida durante otra genera- ción y esperando que su descendencia conserve la habilidad de moverse. En el caso en que todos los agentes persigan, la creación de uno estático o que se mueva hacia el lado contrario de donde están los demás, también podría culminar en la conservación de los agentes. Claro todo esto se da por probabilidades y siempre existirá la probabilidad de que este agente no presente ninguna característica nueva, ocasionando así el fracaso y exterminio de todos. Lo siguiente muestra como se crea un agente con posibilidades de tener genes recesivos. if (generacion % 1000 == 0) { enemigos.Add(new Enemigo( new Vector2(r1.Next(900), r1.Next(600)), velocidad[r.Next(velocidad.Length)], aceleracion[r.Next(aceleracion.Length)], Enemigo.c[r1.Next(Enemigo.c.Length)], imagen, escala[r.Next(escala.Length)], r.Next(6))); Aquí finaliza la segunda etapa. Y todo lo que corresponde a código y partes implemen- tadas. 5.3. Optimización Las principales cosas que hacen falta para esto son varias. Entre las principales cosas se encuentran: Comunicación para los agentes. Estrategias entre los agentes. 15
  • 16. Entre otros problemas de naturaleza estadística. Para esto se propone lo siguiente: Para hacer la evaluación se darían 30 segundos, en los cuales se guardarían los recorridos del usuario y de los agentes. Se cambiarían las vidas por una barra de puntos, para poder tener el daño inflin- gido por los agentes al usuario. Añadir funciones estadísticas, para tener un mejor análisis de puntos de coli- sión, distribución sobre el área de juego, desempeño de los agentes dadas por las distancias obtenidas, etc. Como esto ya sale de alcance del diseño del juego solo se quedan por ahora como propuestas de mejoramiento. 6. Conclusiones Los algoritmos genéticos en particular y la computación evolutiva en general son de las lineas más prometedoras en el campo de la inteligencia artificial, ya que proponen mejores métodos para la resolución de problemas no algoritmicos, permitiendo que se haga una analogía con la naturaleza en la busqueda de soluciones probabilísticas. Bajo condiciones muy simples (mantener elitismo) se puede demostrar que los algorit- mos genéticos siempre convergen al óptimo de la soluciones propuestas. En este proyecto se puede notar que no siempre es fácil el simular procesos naturales como parece en un principio. Cuando se modelan problemas, no siempre es posible tomar todas las características que estan juego, solo es posible, actualmente, el tomar solo las necesarias para tener mejores restricciones y aproximaciones para resolver el problema. Nuestro agentes en un principio solo eran entidades monótonas que facilmente podría- mos eliminarlas, entonces, para resolver éste problema fue necesario meter los concep- tos de mutación y evolución, lo cual lleva a tener agentes con características distintas en cada paso de la ejecución, introduciendo una especie de “efecto caótico” para poder así tener una mejor dificultad en contra del usuario. Cuando se aplican los conceptos antes dichos, los agentes tienden a tener leves mejo- rías conforme avanzan en las generaciones. Al tratar de meter una capacidad de optimización para nuestro programa, se puede no- tar que la complejidad para desarrollarse es cada vez mayor; pero los resultados crecen para tener mejores capacidades en el desempeño de los agentes. Por lo que los algoritmos genéticos representan una alternativa de bajo costo para la resolución de diversos problemas. Los algoritmos genéticos representan una forma de tener mejores modelos para el diseño de solución de diversos problemas no solo para nuestro caso particular que es el desarrollar un videojuego sino para problemas de dis- tinta índole que requieran que los datos no se mantengan estáticos y evolucionen en el tiempo sin necesidad de observalos de manera constante. 16
  • 17. Referencias [1] Wikipedia (Videojuegos) http://es.wikipedia.org/wiki/Videojuegos [2] Gamers (articulo “La nueva narrativa de los videojuegos”). Revista. Marzo 2009. [3] Wikipedia (Inteligencia Artificial). http://es.wikipedia.org/wiki/inteligencia_artificial [4] Game Design Workshop. Tracy Fulleron, Christopher Swain, Steven Hoffman. CMP Books. 2005. [5] Wikipedia (Algoritmos Genéticos). http://es.wikipedia.org/wiki/Algoritmos_genéticos [6] Algoritmos Genéticos. Ángel Kuri Morales, José Galaviz Casas. Fondo de Cultu- ra Económica. 2002. [7] Adaptation In Natural And Artificial Systems, Holland J. H., 2a. edición, MIT Press, 1992. [8] Genetic Algorithms In Search, Optimization And Machine Learning, Goldberg D., Addison Wesley, 1989. [9] ALGORITMOS GENÉTICOS: ALGUNOS RESULTADOS DE CONVERGEN- CIA. Mario Alberto Villalobos Arias Departamento de Matemáticas Centro de Investigación y de Estudios Avanzados de I.P.N. http://semana.mat.uson.mx/Memorias/villalobos.pdf 17