Вы находитесь на странице: 1из 7

SISTEMAS BASADOS EN CONOCIMIENTO: ROBOCODE

Javier Jiménez Dorado Rubén Gómez-Chacón Camuñas


100033052 100029696
jjdorado@ing.uc3m.es rgomezch@ing.uc3m.es

RESUMEN Desde la perspectiva robótica nos tenemos que enfrentar al


En este artículo vamos a tratar un sistema de representación del problema de la interacción con el medio de nuestro robot y
conocimiento sencillo. Para ello utilizaremos la plataforma posteriormente cómo llevar a cabo los movimientos y acciones
gratuita Robocode [1] El objetivo del trabajo realizado es que se han decidido realizar.
presentar un esquema de un diseño para un robot que, partiendo A continuación vamos a presentar una teoría de diseño y
de un conocimiento aprendido más la información que va construcción de robots con las bases ya presentadas. Al finalizar
adquiriendo durante el combate, sea capaz de tomar decisiones de el artículo comentaremos la implementación final, los resultados y
cual es la estrategia más conveniente a utilizar en un combate posibles mejoras para una revisión.
individual, no por equipos. Finalmente se mostrará la explicación
de una versión reducida del esquema propuesto así como los
resultados.
3. ELECCIÓN DE LA ESTRATEGIA:
Categorías y descriptores de materia DISEÑO.
I.2.4 Knowledge Representation Formalisms and Methods; I.2.9
Robotics 3.1 Análisis del entorno
General Terms Como todo sistema que interacciona con el medio, que es lo que
Algoritmos, Desarrollo, Diseño y Teoria. pretende ser nuestro robot, produce una serie de respuestas ante
un conjunto de estímulos de acuerdo a un conocimiento que le
Keywords viene dado por la experiencia o reglas aprendidas.
Robocode, Decisiones, Estrategia, Conocimiento.
En esta primera fase, análisis del entorno, el robot se encarga de
1. INTRODUCCION recibir los estímulos. La forma que tiene de hacerlo es mediante
Robocode es una plataforma pensada en un principio para ciertos sensores que a efectos prácticos se traducirán en eventos.
aprender Java pero que se ha convertido en una forma fácil de El sensor básico es el radar que le permite conocer la posición de
aplicar conocimientos de Inteligencia Artificial. Para programar sus contrincantes pero también tiene acceso a información pública
existen varios APIs [2]. Los robots que tienen tres partes o del sistema como son el número de contrincantes que quedan y a
variables: Cañon, Radar y Cuerpo. Más información [1]-[4]. información privada como la energía que todavía posee. También
con una serie de razonamientos , deducciones y aproximaciones
2. INTELIGENCIA DE REDES DE es posible obtener otra información implícita, como puede ser la
tasa de disparo y de aciertos del contrincante.
COMUNICACIONES Y ROBOCODE

Hay varios campos de investigación entorno a Robocode en el 3.1.1 Caracterización de los robots
campo de la Inteligencia Artificial, el conocimiento, el
aprendizaje, etc. De hecho han sido ya varios los estudios Conocidos los sensores del robot veamos las variables del entorno
realizados en otros años acerca de este tema: que más información nos dan:
- Evolución de robots por algoritmos genéticos.
- Aprendizaje: aprender estrategias mediante la - General:
experiencia. o Número de participantes
- Propia:
Esta vez hemos querido centrarnos en cómo representar el o Energía
conocimiento y cómo tomar decisiones en base a este
o Tasa de aciertos
conocimiento.
- Contrincante:
o Disparos los combates, también podemos realimentar nuestro sistema de tal
ƒ Frecuencia manera que el robot aprendiera de su propia experiencia.

ƒ Tasa de aciertos
o Patrón de movimiento
ƒ Tipo
3.2 Diseño de la estrategia: Árbol de decisión
o Energía

Para realizar el árbol de decisión y elegir la estrategia que vamos


La información que podemos extraer del contrincante se podría seguir nos vamos a basar en la siguiente dependencia:
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. Movimiento Disparos
Como en todo agrupamiento hay que llegar a un compromiso:

Figura 1: Relación Movimiento y Disparos.


Tabla 1: Conocimiento sobre Energía.
Conclusión Así según el enemigo se mueva nosotros dispararemos y
Energía
viceversa. Además nos basaremos en la energía de ambos.
E < 15% Agonizando
E >= 15% Saludable 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.

Tabla 2: Conocimiento sobre Disparos. 3.2.1 Tipos de estrategias


