Sociabilidad y Reactividad
Como ya hemos comentado anteriormente, se pueden formar equipos de bots que combaten conjuntamente. En el siguiente vídeo vemos como un bot se encarga de localizar a los enemigos y mandar la información al otro bot que se encarga de disparar.
Con este otro vídeo se demuestra que los bots, como buenos agents que son, pueden reaccionar ante cambios del entorno y adaptarse a él. En concreto vemos como el bot Aleph percibe cuando hay más de un rival en el campo de batalla, mientras que su rival Dookious sólo está preparado para batallas 1 contra 1. Mientras Dookius mantiene su radar orientado a un solo bot el de Aleph controla a todos sus rivales y gracias a ello logra mantenerse con vida.
Equipos en Robocode
Juego en equipo
En Robocode un equipo es una colección de robots que trabajan juntos para derrotar al enemigo. Los robots deben extender la clase TeamRobot para proporcionar la comunicación entre ellos, pues esta clase contiene los métodos para enviar y recibir mensajes entre robots, de forma similar a la clase Agent de Jade, tal y como habíamos visto en el tema de Comunicación en Jade. Es posible enviar mensajes de difusión (broadcast) o mensajes directos. Un mensaje enviado como mensaje de difusión llega a todos los robots de un equipo (estos mensajes se enviarían con el método broadcastMessage), mientras que los mensajes directos llegan a un solo compañero de equipo (y se enviarían con el método sendMessage). La clase TeamRobot también permite comprobar si otro robot es un compañero de equipo o no mediante el método isTeammate y para tratar los mensajes entrantes tenemos los métodos onMessageReceived y getMessageEvents.
Un equipo en Robocode tiene un líder. El primer robot agregado al equipo automáticamente se convierte en líder del equipo. El líder consigue una prima (bonus) en la energía de 100 puntos, dando por resultado un total de 200 puntos de energía. Robocode también proporciona la posibilidad de usar droides, que son robots normales con 20 puntos más de energía y ningún radar. Los droides, por supuesto, sólo funcionarán en un juego basado en equipo, donde confían en los robots con radar para obtener información sobre lo que está sucediendo en el campo de batalla y estarán en serios apuros si los compañeros de equipo con radar son matados.
Para crear un droide basta con implementar la interfaz Droid. La cual carece de atributos y métodos.
Para crear un equipo hay que ir a la opción Robot->Team->Create Team del menú de Robocode y se mostrará la ventana de diálogo que se ve en la siguiente figura. En la que se pueden añadir robots que estén disponibles en cualquier paquete al nuevo equipo.
Figura 1. Ventana de diálogo para la creación de un equipo
Modelos de equipo
El único sensor del cual un robot en Robocode puede conseguir información sobre el entorno, es el radar. Pero puesto que el radar tiene un rango y campo visual limitados, es imposible que un robot sepa todo sobre el entorno de una vez. Por lo tanto mantener un modelo del mundo con la información recopilada por todos los robots es una ventaja.
Básicamente, dos métodos distintos se pueden utilizar en Robocode al luchar en equipos:
Con coordinación central: Un robot mirará el mundo usando la visión acumulada de su radar propio y el de todos sus compañeros de equipo, calculará algún plan a ejecutar y entonces dirá a los otros robots de su equipo qué hacer.
Las desventajas de un mecanismo centralizado de control son:
- Habrá un mayor retardo desde que la información se recoge hasta que las acciones, basadas en esa información, se realizan. Esto es porque los mensajes enviados en la ronda x no llegan hasta la ronda x + 1.
- Si matan al líder, no habrá nadie para dar las órdenes y, por tanto, los otros robots se vuelven inútiles, porque no sabrán qué hacer.
Habría que decidir en qué nivel debe repartir el líder órdenes. Podría decir a cada robot qué hacer en el nivel más bajo, por ejemplo: “go forward 100, turn x degrees right, fire with power p“. O las órdenes podrían ser más generales, como “defend a certain area, follow a robot, attack “. Si se elige un modelo basado en órdenes generales, el líder podría asignar distintos roles a los robots del equipo. Los roles podrían ser por ejemplo atacante, recolector de información, o protector. Si la coordinación es hecha al nivel más bajo, el líder podrá realizar una estrategia exactamente tal y como la planeó, pues el líder tiene control total sobre todos los robots en el equipo.
Sin coordinación central: Cada robot tiene su propio modelo del mundo y puede decidir qué hacer basándose en ese modelo. Se aumenta la comunicación del equipo porque los robots deben comunicar la información recogida a todos los compañeros de equipo puesto que todos deben mantener un modelo del mundo propio. Este acercamiento tiene la ventaja de que no hay ningún “enlace débil“, lo que significa que si uno de los robots muere, los otros continuarán funcionando como antes. Otra ventaja cuando no se tiene coordinación centralizada es que un robot puede reaccionar inmediatamente cuando hay obstáculos inesperados, porque no tiene que comunicarse con el líder para recibir instrucciones de qué hacer.
Sin coordinación central, los roles podrían también ser utilizados. Los robots podrían mirar a los otros robots del equipo y calcular qué papeles han tomado y después decidir qué papel juegan ellos mismos.
Estrategias de ataque
Hay varias formas de elegir que objetivo atacar. Una forma es simplemente elegir el blanco más cercano y atacarlo. Esto tiene la desventaja de que todos los robots en el equipo podrían terminar eligiendo a enemigos distintos para atacar y, por consiguiente, siendo matados porque los robots “se olvidaron” de utilizar su comportamiento de equipo. Quizás la batalla habría podido ser ganada si algunos de los robots hubieran elegido el mismo blanco y atacado al enemigo en equipo. Por tanto, la pregunta sería ¿cómo deben decidir los robots a qué enemigo atacar? Una forma es basar la decisión en experiencias anteriores de situaciones que se parecen a la que afronta el equipo actualmente. Cuando un robot elige una blanco dice a los otros robots qué blanco ha elegido. Con esta información los otros robots podrán decidir si deben o no atacar al mismo robot. Un ejemplo: Si un robot compañero elige a un enemigo con poca energía que esté a cierta cantidad de píxeles lejos de ti, debes comprobar si se ha experimentado una situación similar antes. Si es así, ¿cuál fue el resultado de esta situación previamente experimentada? Si el resultado era bueno debes actuar como entonces.
Otra estrategia es hacer que el robot que está decidiendo pregunte al equipo si cualquier robot le puede asistir para atacar a un enemigo. Si alguien responde, el robot elige de qué robots desea recibir ayuda.
Para crear esta entrada hemos tomado información de los siguientes sitios:
- http://anteater.adsl.dk/projects/dat3.pdf
- http://www-128.ibm.com/developerworks/library/j-robocode2/
Un bot de robocode SI es un AGENTE
Tras el último post hemos visto que un robot desarrollado para robocode puede ser inteligente, pero… ¿es un agente inteligente?
Por este motivo, si queremos decir que un robot de robocode es un agente deberemos comprobar si cumple las características de este.
Definición sencilla:
En primer lugar podemos tomar una de las definiciones más sencillas de un agente, propuesta por Russelly Norvig, 1995 y que dice: “Un agente es cualquier cosa que pueda verse como agente percibiendo su entorno a través de sensores y actuando sobre el entorno a través de efectores”. Robocode cumple esta definición ya que estamos seguros de que percibe su entorno, aunque sin sensores propiamente dichos, bot de robocode percibe la situación de sus contrincantes además de los impactos recibidos y las dimensiones y muros del campo de batalla, por lo que está claro que percibe su entorno.
Otra definición posible es la dada por Hayes-Roth: “Los agentes inteligentes continuamente ejecutan tres funciones: perciben las condiciones dinámicas del entorno, actúan para afectar condiciones en el entorno, y razonan para interpretar percepciones, resolver problemas, trazar inferencias, y determinar acciones”. Otra vez recalcamos que los agentes perciben su entorno y ya se ha comentado anteriormente que un bot de robocode responde a este requerimiento, además también un bot puede disparar o esquivar disparos por lo que afecta a las condiciones del entorno. En cierto modo también podemos considerar que razonan ya que deciden cuando y como disparar así como a donde desplazarse y mediante que movimientos. En cuanto a las inferencias, dependerá de la implementación de cada bot, estas pueden ser más o menos “inteligentes”.
Todas estas definiciones están bien, pero en realidad podemos decir que un sistema informático es un agente cuanto cumple las siguientes características:
- Autonomía: Capacidad para actuar independientemente, sin intervención humana directa o de otros agentes. Un bot robocode cumple esta característica, ya que toma decisiones por sí mismo.
- Reactividad: Percibe el entorno en el que está inmerso y responde de manera oportuna a cambios que tienen lugar en él. Esto ya está claramente justificado en lo dicho anteriormente.
- Proactividad: Tiene que tener un carácter emprendedor y tomar la iniciativa para actuar guiado por los objetivos… el objetivo de uno de estos bots es “destroy de rest!!!” y para ello localiza a los contrincantes y DISPARA!!!
- Sociabilidad: Capacidad de interaccionar con otros agentes (incluso humanos) utilizando alguna clase de lenguaje de comunicación de agentes, y quizás cooperar en la ejecución de tareas. Existes implementaciones de bots que permiten realizar ataques a otros bots en grupo, es decir se pueden formar equipos d bots y realizar una lucha “colectiva”, es la guerra!!
Bueno, tras esto parece que queda claro que un bot de robocode, después de todo, si es un agente
. Las definiciones de agentes de los distintos autores han sido tomadas de los apuntes de clase de Pedro Cuesta Morales, de la asignatura Sistemas Multiagente, del 5º curso de Ingeniería Informática (UVIGO).
Inteligencia artificial y Robocode
Para conseguir un robot que pueda acabar destruyendo a todos los demás podemos intentar utilizar técnicas avanzadas de inteligencia artificial. En este post vamos a tratar de explicar la utilización de programación genética, dando unos pasos para tratar de construir un robot mediante esta técnica.
El primer paso es saber que es eso de programación genética. Se podría decir que es una forma de programar en la que partimos de programas simples, seleccionamos los mejores o cogemos las mejores características de cada uno y las mezclamos. Para conseguir un programa final mejor. Sería utilizar la teoría de la evolución donde el más fuerte sobrevive en programas y en este caso en robots.
Vamos ahora con unos pasos para realizar esto en robocode
1. Representación del genoma.
Como vamos a guardar las características que determinan como se comporta nuestro robot. Para después poder realizar la evolución.
2. Seleccionar el mejor
Para seleccionar los mejores robots podemos enfrentarlos con los propios robots que nos ofrece robocode o con los que encontramos en los repositorios que existen en la Web como ya os mencionamos.
Podemos simular diferentes escenarios donde nuestro robot puede enfrentarse a más de un rival o contrincantes que se comporten de diferente manera. Según el tiempo que se disponga y lo que queramos conseguir.
3. Evolución
Una vez que tenemos a los mejores robots, los que producen mejores resultados tenemos que combinar su genoma.
En otros post quizás trataremos de profundizar con mayor detalle en este tema, pero sobretodo queremos mostrar que robocode es una buena herramienta y divertida, para aprender a programar en Java y incluso útil para aprender algunas técnicas de inteligencia artificial.
Si queréis saber un poco más sobre inteligencia artificial visitad este blog sobre aprendizaje y agentes software
-
Archivos
- Mayo de 2007 (4)
- Abril de 2007 (3)
- Marzo de 2007 (2)
-
Categorías
-
RSS
Subscripciones RSS
RSS de los Comentarios
