Práctica 2. Sistemas basados en reglas en Robocode
Inteligencia Artificial 2009/10

FJRP, VMDB, SFL - CCIA-2009


Date: Noviembre-2009



Índice General

Descripción de la práctica

Objetivos

Tareas a realizar

Se deberán implementar dos juegos de reglas DROOLS que definan dos robots con un comportamiento definido.

Se aconseja definir dos comportamientos opuestos, por ejemplo un robot con una estrategía atrevida y el otro con una estrategía más conservadaro.

Opcionalmente se puede plantear una pequeña comparativa informal del comportamiento de los robots implementados ante batallas y enemigos equivalentes.

Normas de entrega

Descripción del problema

Se trata de construir un robot para el entorno de simulación de batallas Robocode cuyo control se realice mediante un conjunto de reglas de producción ejecutadas sobre el motor de reglas JBoss Drools Expert.

Se deberán implementar y documentar dos juegos de reglas para dos tipos de robots

Herramientas a utilizar

Información sobre Robocode:

Información sobre JBoss Drools Expert

Código de partida

Se partirá de un esqueleto de Robot (fichero RobotDrools.java) que delega la gestión de sus eventos y la decisión de acciones al motor de reglas Drools.

Método run() de RobotDrools

package drools_robocode;
...
public class RobotDrools extends AdvancedRobot {
    ...
   public void run() {
    	DEBUG.habilitarModoDebug(System.getProperty("robot.debug", "true").equals("true"));    	

    	// Crear Base de Conocimiento y cargar reglas
    	crearBaseConocimiento();

        // Hacer que movimiento de tanque, radar y cañon sean independientes
        setAdjustGunForRobotTurn(true);
        setAdjustRadarForGunTurn(true);
        setAdjustRadarForRobotTurn(true);

        while (true) {
     	    DEBUG.mensaje("inicio turno");
            //cargarEventos();  // se hace en los métodos onXXXXXEvent()
            cargarEstadoRobot();
            cargarEstadoBatalla();

            // Lanzar reglas
            DEBUG.mensaje("hechos en memoria activa");
            DEBUG.volcarHechos(ksession);           
            ksession.fireAllRules();
            limpiarHechosIteracionAnterior();

            // Recuperar acciones
            Vector<Accion> acciones = recuperarAcciones();
            DEBUG.mensaje("acciones resultantes");
            DEBUG.volcarAcciones(acciones);

            // Ejecutar Acciones
            ejecutarAcciones(acciones);
       	    DEBUG.mensaje("fin turno\n");
            execute();  // Informa a robocode del fin del turno (llamada bloqueante)
        }

    }
    ...

}  // Fin RobotDrools

Uso del código aportado e integración en Robocode

Descarga: código de partida(drools_robocode.tar.gz) [30/11/2009]

Ficheros incluidos

drools_robocode
    RobotDrools.java:     implementación del robot guiado por DROOLS
    EstadoBatalla.java:   encapsula la información sobre el estado actual 
                            del campo de batalla  
    EstadoRobot.java:     encapsula la información sobre el estado actual 
                            del robot
    Accion.java:          encapsula las posibles acciones a realizar por el robot  
    Auxiliar.java:        funciones auxiliares para calulo de ángulos, posiciones, distancias
                            basadas en http://www.robocode-argentina.com.ar/descargas/trig.doc
                            (en caso de necesitar implementar funciones adicionales este es 
                            el lugar más cómodo para hacerlo)   
    ComprobarReglas.java: clase cargadora de ficheros de reglas, permite comprobar que 
                            los ficheros de reglas se compilan sin errores sin tener que 
                            lanzar el robot y realizar pequeñas pruebas insertando hechos
                            ''a mano''
    DEBUG.java:           clase con métodos para mostrar mensajes de depuración  

drools_robocode/reglas   (directorio de reglas)
    reglas_robot.drl: fichero de reglas de ejemplo, implementa un robot trazador simple

Compilación y uso

  1. Pasos previos

  2. Establecer los directorio de instalación en un par de variables de entorno
    export ROBOCODE_PATH=/home/[....]/robocode/
    export DROOLS_PATH=/home/[....]/drools/
    

  3. Copiar el directorio del robot (drools_robocode) en directorio robots de la instalación de Robocode
    tar xzvf drools_robocode.tar.gz 
    cp -r drools_robocode $ROBOCODE_PATH/robots/
    

  4. Establecer los ficheros .jar necesarios en una variable de entorno
    export JARS=$ROBOCODE_PATH/libs/robocode.jar
    export JARS=$JARS:$DROOLS_PATH/drools-core-5.0.1.jar:$DROOLS_PATH/drools-api-5.0.1.jar
    export JARS=$JARS:$DROOLS_PATH/drools-compiler-5.0.1.jar
    export JARS=$JARS:$DROOLS_PATH/lib/janino-2.5.15.jar:$DROOLS_PATH/lib/antlr-runtime-3.1.1.jar
    export JARS=$JARS:$DROOLS_PATH/lib/mvel2-2.0.10.jar:$DROOLS_PATH/lib/joda-time-1.6.jar
    

    Nota: indicad las versiones concretas de vuestra instalación

  5. Compilar el robot (necesario la primera vez y siempre que se cambie o añada código java al paquete drools_robocode)
    javac -cp $JARS:. $ROBOCODE_PATH/robots/drools_robocode/*java
    

  6. Arrancar Robocode con las opciones necesarias para integrar el robot DROOLS
    java -Xmx512M -Dsun.io.useCanonCaches=false -DNOSECURITY=true -DWORKINGDIRECTORY=$ROBOCODE_PATH \
         -Ddrools.dialect.java.compiler=JANINO \
         -Drobot.reglas=drools_robocode/reglas/reglas_robot.drl -Drobot.debug=false \
         -cp $JARS:. robocode.Robocode
    

    Mediante la propiedad robot.reglas se indica el path del fichero de reglas (.drl) a utilizar

    Mediante la propiedad robot.debug se indica si se mostrarán o no los mensaje de DEBUG en la consola del robot

    El robot RobotDrools deberá aparecer en el grupo drools_robocode

  7. (nuevo) Compilación y uso en MS Windows XP: windows.txt

Verificación del fichero de reglas

Se incluye una clase ComprobarReglas.java que permite ejecutar el compilador de reglas de DROOLS sin tener que cargar el robot en el entorno Robocode. También permite insertar hechos en la memoria activa ''a mano'' desde el código de ComprobarReglas.java (requiere recompilar, ver paso 5)

Desde el directorio $ROBOCODE_PATH/robots/

cd $ROBOCODE_PATH/robots/

java -Ddrools.dialect.java.compiler=JANINO \
     -Drobot.reglas=drools_robocode/reglas/[FICHERO_REGLAS.drl] -Drobot.debug=true \
     -cp $JARS:. drools_robocode.ComprobarReglas



ribadas 2009-12-09