Frecuenci Tasa Aciertos Conclusión
Antes de nada introduzcamos los diferentes tipos de movimiento
a
que están recogidos en [3]. Muchos de ellos han sido tenidos en
Alta Alta Experto cuenta en nuestro diseño:
Alta Baja Insensato
Baja Alta Precavido • LinearMovement – Movimiento en línea recta.
Vulnerable al apuntamiento lineal [6].
Baja Baja Novato
• Oscillators [7]– Movimiento en un conjunto de patrones
que se repiten (aunque el período puede ser muy largo).
Es vulnerable al PattherMatching [8].
Tabla 3: Conocimiento sobre Movimiento

Velocidad Choques Muro Lineal Curvilíneo Conclusión • CircleBots [9] – Se mueven en circulos. Son
s vulnerables a apuntamiento circular [10.
V>0 SI - - - Arrollador
• WallBots [11 – Se mueven a lo largo de los muros.
V=2 NO NO SI NO Lineal Vulnerable a LinearTargeting, excepto cerca de las
largo esquinas.
V=1 NO NO SI NO Lineal
corto • RamBots [12] – Se mueve hacia el enemigo. Vulnerable
V>0 - SI - - Muros a la mayoría de los apuntamientos pero consigue bonus
extras por ram (arrollar).
V=2 NO NO NO SI Elipse
largo • StopAndGo [13] – Reacciona ante fuego enemigo. Es
V=1 NO NO NO SI Elipse efectivo frente a apuntamiento lineal y circular pero es
corto vulnerable ante PatternMatching y
V=0 - - NO NO Estático 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
Gracias la caracterización del contrincante, no sólo vamos a poder apuntamiento.
elegir la mejor estrategia si no que, registrando los resultados de
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].
Figura 2. Árbol decisión de mi movimiento

Tabla 4: Relación Estrategias de Movimiento y Apuntamiento


En la figura 2 vemos la secuencia de cuestiones que se tendría que
Movimiento Apuntamiento plantear nuestro robot para ver si es bueno cambiar de
Lineal Lineal movimiento o no.
Oscilante PatternMatchin En principio lo más sencillo es cambiar de lineal a circular aunque
g puede ocurrir que nos convenga otra estrategia distinta como
Circular Circular puede ser arrollar al contrario o escapar, que aunque no está
considerada estrategia en la página de Robocode, hemos
Muros Lineal considerado conveniente huir del enemigo cuando estemos siendo
Arrollador Indiferente arrollados porque es de esperar que nos quedemos sin energía.
StopAndGo PatternMatchin
g
Quieto /
Arrollador
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 Si No
posea.

3.2.2 Árbol de decisión Muros


ACRIBILLAR

Ya estamos listos para crearnos nuestros árboles de decisión. En


Java resulta muy sencillo la creación de estos gracias a las No Si
estructuras de control if-else y switch.
Lineal
LINEAL
Vida
Si
No
Gano Pierdo

Movimiento LINEAL Circular


ARROLLAR
Enemigo

No Si Si No
Movimiento
Propio
ESCAPA
CIRCULAR PATTERN
Linea Circular MATCHING
l
Tasa Aciertos Tasa Aciertos
Enemigo Enemigo
Figura 3. Árbol decisión de mi apuntamiento
Baja Alta Baja
Alta

Frecuencia LIN Frecuencia Mediante la 3 figura somos capaces de ajustar nuestro robot de tal
CIR
Disparos Disparos manera que apunte mejor para que no pierda energía al fallar.
Baja Alta Baja
Alta
CAMBIO SIN CAMBIO SIN
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].

3.3 Ejecución de la estrategia


4. RESULTADO DEL DISEÑO: SMARTY
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. Finalmente, después de haber diseñado esquemáticamente la vida
de un robot, realizamos una implementación sencilla. Al proyecto
El diseño óptimo de este tipo de robots debería permitir la le hemos denominado Smarty.
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 4.1 Limitaciones
un movimiento predefinido por lo que una vez que adivinemos
sus patrones de comportamiento no tendremos que modificar el
La primera gran limintación que nos encontramos fue el tiempo y
nuestro más que una vez.
los conocimientos. Esto se debe a que implementar las estrategias
Sin embargo existe cada vez gran cantidad de robots que poseen descritas en el diseño es más complejo de lo que a priori se puede
un patrón de comportamiento variable y/o adaptable como lo es el suponer. Si bien una estrategia en sí ya es costoso era inviable
nuestro. Con este tipo de enemigos el combate se convierte en un implementar desde cero todas las estrategias.
duelo de titanes en el sentido de que son poderosos y por otro lado Por este motivo y sin faltar a los derechos de la propiedad
en un duelo de ajedrez, en el que cada contrincante estudia a su buscamos código en el repositorio de Robocode [3] así como en
enemigo. En estos casos no es suficiente la estrategia de observar, las prácticas de otros años en la página web de la asignatura
decidir y ejecutar, si no que es necesario una estrategia por Inteligencia de Redes de Comunicaciones [16].
defecto ya definida que debe ser lo suficientemente buena.
En el repositorio de Robocode existe una base de datos de robots,
Otra opción para el caso de lucha contra robots que cambian de clasificados por tipos, que se pueden descargar. Sin embargo no
modo es ir alternando las distintas estrategias lo más son muchos los que proporcionan el código fuente, siendo
aleatoriamente posible para despistar al enemigo. complicado reutilizar dicho código.

