Robocode y Agentes

Just another WordPress.com weblog

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.

mayo 24, 2007 Posted by | Uncategorized | Deja un comentario

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.

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:

 

mayo 16, 2007 Posted by | Uncategorized | Deja un comentario

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).

mayo 11, 2007 Posted by | Uncategorized | Deja un comentario

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

mayo 3, 2007 Posted by | Uncategorized | Deja un comentario

Física del juego

Para comprender mejor como funciona una batalla en Robocode hemos traducido las preguntas FAQ del wiki de robocode sobre las normas del juego.

¿Puedo disparar con energía más alta de 3 o más baja que 1?
La respuesta es no y sí. No puedes disparar con energía mayor que 3, y sí que puedes disparar con energía de hasta sólo 0.1. Si llamas una leña función (por ej. setFire) con un valor mayor que 3, Robocode lo ajustará a 3, y si lo llamas con una energía más bajo de 0.1 que lo ajustará a 0.1.

¿A que velocidad se mueve una bala?
Una bala viaja a una velocidad entre 11 y 19.7 dependiendo de la energía. Cuanto más energía mas lenta. La fórmula para calcularla es velocidad = 20-3*power

¿La velocidad del robot se suma a la velocidad de la bala?
No. La velocidad de la bala no es afectada por la velocidad del robot.

¿Cuál es el rango de alcance de una bala?
La bala no tiene ningún rango. No se para hasta que golpea un BOT o una pared.

Deseo disparar una bala cada turno, pero no puedo. ¿Por qué?
Cada vez que disparas se genera un cierto calor. Debes esperar hasta que está fresco para disparar. Si das una orden del fuego cuando tu arma está caliente, no hará nada. El calor generado por un tiro es 1 + (potencia de fuego/5). El arma se refresca en un índice de -0.1 por turno (nota que puedes cambiar esto el parámetro cuando creas la batalla, nadie lo hace generalmente). Significa que puedes disparar una bala cada 16 turnos.

¿Cuánto daño hace una bala?
Ver la pregunta siguiente.

¿Cómo gano o pierdo energía?
Pierdes energía cada vez que golpeas una pared, eres alcanzado por una bala enemiga, chocaste con un enemigo, o disparas tu arma. La cantidad de energía que pierdes por ser alcanzado es 4 * energía de la bala + 2 * máximo (energía de la bala – 1, 0). Por tanto la cantidad máxima es 16. Cuando disparas, pierdes una cantidad de energía igual a la energía de la bala disparada. Cuando una de tus balas golpea a enemigo, ganas una cierta energía (consigues 3 * energía de la bala). Cuando golpeaste a robot enemigo, tomas 0.6 daños. Cuando golpeas una pared, el robot (avanzado) tomará un daño del máximo (abs(velocidad) * 0.5 – 1, 0).

Algunas veces el robot está deshabilitado. ¿Qué sucede?
No puede matarse, cuando su energía cae a cero porque golpea una pared o dispara, tu robot se deshabilita. No podrá moverse ni disparar. Si eres bastante afortunado y alguna de tus balas golpea a enemigo, conseguirá un poco energía y se rehabilitará.

Estoy deshabilitado, pero mi energía es mayor que 0. ¿Por qué?
Llamaste getXXX () (por ejemplo la función getVelocity()) demasiadas veces en un turno. El límite es 10000 llamadas de función getXXX () por turno. Para evitar inhabilitarse en tales situaciones, puedes almacenar los valores dentro de variables para el uso futuro. Eso también será un poco más rápido.

¿Con qué velocidad me muevo?
Puedes moverse a una velocidad máxima de 8. ¿Puedes modificar tu velocidad máxima usando setMaxVelocity. Observa que el robot acelera siempre para alcanzar la velocidad máxima.

¿Cuánto acelero?
Aceleras en 1 por turno, y frenas 2 por turno. Por ejemplo, si te estás moviendo a una velocidad de 8 e inviertes tu dirección tus velocidades serán [6.4.2.0.1.2.3.4.5.6.7.8].

¿Con qué velocidad me doy vuelta?
Cuanto más rápido vas, más lento das vuelta. La fórmula para calcularla en grados (10 – 0.75 * abs (velocidad)).

¿Cuál es el tamaño de un robot en el mapa?
El tamaño de un robot es 36×36. Se modela pues como un cuadrado que no rota, así que siempre es igual sin importar su posición o rotación.

