FJRP, VMDB, SFL - CCIA-2009
Date: Noviembre-2009
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.
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
Incluye un resumen bastante completo sobre los eventos manejados por los robots de Robocode muy útil para la realización de la práctica.
Información sobre JBoss Drools Expert
Prestad especial atención al capítulo 4 (en concreto a la sección 4.2), donde se explica el lenguaje de definición de reglas DRL
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.
El objeto EstadoRoobot ofrece exactamente las mismas propiedades que el objeto de Robocode RobotStatus
Tipos de acciones estándar considerados:
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
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
export ROBOCODE_PATH=/home/[....]/robocode/ export DROOLS_PATH=/home/[....]/drools/
tar xzvf drools_robocode.tar.gz cp -r drools_robocode $ROBOCODE_PATH/robots/
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
javac -cp $JARS:. $ROBOCODE_PATH/robots/drools_robocode/*java
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
El robot RobotDrools deberá aparecer en el grupo drools_robocode
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