3.3.1 Realimentación 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.
Un buen robot tomará nota del trascurso de la batalla y de los
resultados obtenidos. El objetivo de estos registros son varios: En definitiva, no ha sido posible encontrar robots con las
características deseadas y no hemos tenido tiempo suficiente para
diseñarlos desde cero.
- Por un lado es importante chequear si el robot está, Es por ello que nos hemos basado en algunos de estos pero que no
primero, deduciendo el comportamiento del enemigo de son precisamente característicos de su grupo.
forma correcta y segundo, si está tomando las En realidad la versión última del robot Smarty no llega tampoco a
decisiones correctamente. implementar un estudio avanzado del movimiento del robot
- Si está tomando las decisiones tal y como se le ha enemigo y por tanto el método de disparos está sujeto al
enseñado será bueno comprobar si nuestros criterios han comportamiento de los robots usados para formar a Smarty.
sido correctos. De esta forma veremos si nuestras No obstante este no debe suponer mayor problema porque lo
estrategias de movimiento son capaces de disminuir su interesante de este estudio es la capacidad de análisis y decisión
tasa de acierto y si estamos prediciendo sin mucho error que posee el robot Smarty.
la posición del enemigo a la hora de disparar.
4.2 Cerebro de Smarty
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: Como se sabe, los robots de robocode son una clase Java, que
hereda la clase Robot o AdvancedRobot y que posee
- Si hay fallos de programación debemos introducir principalmente:
cambios de forma manual.
- método run() cuya ejecución no debe finalizar
- Si por el contrario parece ser que la estrategia elegida - manejadores de eventos. Los eventos pueden ser
no funciona correctamente contra un determinado estandares o personalizados. (ver la documentación
[3].
Nuestro robot hereda de la clase AdvancedRobot que permite Las únicas clases de apoyo que tenemos son los robots
realizar más funciones y complejas de una manera más eficiente. descargados aunque ellos sí que se apoyan en numerables clases y
Siguiendo con el diseño procedimos a crear el diagrama de flujo . métodos para realizar las tareas.
Para ello teníamos dos opciones que se muestra en la figura 4. 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
Figura 4. Diagrama de flujo 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
Como comentamos en el diseño el robot debe tener un observados y también los switch para distinguir distintas
comportamiento por defecto mientras toma las decisiones. opciones.
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
4.2.3 Ejecución
movimientos.
Una vez que hemos decidido tenemos ciertos atributos como
Aclarar que la figura 4 representaría el esquema a seguir por un
my_movement_mode que nos indican la estrategia que tenemos
lado para la decisión de movimiento y por otro para decidir la
que ejecutar.
forma de apuntar.
Para ello cada método y capturador de evento está fragmentado
También comentar que es difícil separar físicamente en el código
por una sentencia switch. Según el modo en el que estemos se
Java qué es parte de la observación, qué de la decisión y qué de
ejecutarán unos comandos u otros.
la ejecución. Si bien primero y segundo son más confusos el
tercero se ve claramente porque está formado principalmente de Más allá que el simplemente hecho de ejecutar unos comandos lo
métodos de Robocode que representan acción. De todas formas que hemos hecho ha sido reciclar los robots que hemos podido
intentaremos explicar lo mejor posible cómo ha sido la conseguir (pasando por un filtro, claro está).
implementación. 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
4.2.1 Observación this que apunta a nuestro objeto Smarty. De esta forma
redirigiendo los métodos de Smarty al homologo que le
¿Cómo observamos? Como ya se ha comentado gracias al radar corresponda (según la estrategia que queramos imitar), Smarty
podemos obtener objetos que nos facilitan cierta información. Por adopta uno u otro comportamiento.
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
4.2.4 Registro y valoración
valemos de los atributos. También podíamos haber hecho uso de
otras clases que nos apoyaran pero optamos por no hacerlo. 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 NERVIOSO
preferido mostrar mensajes en pantalla que nos vayan indicando DISPARA MUCHO
el modo en el que se encuentra.
ARQUERO SAYS: Dispara mucho
Igualmente se puede obtener las tasas de cada uno descomentando
el correspondiente System.out.println. ARCHERO
DISPARA MUCHO
4.3 Resultados y conclusiones
ARQUERO SAYS: Dispara mucho

Los resultados de Smarty son por un lado sus cifras en el campo MIERDA, ME MUERO
de batalla y por otro los resultados que es capaz de dar cuando Total number of bullets shooted to me: 72.00000000000001
muere. Su tasa de aciertos es: 0.12499999999999996
Average power of his bullets: 0.6416666666666667
Un ejemplo de salida cuando gana un round es el siguiente: SYSTEM: irc.Smarty has died
=========================
Round 4 of 10 De estas dos capturas se pueden sacar las siguientes conclusiones.
========================= Los resultados son más o menos fiables aunque en ocasiones
No está mal de salud... muestran datos erróneos como es en el caso de los 72 tiros que
CUERPO A CUERPO fueron aproximadamente 50.

CUERPO A CUERPO
CUERPO A CUERPO En general estamos satisfechos del estudio realizado aunque ha
sido complicado llevarlo a la práctica. Nos hubiese gustado poder
CUERPO A CUERPO demostrar nuestro diseño con mejores resultados. No obstante
CUERPO A CUERPO creemos que la idea es muy potente y ya solo faltaría “picar”
código Java.
Parece que no me arrolla
CUERPO A CUERPO
Como se ve en las siguientes figuras el robot obtenido es
DISPARA MUCHO
medianamente competitivo principalmente porque es capaz de
ARQUERO SAYS: Dispara mucho adaptarse al contrario aunque, repetimos, no está muy ajustada
ARCHERO esta relación.
ARCHERO
SYSTEM: Bonus for killing albers.Tiger2: 14
SYSTEM: irc.Smarty wins the round.

Figura 5. Victoria vs Albers


Cuando muere muestra información por pantalla como se ve a
continuación:
=========================
Round 3 of 10
=========================
No está mal de salud... Figura 6. Derrota vs SugarRays
CUERPO A CUERPO
CUERPO A CUERPO
CUERPO A CUERPO
CUERPO A CUERPO
DISPARA MUCHO Figura 7. Victoria vs NeoKarel Absolute
ARQUERO SAYS: Dispara mucho
ARCHERO
NERVIOSO SAYS: Acierta mucho
NERVIOSO SAYS: Acierta mucho
NERVIOSO Figura 8. Derrota vs U571
6. REFERENCES
[1] Home page of Robocode. http://robocode.sourceforge.net.
[2] Robocode APIs.
http://www.codepoet.org/~markw/robocode/javadoc
Figura 9. Victoria vs Marvin
[3] Robocode Repository http://www.robocoderepository.com.
En cuanto a la Inteligencia Artificial se puede decir que es una
aplicación sencilla aunque práctica útil para otro tipos de [4] Wiki of Robocode. http://robowiki.net/cgi-bin/robowiki.
sistemas. El aprendizaje mediante la experiencia se torna más [5] LinearMovement http://robowiki.net/cgi-
complicado que el simple hecho de tomar decisiones pero de igual bin/robowiki?LinearMovement.
manera es posible.
[6] LinearTargeting http://robowiki.net/cgi-
bin/robowiki?LinearTargeting.
Es gratificante dotar de unos recursos (no nos atrevemos a llamar [7] Oscillator (Movement) http://robowiki.net/cgi-
inteligencia) a un robot y que se comporte, la mayoría de las bin/robowiki?Oscillators.
veces, como tu esperas.
[8] PatternMatching http://robowiki.net/cgi-
bin/robowiki?PatternMatching
4.4 Posibles mejoras [9] CircleBots – Movimiento Circular http://robowiki.net/cgi-
bin/robowiki?CircleBots
Para versiones posteriores hay varias tareas. Primero sería [10] Circular targeting http://robowiki.net/cgi-
conveniente encontrar o crear código especifico para cada una de bin/robowiki?CircularTargeting
las estrategias explicadas en el diseño, no solo para moverse si no [11] WallBots http://robowiki.net/cgi-bin/robowiki?WallBots
tambien para apuntar.
[12] RamBots http://robowiki.net/cgi-bin/robowiki?RamBots
Por otro lado seria muy positivo un almacenamiento en fichero de
[13] StopAndGo http://robowiki.net/cgi-
los resultados para posterior análisis, así como una ampliación de
bin/robowiki?StopAndGo
los tipos de información que se quiere almacenar.
[14] Guess Factor Targeting http://robowiki.net/cgi-
Mejor estructuración del código y depuración porque existen unos
bin/robowiki?GuessFactorTargeting
errores que no hemos sabido solventar relacionados con el empleo
de Java. También la realimentación y aprendizaje del robot [15] Targeting methods http://robowiki.net/cgi-
Smarty sería conveniente revisar. bin/robowiki?Targeting
[16] Asignatura Inteligencia Redes de Comunicaciones
http://www.it.uc3m.es/jvillena/irc/indice.html
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.

Вам также может понравиться