Sie sind auf Seite 1von 7

SISTEMAS BASADOS EN CONOCIMIENTO: ROBOCODE

Javier Jiménez Dorado

100033052

jjdorado@ing.uc3m.es

RESUMEN

En este artículo vamos a tratar un sistema de representación del conocimiento sencillo. Para ello utilizaremos la plataforma gratuita Robocode [1] El objetivo del trabajo realizado es presentar un esquema de un diseño para un robot que, partiendo de un conocimiento aprendido más la información que va adquiriendo durante el combate, sea capaz de tomar decisiones de cual es la estrategia más conveniente a utilizar en un combate individual, no por equipos. Finalmente se mostrará la explicación de una versión reducida del esquema propuesto así como los resultados.

Categorías y descriptores de materia

I.2.4 Knowledge Representation Formalisms and Methods; I.2.9 Robotics

General Terms

Algoritmos, Desarrollo, Diseño y Teoria.

Keywords

Robocode, Decisiones, Estrategia, Conocimiento.

1. INTRODUCCION

Robocode es una plataforma pensada en un principio para aprender Java pero que se ha convertido en una forma fácil de aplicar conocimientos de Inteligencia Artificial. Para programar existen varios APIs [2]. Los robots que tienen tres partes o variables: Cañon, Radar y Cuerpo. Más información [1]-[4].

2. INTELIGENCIA DE REDES DE

COMUNICACIONES Y ROBOCODE

Hay varios campos de investigación entorno a Robocode en el campo de la Inteligencia Artificial, el conocimiento, el aprendizaje, etc. De hecho han sido ya varios los estudios realizados en otros años acerca de este tema:

- Evolución de robots por algoritmos genéticos.

-

Aprendizaje:

aprender

estrategias

mediante

la

experiencia.

Esta vez hemos querido centrarnos en cómo representar el conocimiento y cómo tomar decisiones en base a este conocimiento.

Rubén Gómez-Chacón Camuñas

100029696

rgomezch@ing.uc3m.es

Desde la perspectiva robótica nos tenemos que enfrentar al problema de la interacción con el medio de nuestro robot y posteriormente cómo llevar a cabo los movimientos y acciones que se han decidido realizar.

A continuación vamos a presentar una teoría de diseño y

construcción de robots con las bases ya presentadas. Al finalizar el artículo comentaremos la implementación final, los resultados y posibles mejoras para una revisión.

3. ELECCIÓN DE LA ESTRATEGIA:

DISEÑO.

3.1 Análisis del entorno

Como todo sistema que interacciona con el medio, que es lo que pretende ser nuestro robot, produce una serie de respuestas ante

un conjunto de estímulos de acuerdo a un conocimiento que le viene dado por la experiencia o reglas aprendidas.

En esta primera fase, análisis del entorno, el robot se encarga de

recibir los estímulos. La forma que tiene de hacerlo es mediante ciertos sensores que a efectos prácticos se traducirán en eventos.

El

sensor básico es el radar que le permite conocer la posición de

sus

contrincantes pero también tiene acceso a información pública

del

sistema como son el número de contrincantes que quedan y a

información privada como la energía que todavía posee. También con una serie de razonamientos , deducciones y aproximaciones es posible obtener otra información implícita, como puede ser la tasa de disparo y de aciertos del contrincante.

3.1.1 Caracterización de los robots

Conocidos los sensores del robot veamos las variables del entorno que más información nos dan:

- General:

o Número de participantes

- Propia:

o

Energía

o

Tasa de aciertos

- Contrincante:

o Disparos

Frecuencia

Tasa de aciertos

o Patrón de movimiento

Tipo

o Energía

La información que podemos extraer del contrincante se podría codificar en las siguientes tablas. Notar que dichas tablas y conclusiones están, por otro lado, sujetas a la visión del diseñador. Tener en cuenta que uno puede concretar todo lo que quiera. Como en todo agrupamiento hay que llegar a un compromiso:

Tabla 1: Conocimiento sobre Energía.

Energía

Conclusión

