Práctica Robocode Inteligencia en Redes de Comunicaciones Carlos Rubio Prieto - 100025017 Juan Santaella Vallejo - 100025044 1. Introducción En esta práctica se nos plantea el diseño y la implementación de un robot que sea capaz de ganar al resto de robots, es decir, que no encontramos ante el punto de desarrollo de agentes inteligentes, como sistemas autónomos dotados de ciertas capacidades. Todo esto se desarrolla bajo un entorno de simulación de guerras de robots, llamado Robocode. En el que nuestro tanque debe estar programado en Java para poder pelear en el campo de batalla contra tanques programados por otros jugadores, ganando el último que quede vivo. Al comienzo del juego se empieza con una determinada vida, que se mide en energía que posee el tanque y de ahí en adelante va variando la energía y mueres cuando te quedas sin energía. Como se ve las causas de la variación de la energía son muy importantes así que vamos a entrar un poco en ello para comprender posteriormente mejor el desarrollo de nuestro robot. Las variaciones de la energía se deben a las siguientes situaciones: • • • • • • Al producir un disparo, cuando se dispara se te penaliza quitándote una determinada energía dependiendo de cuanta energía hayas empleado en el disparo. Chocarte contra un robot. Si durante el transcurso de la batalla te chocas con algún robot pierdes una cierta cantidad de energía. Recibir un impacto. Si eres dado por una bala (enemiga o amiga) se quita una cantidad importante de energía. Esta es la mayor penalización que se tiene. Utilización intensiva del radar. Si pasa mucho tiempo y no se produce ninguna acción se sufre una penalización de energía disminuyendo ésta según transcurre el tiempo. Si una bala tuya acierta sobre un tanque enemigo se te suma una cantidad de energía. El escenario de batallas que se nos plantea, en nuestra competición interna es de tres tipos: a) Uno contra uno: En este tipo de contienda deberemos enfrentarnos sólo a un único tanque oponente y destruirlo antes de que nos destruya él. b) Mele: Todos contra todos, en esta situación estamos rodeados de enemigos y mis enemigos son enemigos del resto de los enemigos, esta es una situación de la que nos deberemos aprovechar. c) Lucha de equipos: Ahora se tendrá que trabajar en colaboración con otros tanques para destruir a uno o varios tanques enemigos. En nuestro caso va a ser otro equipo formado por 5 tanques. Ya que conocemos el escenario en el que tenemos que desarrollar y los tipos de batalla en los que vamos a luchar estamos en condiciones de pasar al siguiente punto que va a ser el diseño de nuestros tanques. 2. Proceso de Diseño e Implementación Para diseñar nuestros tanques partimos de una idea general, que la historia nos ha demostrado en infinitas ocasiones, la adaptatividad. Realmente como se puede de ver en los campos de batalla o en la naturaleza (que se puede entender como la lucha por la supervivencia) gana siempre el que esta mejor adaptado. Un individuo que esté adaptado a la nieve no debería tener ningún problema de encontrar alimento y soportar temperaturas bajas, sobreviviendo sin problemas. Como nos encontramos ante una situación de incertidumbre, ya que no sabemos como va a ser nuestro contrincante no sabemos como debemos estar adaptados, siguiendo con el ejemplo de la naturaleza no se si voy a vivir en la nieve o en el desierto, ya que puede que mi contrincante me evite o vaya a un enfrentamiento directo para el cual yo no estoy preparado. Lo primero que cabría pensar es estar preparado para todo, pero estando preparado para todo puedes fácilmente caer en no estar preparado para nada y un enemigo bien preparado en un determinando elemento nos podría derrotar con cierta facilidad. Así que nuestra idea fue desarrollar distintas estrategias, para “la lucha en nieve” y para la “lucha en el desierto” e ir cambiando a ellas según la situación que nos encontráramos. Evidentemente el desarrollo de una multitud de estrategia es una cantidad ingente de trabajo, así que lo que hicimos fue aprovechar el código ya escrito en foros de Robocode1 y desarrollar una estrategia de control que establezca cuál es el escenario en que nos encontramos, haciendo evaluaciones periódicas o en situaciones que consideremos que debemos de cambiar. Viendo la idea fundamental sobre la que hemos intentado desarrollar nuestros robots vamos a pasar a ver como la podemos implementar en cada caso y los problemas que nos hemos encontrado al intentar desarrollarla. 2.1 Lucha Uno vs. Uno y Mele: Dr. Jekyll and Mr. Hyde Como el titulo de la novela, vamos a tener diferentes personalidades, pero a diferencia de ésta en todas ellas trataremos de destruir a nuestros enemigos, aunque en una de las personalidades de una forma más activa (Mr. Hyde) y en otra estaremos más preocupados en que no nos destruyan (Dr. Jackie). Tendremos una estrategia de control que nos va a ir diciendo qué personalidad debemos de trabajar y si en esa personalidad no estamos cómodos (están apunto de matarnos) cambiaremos de personalidad. La idea es ir pasando por una serie de estados (distintas personalidades) el paso de estados esta regido por una estrategia de control que utiliza unas reglas para pasar entre personalidades hasta llegar al estado final que es la victoria La idea inicial era haber tenido tres o cuatro personalidades, y la estrategia de control haber tenido las siguientes variables: • • • • • Energía que tuviéramos(vida), Número de oponentes que hubiera en la batalla. Disparos acertados Disparos fallados Disparos recibidos. Empezar con una personalidad medianamente ofensiva ya que empezamos con bastante vida y según estos datos variar a una más ofensiva u otra más defensiva según como estuviéramos nosotros de energía. También habíamos pensado utilizar algún método de entrenamiento para hallar los umbrales del algoritmo de evaluación ya que Robocode te da estadísticas y tiene ejemplos de estrategias muy puras donde se puede evaluar tu robot. El diagrama de flujo sería del estilo del siguiente: INICIO Nº enemigos >2? OnRobotDeathEvent NO SI Ejecutar experto en Melé T segundos OnHitByBulletEvent Ejecutar experto tirador T segundos ¿Energía ha decrecido? SI Ejecutar experto evitador T segundos NO Ejecutar experto perseguidor T segundos Para realizar esto nos hemos encontrado ante dos grandes problemas, el primero fue que al intentar adaptar los códigos de distintos robots hemos tenido que rechazar muchos candidatos porque no podíamos juntarlos o al juntarlos daban muchos problemas que solo podíamos solucionar con grandes dificultades. Este problema ha derivado en el segundo: nos hemos quedado sin tiempo y lo peor ha sido que acuciaba el primer problema ya que no podíamos dedicar más tiempo adaptando el código o mejorando el algoritmo de evaluación. Así que se ha quedado en este algoritmo de evaluación: INICIO OnHitByBulletEvent SI ¿Energía ha decrecido? Ejecutar experto evitador T segundos Dr. Jekyll NO OnScannedRobotEvent Ejecutar experto perseguidor T segundos Mr. Hyde Se evalúa cada cierto tiempo o si la situación de vida corre peligro o si estamos en una situación muy buena para entrar en una confrontación directa. En este último caso si estamos en un estado defensivo cambiamos a ofensivo. Así que tenemos que decidir entre dos estados: • Mr. Hyde Es una estrategia de ariete, que es la más agresiva que hay. Consiste en ir contra el robot enemigo o perseguirle en su caso. De esta manera es muy difícil fallar, disparando con toda la fuerza que se puede (pierdes mas energía) pero también es fácil que te den, así que lo que se hace es entrar en este estado solo cuando tu nivel de energía es lo suficientemente bueno para en una confrontación directa tener muchas posibilidades de ganar. • Dr. Jekyll: Esta no es una estrategia puramente defensiva (a estas se la conocen como “evitadotes” y consiste en moverse perpendicularmente al cañón del enemigo). Es una estrategia un poco más agresiva de lo que nos hubiera gustado poner, tiene cálculo de trayectorias y también evita recibir muchos impactos al intentar moverse perpendicularmente al eje que nos une con el enemigo, aunque quizás lo haga demasiado cerca del enemigo. 2.2 Lucha de Equipos: Hormiguero La lucha de equipo, varía mucho con el caso anterior, ya que los robots no pueden hacer cosas que antes podían (los droides no pueden escanear por ejemplo) y tienen cosas nuevas como: • • Paso de mensajes. Mayor cantidad de energía. Aquí hemos optado por una búsqueda heurística, gracias a la experiencia que habíamos adquirido en la lucha en Melé intentando también aprovechar las nuevas oportunidades que nos dan el trabajar en equipo como: • • • Evitar que te den, cosa muy fácil cuando hay muchos tanques disparando. Moviéndote evitas que te disparen directamente. Estando quietos dispara mucho mejor. Nos basamos en la idea de un hormiguero o una colmena en la que hay una reina que es la que “manda” y un montón de hormigas que contribuyen a la comunidad. La reina, en nuestro caso, sólo tiene la misión de buscar enemigos y evitar morir. Para ello evita gastar energía disparando y evita que la den moviéndose constantemente. Cuando localiza un enemigo calcula la posición de dicho enemigo y se las pasa a sus hormigas obreras para que lo intenten eliminar. También en el caso de morir se lo comunica a sus súbditos. Las hormigas, lo primero que hacen es colocarse en una posición defensiva es decir al lado de las paredes para reducir el ángulo por donde pueden ser alcanzadas. Una vez allí esperan que la reina le comunique la posición de los enemigos y empiezan a disparar. En el caso de ser alcanzadas por un proyectil varían un poco su posición y si la reina llega a morir, empiezan a disparar aleatoriamente, pero nunca repiten la dirección del disparo, ya que gira el cañón un un ángulo no divisor de 360º, tratando en un intento desesperado de alcanzar al enemigo. 3 Conclusiones La principal conclusión que hemos llegado es la importancia de dar una respuesta adecuada a la situación. Para eso hay que evaluar periódicamente, poniendo sensores que nos avisen si estamos en una situación de alarma, eligiendo la respuesta que ofrecemos al entorno. Aprovechar el escenario. Por ejemplo en el caso de la Melé es mejor intentar pasar desapercibido yéndote a una esquina y espera a que el resto se mate para luego entrar ya en la batalla. Aquí nos volvemos a encontrar con una situación de evaluación y otra de decisión. En una situación colaborativa es fundamental una labor de coordinación, para evitar que se entorpezcan entre los miembros de un equipo, como que un tanque se encuentre en una trayectoria de tiro. 4 Bibliografía 1 http://www.robocoderepository.com 2 Apuntes de la asignatura.