¿Cómo puedo detectar cuando un enemigo ha disparado?
No hay manera directa de detectar cuando un enemigo encendido, pero tú puede deducirlo supervisando la pérdida enemiga de energía. Una pérdida entre 0.1 y 3 significa generalmente que disparó una bala (puede haber otras razones, tales como ser alcanzado por un disparo o un golpe con la pared).

¿Cómo puedo detectar la posición y dirección de una bala enemiga?
No puedes. No hay manera de saberlo, directamente o indirectamente. Pero por supuesto, puedes conjeturar siempre…

¿A qué velocidad puedo dar vuelta a mi arma?
El arma gira 20 grados por turno.

¿Puedo saber la posición del arma enemiga?
No. Tampoco, puedes saber la posición del radar enemigo.

¿A que velocidad puedo dar vuelta a mi radar?
Gira a 45 grados por turno.

¿Puedo especificar la posición inicial de mi robot?
No. Los bots se ponen aleatoriamente en el campo de batalla al principio de cada ronda.

abril 29, 2007 Posted by | Uncategorized | Deja un comentario

La licencia de Robocode

En esta entrada vamos a cambiar la orientación de los últimos posts y hablaremos un poco sobre la licencia bajo la que se distribuye el código de robocode. Su licencia es la Common Public License (CPL) que se encuentra definida en la siguiente web:
http://www-128.ibm.com/developerworks/library/os-cpl.html

Es la licencia que usaba Eclipse hasta el 2004, pero decidieron cambiar e introducir unas mínimas modificaciones dando lugar a la Eclipse Public License.

Una cosa curiosa sobre la CPL es que siendo una licencia de software libre no es compatible con la GPL version 2 debido a diversas cláusulas sobre patentes que incluye, que son incompatibles con el punto 7 de esta última.

De la web de GNU (http://www.gnu.org/licenses/license-list.es.html):

Licencia Pública Común versión 1.0

Es una licencia de software libre pero es incompatible con la GPL porque tiene varios requisitos específicos que no están en la GPL.

Por ejemplo, requiere que se den ciertas licencias sobre las patentes, algo que la GPL no hace (no pensamos que esos requisitos sean intrínsecamente una mala idea, pero no obstante no son compatibles con la GNU GPL).

En el hilo de discusión sobre la GPLv3 permanece abierto sin respuesta un comentario sobre la compatibilidad de la misma con la CPL. Mientras la GPL versión 2 no lo es, Eben Moglen (Consejero General de la Fundación del Software Libre) ha afirmado en varias ocasiones que la GPLv3 podría serlo, ya que es muy interesante la protección contra posibles ataques de patentes que ofrece, muy similar también al de la licencia de la Mozilla Foundation.

Tal vez el mayor problema de la CPL es el hecho de que existe la posibilidad de coger el código de un programa bajo CPL, compilarlo y distribuir el binario bajo una licencia privativa, más allá de que pueda o no combinarse con código bajo licencia privativa.

abril 20, 2007 Posted by | Uncategorized | Deja un comentario

Building the best – destroy the rest!

Hasta ahora sólo hemos visto aspectos generales de robocode, pero quizás la pregunta que más nos ronda ahora es: “¿Qué tiene que ver robocode con los agentes inteligentes?” pues bien, resulta que como ya sabemos, cada uno de los robots están desarrollados en Java y además se comportan como un agente, en consecuencia, podemos decir que su programación es orientada a agentes.

La progamación de uno de estos agentes puede ser desde muy sencilla hasta complicadísima. Hemos encontrado un wiki en donde hay distintos ejemplos de robots implementados. Vemos que un bot puede avanzar, retroceder, girar el radar, la torreta, disparar… además en este wiki incluso explican distintas técnicas de movimiento, disparo, estrategias…

Pero claro, no vamos a ponernos a hablar de estrategias sin saber, ni siquiera cómo implementar un bot sencillo.

 

Podemos echar un vistazo a uno de los bots de ejemplo que trae incluido el código de robocode cuando lo descargamos.

import robocode.*;
/**
* MyFirstRobot - a sample robot by Mathew Nelson
*
* Moves in a seesaw motion, and spins the gun around at each end
*/
public class MyFirstRobot extends Robot {
/**
* MyFirstRobot’s run method - Seesaw
*/
public void run() {
while (true) {
ahead(100); // Move ahead 100
turnGunRight(360); // Spin gun around
back(100); // Move back 100
turnGunRight(360); // Spin gun around
}
}

/**
* Fire when we see a robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}

/**
* We were hit! Turn perpendicular to the bullet,
* so our seesaw might avoid a future shot.
*/
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 - e.getBearing());
}
}