E < 15%

Agonizando

E >= 15%

Saludable

Tabla 2: Conocimiento sobre Disparos.

Frecuenci

Tasa Aciertos

Conclusión

a

Alta

Alta

Experto

Alta

Baja

Insensato

Baja

Alta

Precavido

Baja

Baja

Novato

Tabla 3: Conocimiento sobre Movimiento

Velocidad

Choques

Muro

Lineal

Curvilíneo

Conclusión

 

s

V>0

SI

-

-

-

Arrollador

V=2

NO

NO

SI

NO

Lineal

 

largo

V=1

NO

NO

SI

NO

Lineal

 

corto

V>0

-

SI

-

-

Muros

V=2

NO

NO

NO

SI

Elipse

 

largo

V=1

NO

NO

NO

SI

Elipse

 

corto

V=0

-

-

NO

NO

Estático

.

Gracias la caracterización del contrincante, no sólo vamos a poder elegir la mejor estrategia si no que, registrando los resultados de

los combates, también podemos realimentar nuestro sistema de tal manera que el robot aprendiera de su propia experiencia.

3.2 Diseño de la estrategia: Árbol de decisión

Para realizar el árbol de decisión y elegir la estrategia que vamos seguir nos vamos
Para realizar el árbol de decisión y elegir la estrategia que vamos
seguir nos vamos a basar en la siguiente dependencia:
Movimiento
Disparos

Figura 1: Relación Movimiento y Disparos.

Así según el enemigo se mueva nosotros dispararemos y viceversa. Además nos basaremos en la energía de ambos.

Esta relación no es dicotómica, es decir, hay puntos intermedios y distintas alternativas ante una misma situación. No obstante para simplificar el diseño vamos hacer relaciones directas.

3.2.1 Tipos de estrategias

Antes de nada introduzcamos los diferentes tipos de movimiento que están recogidos en [3]. Muchos de ellos han sido tenidos en cuenta en nuestro diseño:

LinearMovement – Movimiento en línea recta. Vulnerable al apuntamiento lineal [6].

Oscillators [7]– Movimiento en un conjunto de patrones que se repiten (aunque el período puede ser muy largo). Es vulnerable al PattherMatching [8].

