Estamos de acuerdo que aunque técnicamente el General Grievous es un cyborg, nosotros lo vamos
a tratar como un Droide convencional y vamos a delegar sus funciones relacionadas con el Arte
de la Guerra a un cooprocesador sinergético acoplado a sus capacidades cognitivas naturales. De
esta forma justificamos el título y nos quedamos tan anchos. Nuestra función será iniciar la
creación de este procesador sinergético que ayude a Grievous a conquistar las Galaxias de Planet
Wars.
Para introducir lo que hemos comentado más en detalle en otros artículos, Google AI Challenge Planet
Wars es una iniciativa creada para competir a nivel global con aficcionados, profesionales e investigadores
en materia de inteligencia artificial aplicada al entretenimiento. Se trata de gestionar las naves de
batalla para conquistar las diferentes Galaxias. En ellas encontraremos un oponente neutral y un bot
enemigo creado por otro adversario. Lo que vamos a hacer aqui es introducirnos en este torneo y crear
un primer bot medianamente competente.
Primero echadle mano a la quick-start guide y muy pronto estareis dandole
caña al BOT. Descargaremos el kit de inicio en el lenguaje de programación que creamos conveniente. Basaremos este artículo en el kit de inicio de java. Si trabajais con Windows el procedimiento
es el de siempre: descargar la SDK de Java, actualizar la variable de entorno PATH y compilar los archivos.
Vereis más detalles en el tutorial de creación de vuestro propio bot.
Copiado en el directorio raiz el único archivo que tenemos que modificar es MyBot.java. En el encontraremos una
estrategia sencilla que cubre todo lo que necesitamos para empezar a trabajar. Lo principal a identificar es el
bucle de trabajo que se ejecuta a cada turno.
public static void DoTurn(PlanetWars pw) {
}
En el interior podemos crear estrategias tan elaboradas como creamos necesario, sin embargo, en cualquier caso todos
los procesos de cálculo irán enfocados a decidir el origen y el destino de nuestras flotas así como el número de
unidades que vamos a enviar. Determinar el planeta desde el que vamos a enviar la flota se haría de esta forma:
Planet source = null;
double sourceScore = Double.MIN_VALUE;
for (Planet p : pw.MyPlanets()) {
double score = (double)p.NumShips();
if (score > sourceScore) {
sourceScore = score;
source = p;
}
}
Como se puede apreciar recorremos todos nuestros planetas y buscamos el que más naves de batalla contiene. Una vez
hecho esto disponemos de la fuente desde la que se enviarán los planetas. A continuación buscamos el destino de nuestra
flota, en este caso el planeta más debil.
Planet dest = null;
double destScore = Double.MIN_VALUE;
for (Planet p : pw.NotMyPlanets()) {
double score = 1.0 / (1 + p.NumShips());
if (score > destScore) {
destScore = score;
dest = p;
}
}
Como podeis ver el hecho de que escojamos un planeta u otro depende de la puntuación que le demos y esto lo decidimos en la
variable ’score’. Cuanto menor sea el número de naves de batalla mayor será la puntuación. Finalmente tramitamos la orden al
capitán del escuadrón.
if (source != null && dest != null) {
int numShips = source.NumShips() / 2;
pw.IssueOrder(source, dest, numShips);
}
Con esto hemos comprendido el funcionamiento de la base mínima del coprocesador sinergético del General Grievous. Hecho esto
tendremos que tener muchas más cosas en cuenta. Veremos que detalles tenemos que empezar a valorar más adelante. Con la inteligencia
artificial que hemos programado no conquistaremos ni el planeta Kashyyyk de los wookies pero de momento ya nos vale para ir poniendonos
al dia.
>>>2. Simulando la batalla
Para ver nuestros progresos de forma directa sin tener que subir al servidor el paquete podemos dos cosas, o bien picarlo contra
el mismo:
java -Duser.language=en -Duser.region=US -jar tools/PlayGame.jar maps/map7.txt 1000 1000 log.txt “java -Duser.language=en -Duser.region=US MyBot” “java -Duser.language=en -Duser.region=US MyBot” | java -jar tools/ShowGame.jar
O bien picarlo contra otro bot, en este caso uno aleatorio de entre los que nos vienen con el paquete inicial:
java -Duser.language=en -Duser.region=US -jar tools/PlayGame.jar maps/map7.txt 1000 1000 log.txt “java -Duser.language=en -Duser.region=US MyBot” “java -Duser.language=en -Duser.region=US -jar example_bots/RandomBot.jar” | java -jar tools/ShowGame.jar
El desempeño no será representativo hasta que no lo veais compitiendo contra otros bots más elaborados de forma online. En cualquier
caso ya no por el hecho de competir y divertirse sino porque representa una forma excelente de ver como encara el resto de ingenieros
la solución al problema. Ya os puedo avanzar que será una cuestión matemática y de anticipación.
>>>3. Subiendo el bot al concurso
Una vez dados de alta podemos hacer la primera prueba con el bot de ejemplo. Cogemos la carpeta completa que hemos descargado, la comprimimos
en zip y la enviamos a través del formulario de la web. En breve empezará a competir y podremos iniciar la modificación de la IA para conseguir
mejores resultados.
Ejemplos de batalla que podremos ver son los siguientes:
> Batalla I
> Batalla II
Ya veis que cada uno aplica su estrategia, lo ideal es buscar la anticipación y el equilibrio entre el ataque y la defensa. Ya veremos más detalles
sin embargo lo que vamos a tratar aqui es puramente orientado a daros un punto de vista completo del concurso y no a describiros las mejores prácticas
ya que sería una mala forma de enseñar. Lo interesante es plantar las bases para que vosotros mismos seais los que vais descubriendo cómo encarar el
concurso y cómo ampliar la potencia ofensiva o defender con mayor eficacia. El parametrizado es un tema importante a tener en cuenta de cara a hacer
sencillas las optimizaciones.
4. Resultados
El resultado de una primera distribución de las estrategias más básicas y aplicando varios ajustes a los parámetros es el que veis a continuación, la
cosa no va mal del todo.
Ahora toca aplicar los preceptos del maestro Sun Tzu en el Arte de la Guerra y ponernos las pilas como Samurais Informáticos de primera categoría.
En próximos artículos plantearemos algunas estrategias sencillas para ir haciendo estómago y orientar un poco a donde van los tiros. De cualquier forma
es un jugete muy interesante que da muchas alegrías ademas de quebraderos de cabeza. Poco a poco vamos teniendo un general en condiciones.
A disfrutarlo!


























3 comments »