October 14, 2022 | Author: Anonymous | Category: N/A
SISTEMAS SISTE MAS B A SADOS EN CONOCI CONOCIMIENT MIENTO: O: ROBOCODE Javier Jiménez Dorado 100033052 jjdorado jjdo rado@ing @ing.uc3 .uc3m.es m.es
Rubén Gómez-Chacón Camuñas 100029696
[email protected]
RESUMEN En este artículo vamos a tratar un sistema de representación del conocimiento sencillo. Para ello utilizaremos la plataforma gratuita Robocode Robocode [1] El objetivo del trabajo re realizado alizado 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 m mostrará ostrará la explicaci explicación ó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
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. 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.
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].
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 obtener información implícita, como puede ser la tasaposible de disparo y deotra aciertos del contrincante.
2. INTELIGENCIA DE DE COMUNICACIONES Y REDES 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:
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:
- Evolución de robots por algoritmos genéticos. -
Aprendizaje: experiencia.
aprender
estrategias
mediante
la
-
General:
Número de participantes
o
- Esta vez hemos querido centrarnos en cómo representar el conocimiento y cómo tomar decisiones en base a este conocimiento.
Propia:
Energía
Tasa de aciertos
o o
-
Contrincante:
o
Frecuencia
Tasa de aciertos
o
los combates, también podemos realimentar nuestro sistema de tal manera que el robot aprendiera de su propia experiencia.
Disparos
Patrón de movimiento
Tipo
3.2 Diseño de la estrategia: Árbol de decisión
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:
Para realizar el árbol de decisión y elegir la estrategia que vamos seguir nos vamos a basar b asar en la siguiente dependencia:
Movimiento
Figura 1: Relación Movimiento y Disparos.
Tabla 1: Conocimiento sobre Energía. Energía
Conclusión
E < 15%
Agonizando
E >= 15%
Saludable
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
Tabla 2: Conocimiento sobre Disparos. Frecuenci Tasa Aciertos Conclusión a Alta
Alta
Experto
Alta
Baja
Insensato
Baja
Alta
Precavido
Baja
Baja
Novato
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. 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].
•
•
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
NO
largo Lineal corto
V=1
NO
NO
SI
Disparos
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
•
•
•
•
Son
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].
Figura 2. Árbol decisión de mi movimiento
Tabla 4: Relación Estrategias de Movimiento y Apuntamiento Movimiento
Apuntamiento
Lineal
Lineal
Oscilante
PatternMatchin g
Circular
Circular
Muros
Lineal
Arrollador
Indiferente
StopAndGo
PatternMatchin g
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 Con ajustar todo hemos podido la siguiente atabla que nos servirá para nuestro patróncrear del movimiento su patrón de disparo así como para apuntarle de acuerdo al tipo de movimiento que posea.
3.2.2 Árbol de decisión
Si
No
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 estructuras de control if-else y switch.
No
Si
Lineal
LINEAL
Vida Si Gano
Movimiento Enemigo
ARROLLAR No
Si
PATTERN MATCHING
LIN Alta
SIN
Figura 3. Árbol decisión de mi apuntamiento
Baja
Alta
Frecuencia Disparos
CAMBIO
No
Tasa Aciertos Enemigo
Baja
Baja
CIRCULAR Circular
Tasa Aciertos Enemigo Alta
Si
ESCAPA
Propio Linea l
Circular
LINEAL
Movimiento
CIR
No
Pierdo
Frecuencia Disparos Baja
CAMBIO
Mediante la 3 figura somos capaces de ajustar nuestro robot de tal manera que apunte mejor para que no pierda energía al fallar. Alta
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 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
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 cata catalogar logar 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.
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 toma tomarr posteriormente la dec decisión isión de arrollarle o no. Después un tiempo para comprobar si estamos siendo arrolladosnos pordamos 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 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
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. 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 prim primero ero y segundo son más confusos eell tercero claramente porque está formado de métodossedeveRobocode que representan acción.principalmente 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.
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 sswitch witch 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 estrategi estrategiaa que tenem tenemos os 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á quehecho el simplemente hecho los de ejecutar unoshemos comandos lo que hemos ha sido reciclar robots que 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 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.
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
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 muestran datos erróneos como es en el caso de los 72 tiros que fueron aproximadamente 50.
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
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.
CUERPO A CUERPO DISPARA MUCHO ARQUERO SAYS: Dispara mucho ARCHERO
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.
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:
Figura 5. Victoria vs Albers
========================= 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 http://robocode.sourceforge.net.. [1] Home page of Robocode. http://robocode.sourceforge.net
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.
[2] Robocode APIs. http://www.codepoet.org/~markw/robocode/javadoc http://www.codepoet.org/~markw/robocode/javadoc [3] Robocode Repository http://www.robocoderepository.com. http://www.robocoderepository.com. [4] Wiki of Robocode. http://robowiki.net/cgi-bin/robowiki. http://robowiki.net/cgi-bin/robowiki. [5] LinearMovement http://robowiki.net/cgi bin/robowiki?LinearMovement.. bin/robowiki?LinearMovement [6] LinearTargeting http://robowiki.net/cgi bin/robowiki?LinearTargeting.. bin/robowiki?LinearTargeting
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.
[7] Oscillator (Movement) http://robowiki.net/cgi bin/robowiki?Oscillators.. bin/robowiki?Oscillators
4.4 Posibles mejoras
[9] CircleBots – Movimiento Circular http://robowiki.net/cgi bin/robowiki?CircleBots bin/robowiki?CircleBots
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.
[10] Circular targeting http://robowiki.net/cgi bin/robowiki?CircularTargeting bin/robowiki?CircularTargeting
[8] PatternMatching http://robowiki.net/cgi bin/robowiki?PatternMatching bin/robowiki?PatternMatching
[11] WallBots http://robowiki.net/cgi-bin/robowiki?WallBots http://robowiki.net/cgi-bin/robowiki?WallBots http://robowiki.net/cgi-bin/robowiki?RamBots [12] RamBots http://robowiki.net/cgi-bin/robowiki?RamBots
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.
[13] bin/robowiki?StopAndGo StopAndGo http://robowiki.net/cgi bin/robowiki?StopAndGo [14] Guess Factor Targeting http://robowiki.net/cgi bin/robowiki?GuessFactorTargeting bin/robowiki?GuessFactorTargeting [15] Targeting methods http://robowiki.net/cgi bin/robowiki?Targeting bin/robowiki?Targeting [16] Asignatura Inteligencia Redes de Comunicaciones http://www.it.uc3m.es/jvillena/irc/indice.html 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.