CircleBots [9] – Se mueven en circulos. Son vulnerables a apuntamiento circular [10.

WallBots [11 – Se mueven a lo largo de los muros. Vulnerable a LinearTargeting, excepto cerca de las esquinas.

RamBots [12] – Se mueve hacia el enemigo. Vulnerable a la mayoría de los apuntamientos pero consigue bonus extras por ram (arrollar).

StopAndGo [13] – Reacciona ante fuego enemigo. Es efectivo frente a apuntamiento lineal y circular pero es vulnerable ante PatternMatching y GuessFactorTargeting [14].

Como vemos, junto a cada movimiento se comenta el método de

apuntamiento más efectivo o aquel al que es vulnerable. He aquí la relación directa ya comentada entre movimiento y apuntamiento.

Además de los modos de apuntamiento ya mencionados existen otros muchos, algunos de ellos bastante más complejos y sofisticados que los vistos [15].

Tabla 4: Relación Estrategias de Movimiento y Apuntamiento

Movimiento

Apuntamiento

Lineal

Lineal

Oscilante

PatternMatchin

g

Circular

Circular

Muros

Lineal

Arrollador

StopAndGo

Indiferente

PatternMatchin

g

Con todo hemos podido crear la siguiente tabla que nos servirá para ajustar nuestro patrón del movimiento a su patrón de disparo así como para apuntarle de acuerdo al tipo de movimiento que posea.

3.2.2 Árbol de decisión

Ya estamos listos para crearnos nuestros árboles de decisión. En Java resulta muy sencillo la creación de estos gracias a las estructuras de control if-else y switch.

Vida Gano Pierdo Movimiento ARROLLAR Enemigo No Si Movimiento ESCAPA Propio Linea Circular l Tasa
Vida
Gano
Pierdo
Movimiento
ARROLLAR
Enemigo
No
Si
Movimiento
ESCAPA
Propio
Linea
Circular
l
Tasa Aciertos
Tasa Aciertos
Enemigo
Enemigo
Baja
Alta
Baja
Alta
Frecuencia
LIN
Frecuencia
CIR
Disparos
Disparos
Baja
Alta
Baja
Alta
CAMBIO
SIN
CAMBIO
SIN

Figura 2. Árbol decisión de mi movimiento

En la figura 2 vemos la secuencia de cuestiones que se tendría que plantear nuestro robot para ver si es bueno cambiar de movimiento o no.

En principio lo más sencillo es cambiar de lineal a circular aunque

puede ocurrir que nos convenga otra estrategia distinta como puede ser arrollar al contrario o escapar, que aunque no está considerada estrategia en la página de Robocode, hemos considerado conveniente huir del enemigo cuando estemos siendo arrollados porque es de esperar que nos quedemos sin energía.

Quieto / Arrollador Si No ACRIBILLAR
Quieto /
Arrollador
Si
No
ACRIBILLAR

Muros

No Si Lineal LINEAL Si No LINEAL Circular Si No CIRCULAR PATTERN MATCHING
No
Si
Lineal
LINEAL
Si
No
LINEAL
Circular
Si
No
CIRCULAR
PATTERN
MATCHING

Figura 3. Árbol decisión de mi apuntamiento

Mediante la 3 figura somos capaces de ajustar nuestro robot de tal manera que apunte mejor para que no pierda energía al fallar.

3.3 Ejecución de la estrategia

Una vez analizado el entorno y contrastado con las reglas que tenemos aprendidas viene la hora de ejecutar la estrategia y tomar nota de los resultados.

El diseño óptimo de este tipo de robots debería permitir la actualización de la estrategia sobre la marcha. En principio el caso más sencillo será aquel en el que el contrincante sólo tenga un movimiento predefinido por lo que una vez que adivinemos sus patrones de comportamiento no tendremos que modificar el nuestro más que una vez.

Sin embargo existe cada vez gran cantidad de robots que poseen un patrón de comportamiento variable y/o adaptable como lo es el nuestro. Con este tipo de enemigos el combate se convierte en un duelo de titanes en el sentido de que son poderosos y por otro lado en un duelo de ajedrez, en el que cada contrincante estudia a su enemigo. En estos casos no es suficiente la estrategia de observar, decidir y ejecutar, si no que es necesario una estrategia por defecto ya definida que debe ser lo suficientemente buena.

Otra opción para el caso de lucha contra robots que cambian de modo es ir alternando las distintas estrategias lo más aleatoriamente posible para despistar al enemigo.

3.3.1

Realimentación

Un buen robot tomará nota del trascurso de la batalla y de los resultados obtenidos. El objetivo de estos registros son varios:

- Por un lado es importante chequear si el robot está,

primero, deduciendo el comportamiento del enemigo de

forma correcta y segundo, si está tomando las decisiones correctamente.

- Si está tomando las decisiones tal y como se le ha

enseñado será bueno comprobar si nuestros criterios han sido correctos. De esta forma veremos si nuestras estrategias de movimiento son capaces de disminuir su tasa de acierto y si estamos prediciendo sin mucho error la posición del enemigo a la hora de disparar.

Estos registros y la información que podemos extraer de ellos deben servir para realimentar nuestro sistema, en este caso el robot. La forma de hacerlo es distinta según sea la información:

- Si hay fallos de programación debemos introducir cambios de forma manual.

- Si por el contrario parece ser que la estrategia elegida no funciona correctamente contra un determinado

contrincante, el robot debe ser capaz de darse cuenta de este hecho y cambiar de estrategia en la siguiente ronda.

Notar que un combate, por defecto, está compuesto por 10 rondas. La forma de pasar información de una ronda a otra es mediante un fichero log que podemos crear manualmente o utilizando funciones Java contenidas en el API de robocode como getDataFile [2].

4. RESULTADO DEL DISEÑO: SMARTY

Finalmente, después de haber diseñado esquemáticamente la vida de un robot, realizamos una implementación sencilla. Al proyecto le hemos denominado Smarty.

4.1 Limitaciones

La primera gran limintación que nos encontramos fue el tiempo y los conocimientos. Esto se debe a que implementar las estrategias descritas en el diseño es más complejo de lo que a priori se puede suponer. Si bien una estrategia en sí ya es costoso era inviable implementar desde cero todas las estrategias.

Por este motivo y sin faltar a los derechos de la propiedad buscamos código en el repositorio de Robocode [3] así como en las prácticas de otros años en la página web de la asignatura Inteligencia de Redes de Comunicaciones [16].

En el repositorio de Robocode existe una base de datos de robots, clasificados por tipos, que se pueden descargar. Sin embargo no son muchos los que proporcionan el código fuente, siendo complicado reutilizar dicho código.

En cuanto a los trabajos de años anteriores si bien algunos tienen un movimiento sofisticado y ciertos métodos de predicción nos fue complicado catalogar los robots.

En definitiva, no ha sido posible encontrar robots con las características deseadas y no hemos tenido tiempo suficiente para diseñarlos desde cero.

Es por ello que nos hemos basado en algunos de estos pero que no son precisamente característicos de su grupo.

En realidad la versión última del robot Smarty no llega tampoco a implementar un estudio avanzado del movimiento del robot enemigo y por tanto el método de disparos está sujeto al comportamiento de los robots usados para formar a Smarty.

No obstante este no debe suponer mayor problema porque lo interesante de este estudio es la capacidad de análisis y decisión que posee el robot Smarty.

4.2 Cerebro de Smarty

Como se sabe, los robots de robocode son una clase Java, que hereda la clase Robot o AdvancedRobot y que posee principalmente:

- método run() cuya ejecución no debe finalizar

- manejadores de eventos. Los eventos pueden ser estandares o personalizados. (ver la documentación

[3].

Nuestro robot hereda de la clase AdvancedRobot que permite realizar más funciones y complejas de una manera más eficiente.

Siguiendo con el diseño procedimos a crear el diagrama de flujo . Para ello teníamos dos opciones que se muestra en la figura 4.

ello teníamos dos opciones que se muestra en la figura 4. Figura 4. Diagrama de flujo

Figura 4. Diagrama de flujo

Como comentamos en el diseño el robot debe tener un comportamiento por defecto mientras toma las decisiones. Nosotros optamos por un comportamiento sencillo como es el de dar vueltas pequeñas mientras que disparaba al visualizar el obstáculo de forma sencilla. Este simple movimiento hace muy difícil ser alcanzado mientras nos da la posibilidad de estudiar sus movimientos.

Aclarar que la figura 4 representaría el esquema a seguir por un lado para la decisión de movimiento y por otro para decidir la forma de apuntar.

También comentar que es difícil separar físicamente en el código Java qué es parte de la observación, qué de la decisión y qué de la ejecución. Si bien primero y segundo son más confusos el tercero se ve claramente porque está formado principalmente de métodos de Robocode que representan acción. De todas formas intentaremos explicar lo mejor posible cómo ha sido la implementación.

4.2.1

Observación

¿Cómo observamos? Como ya se ha comentado gracias al radar podemos obtener objetos que nos facilitan cierta información. Por otro lado las balas son otro objeto que poseen información valiosa así como los eventos.

Para poder registrar toda la información que necesitamos nos valemos de los atributos. También podíamos haber hecho uso de otras clases que nos apoyaran pero optamos por no hacerlo.

Las únicas clases de apoyo que tenemos son los robots descargados aunque ellos sí que se apoyan en numerables clases y métodos para realizar las tareas.

Lo primero que hacemos es observar los niveles de vida del contrincante para tomar posteriormente la decisión de arrollarle o no.

Después nos damos un tiempo para comprobar si estamos siendo arrollados por el contrario.

A partir de ahora pasamos a estudiar su forma de disparar.

Básicamente medidos su tasa de aciertos y de disparos para hacernos la idea del perfil que tiene.

Periódicamente observaremos la vida que este posee por si es necesario cambiar al modo arrollar. Sin embargo no volveremos a comprobar si él nos está arrollando a nosotros.

4.2.2 Decisión

La toma de decisión es muy sencilla. Básicamente seguimos las

reglas que nos marca el árbol de decisión. Activando según proceda ciertas variables y atributos para identificar la decisión

que corresponda.

Como continuamente estamos observando si los patrones de comportamiento han cambiado, iremos ajustando nuestras decisiones según corresponda.

La forma técnica de decidir es simplemente con if-else y switch.

Utilizamos las sentencias if-else para comprobar los datos observados y también los switch para distinguir distintas opciones.

4.2.3 Ejecución

Una vez que hemos decidido tenemos ciertos atributos como my_movement_mode que nos indican la estrategia que tenemos que ejecutar.

Para ello cada método y capturador de evento está fragmentado por una sentencia switch. Según el modo en el que estemos se ejecutarán unos comandos u otros.

Más allá que el simplemente hecho de ejecutar unos comandos lo que hemos hecho ha sido reciclar los robots que hemos podido conseguir (pasando por un filtro, claro está).

Hemos creado distintas clases para cada robot de tal forma que a comienzo de la vida de Smarty, se instancian un objeto de cada clase para su posterior uso. A cada constructor se le pasa el objeto this que apunta a nuestro objeto Smarty. De esta forma redirigiendo los métodos de Smarty al homologo que le corresponda (según la estrategia que queramos imitar), Smarty adopta uno u otro comportamiento.

4.2.4 Registro y valoración

Para simplificar la implementación el feedback a Smarty lo hemos realizado manualmente. Durante su creación se han ido ajustando parámetros y estrategias de acuerdo a los datos que obteniamos.

Igualmente, en lugar de almacenar los datos en un fichero hemos preferido mostrar mensajes en pantalla que nos vayan indicando el modo en el que se encuentra.

Igualmente se puede obtener las tasas de cada uno descomentando el correspondiente System.out.println.

4.3 Resultados y conclusiones

Los resultados de Smarty son por un lado sus cifras en el campo de batalla y por otro los resultados que es capaz de dar cuando muere.

Un ejemplo de salida cuando gana un round es el siguiente:

=========================

Round 4 of 10

=========================

No está mal de salud

CUERPO A CUERPO

CUERPO A CUERPO

CUERPO A CUERPO

CUERPO A CUERPO

CUERPO A CUERPO

Parece que no me arrolla

CUERPO A CUERPO

DISPARA MUCHO

ARQUERO SAYS: Dispara mucho

ARCHERO

ARCHERO

SYSTEM: Bonus for killing albers.Tiger2: 14

SYSTEM: irc.Smarty wins the round.

Cuando muere muestra información por pantalla como se ve a continuación:

=========================

Round 3 of 10

=========================

No está mal de salud

CUERPO A CUERPO

CUERPO A CUERPO

CUERPO A CUERPO

CUERPO A CUERPO

DISPARA MUCHO

ARQUERO SAYS: Dispara mucho

ARCHERO

NERVIOSO SAYS: Acierta mucho

NERVIOSO SAYS: Acierta mucho

NERVIOSO

NERVIOSO

DISPARA MUCHO

ARQUERO SAYS: Dispara mucho

ARCHERO

DISPARA MUCHO

ARQUERO SAYS: Dispara mucho

MIERDA, ME MUERO

Total number of bullets shooted to me: 72.00000000000001

Su tasa de aciertos es: 0.12499999999999996

Average power of his bullets: 0.6416666666666667

SYSTEM: irc.Smarty has died

De estas dos capturas se pueden sacar las siguientes conclusiones.

Los resultados son más o menos fiables aunque en ocasiones muestran datos erróneos como es en el caso de los 72 tiros que fueron aproximadamente 50.

En general estamos satisfechos del estudio realizado aunque ha sido complicado llevarlo a la práctica. Nos hubiese gustado poder demostrar nuestro diseño con mejores resultados. No obstante creemos que la idea es muy potente y ya solo faltaría “picar” código Java.

Como se ve en las siguientes figuras el robot obtenido es medianamente competitivo principalmente porque es capaz de adaptarse al contrario aunque, repetimos, no está muy ajustada esta relación.

aunque, repetimos, no está muy ajustada esta relación. Figura 5. Victoria vs Albers Figura 6. Derrota

Figura 5. Victoria vs Albers

muy ajustada esta relación. Figura 5. Victoria vs Albers Figura 6. Derrota vs SugarRays Figura 7.

Figura 6. Derrota vs SugarRays

Figura 5. Victoria vs Albers Figura 6. Derrota vs SugarRays Figura 7. Victoria vs NeoKarel Absolute

Figura 7. Victoria vs NeoKarel Absolute

5. Victoria vs Albers Figura 6. Derrota vs SugarRays Figura 7. Victoria vs NeoKarel Absolute Figura

Figura 8. Derrota vs U571

Figura 9. Victoria vs Marvin En cuanto a la Inteligencia Artificial se puede decir que

Figura 9. Victoria vs Marvin

En cuanto a la Inteligencia Artificial se puede decir que es una aplicación sencilla aunque práctica útil para otro tipos de sistemas. El aprendizaje mediante la experiencia se torna más complicado que el simple hecho de tomar decisiones pero de igual manera es posible.

Es gratificante dotar de unos recursos (no nos atrevemos a llamar inteligencia) a un robot y que se comporte, la mayoría de las veces, como tu esperas.

4.4 Posibles mejoras

Para versiones posteriores hay varias tareas. Primero sería conveniente encontrar o crear código especifico para cada una de las estrategias explicadas en el diseño, no solo para moverse si no tambien para apuntar.

Por otro lado seria muy positivo un almacenamiento en fichero de los resultados para posterior análisis, así como una ampliación de los tipos de información que se quiere almacenar.

Mejor estructuración del código y depuración porque existen unos errores que no hemos sabido solventar relacionados con el empleo de Java. También la realimentación y aprendizaje del robot Smarty sería conveniente revisar.

5. AGRADECIMIENTOS

Al profesor, pero no para hacerle la pelota si no simplemente para reconcerle el entusiasmo con el que da la clase, su cercanía a los alumnos, su humor y también todas las facilidades que nos da para aprender y también para aprobar la asignatura y salgamos de esta universidad.

6. REFERENCES

[1]

Home page of Robocode. http://robocode.sourceforge.net.

[2]

Robocode APIs. http://www.codepoet.org/~markw/robocode/javadoc

[3]

Robocode Repository http://www.robocoderepository.com.

[4]

Wiki of Robocode. http://robowiki.net/cgi-bin/robowiki.

[5]

LinearMovement http://robowiki.net/cgi- bin/robowiki?LinearMovement.

[6]

LinearTargeting http://robowiki.net/cgi- bin/robowiki?LinearTargeting.

[7]

Oscillator (Movement) http://robowiki.net/cgi- bin/robowiki?Oscillators.

[8]

PatternMatching http://robowiki.net/cgi- bin/robowiki?PatternMatching

[9]

CircleBots – Movimiento Circular http://robowiki.net/cgi- bin/robowiki?CircleBots

[10] Circular targeting http://robowiki.net/cgi- bin/robowiki?CircularTargeting

[11] WallBots http://robowiki.net/cgi-bin/robowiki?WallBots

[12] RamBots http://robowiki.net/cgi-bin/robowiki?RamBots

[13] StopAndGo http://robowiki.net/cgi- bin/robowiki?StopAndGo

[14] Guess Factor Targeting http://robowiki.net/cgi- bin/robowiki?GuessFactorTargeting

[15] Targeting methods http://robowiki.net/cgi- bin/robowiki?Targeting

[16] Asignatura Inteligencia Redes de Comunicaciones

http://www.it.uc3m.es/jvillena/irc/indice.html