Como vemos el requisito principal es que la clase que representa a nuestro robot debe implementar la clase robot y en consecuencia es imprescindible importar el paquete robocode.*

  • run()La clase robot de la que heredamos implementa la clase Runnable, por lo que nosotros deberemos implementar el método run(): Este método se estará ejecutando durante toda la vida del robot y llama a cuatro métodos:
    • ahead(100): Indicamos al robot quese mueva hacia delante las unidades indicadas, en este caso 100, el parámetro es un double, aunque en el ejemplo se le pase un entero. La llamada a este método no regresa hasta que se haya completado el desplazamiento, si en su camino se encuentra con un obstáculo (un muro u otro robot) el desplazamiento se dará por finalizado.
    • turnGunRight(360): Se rota el cañón hacia la derecha los grados especificados.
    • back(100): El robot se desplaza hacia atrás las unidades especificadas, al igual que antes en caso de colisión se dará por finalizado el desplazamiento. En esta secuencia concreta de instrucciones el robot regresará al punto inicial
    • turnGunRight(360): De nuevo se vuelve a rotar el cañón hacia la derecha 360 grados.
  • onScannedRobot(ScannedRobotEvent e): Este método también está en la interfaz robot. Se llama cuando el robot detecta a otro, debemos implementarlo si queremos ser informados de este evento –¡cosa recomendable!-; el método se llamará siempre que un robot se encuentre al alcance de nuestro radar.
  • onHitByBullet(HitByBulletEvent e): Método de la interfaz robot, que debemos implementar y que será llamado siempre que nuestro bot sea alcanzado por una bala. En este caso tras ser alcanzados:
    • turnLeft(90 – e.getBearing()): Giraremos a la izquierda 90 grados menos la posición de la vala, esta posición la obtendremos del método getBearing() de la clase HitByBullet.

Existen muchos más métodos que podemos implementar y utilizar para conseguir el mejor robot Build the best – destroy the rest!. Seguro que en siguientes posts descubriremos más.

abril 14, 2007 Posted by | Uncategorized | Deja un comentario

Instalación y presentación del entorno.

Para instalar el programa solo tenemos que hacer java –jar robocode-setup-1.2.6.

 

inst1.jpg

 

Si queremos cambiar el directorio de instalación solo tenemos que pulsar en la opción no e introducir el directorio deseador. Después basta seguir los sencillos pasos. Si no contamos con ningún editor el programa instalar su propio editor, aunque posteriormente podemos cambiarlo en la Option-Preferences-Development Options.

 

 

 

inst21.jpg


Una vez ejecutemos el programa nos encontramos un menú superior con las siguientes opciones:

 

barra1.jpg

 

 

En el menú battle tenemos las siguientes funciones:

New para iniciar nuevas batallas.

Open para abrir ficheros de batallas.

Save y Save as para guardar las batallas.

Exit para salir del programa.

 

En la opción robot tenemos el editor de robots, de equipos y la posibilidad de importar nuevos robots.

 

En options presenta las opciones preferentes donde podemos configurar todo lo referente a la configuración grafica y de sonido. También tenemos la función para ver el ranking de cómo van las batallas.

 

En la opción help tenemos el típico menú con preguntas frecuentes sobre el programa, la versión, los desarrolladores…

barra2.jpg

 

 

 

 

En la parte inferior tenemos un menú que nos permite controlar las batallas con opciones como stop, restart, replay, pause, next turn (para ir paso a paso) y un menú deslizante que nos permite controlar la velocidad en la que se desarrolla la lucha.

 

marzo 29, 2007 Posted by | Uncategorized | Deja un comentario

Primer post

Con este post inauguramos este blog dedicado a Robocode y Agentes. Robocode es un juego educacional de código abierto, creado por Matthew Nelson en 2001.

En este juego dos o más tanques controlados por programa se enfrentan hasta que sólo uno queda con vida (también se pueden enfrentar equipos de tanques). Los programas que dirigen los tanques están escritos usando el lenguaje de programación Java.

Si quieres probarlo en tu ordenador no tienes más que descargarte el programa desde la página oficial de robocode, al estar hecho totalmente en Java es multiplataforma, sólo teneis que tener instalada la máquina virtual de Java 5.0 para ejecutarlo. El programa trae algunos bots de ejemplo, aunque no son demasiado buenos. Si quereis ver una buena contienda, en la Wikipedia se enlazan varios bots que han ganado alguna competición. Podeis probar estos bots y también observar y modificar su código.

Para abrir boca os dejamos un vídeo donde podeis ver un a batalla entre dos tanques y otra con más contendientes.

marzo 20, 2007 Posted by | Uncategorized | Deja un comentario