Galcon AI Contest

    Galcon AI Contest

    Google y la Universidad de Waterloo han lanzado un nuevo reto, esta vez de Inteligencia Artificial, el del año pasado, consistia en competir jugando al TRON y a juzgar por los videos, el resultado fue muy divertido.
    El reto consiste en preparar un robot capaz de jugar de forma autónoma al juego Galcon, el juego es bastante sencillo, por lo que preparar la Inteligencia Artificial para poder jugar es razonable.
    Al ser un juego de estrategia basado en turnos, esta bastante acotado el momento en el que hay que tomar la decisión y además los objetos con los que se trabaja son fáciles de manejar (Planet, PlanetWar y Fleet). Gracias a esa sencillez, se puede concentrar el esfuerzo en la Inteligencia Artificial, haciéndolo más complejo y divertido.

    ¿Por qué participar en un reto como este ?

    Porque no sólo sabes jugar a un juego, además eres capaz de hacer software que juega contra otros robots, incluso contra humano , incluso ganar a un humano !!.

    Además es una buena oportunidad para hacer un sistema de toma de decisiones y puedes empezar a poner en práctica los conceptos básicos, aprender, olvidar, cambio de estrategia, etc.

    ¿Qué tengo que hace para participar?

    Bueno para participar en el juego y competir con terceros, incluso estar en un ranking, etc. lo que hay que hacer es inscribirte en este link. Aqui puedes ver como va el ranking de competidores. A partir del dia 10 de Septiembre empieza la competición hasta el dia 27 de Noviembre.
Con lo que estas a tiempo de entrenar a tu bot hasta que sea una máquina de conquistar planetas.

¿Como puedo crear mi primer bot?
    Bajarte el código de java, bueno de java o de lo que tu quieras (C#, C++, Java y Python) . Una vez te los has bajado lo descomprimes y ya tienes el entrono de trabajo preparado.
    Compilar el código y probar el entorno:
    compilar: javac *.java
    ejecutar: java -jar tools/PlayGame.jar maps/map7.txt 1000 1000 log.txt "java -jar example_bots/RandomBot.jar" "java -jar example_bots/DualBot.jar" | java -jar tools/ShowGame.jar
    Crear tu propio Bot y empezar a probar modificaciones en la estrategia

    ¿Cómo puedo probar mi bot contra otros?

    En el directorio example_bots vienen varios bots preparados: BullyBot, DualBot, ProspectBot, RageBot y RandomBot.

    Por ejemplo para probar el RageBot contra el DualBot, este es el comando: java -jar tools/PlayGame.jar maps/map7.txt 1000 1000 log.txt "java -jar example_bots/RageBot.jar" "java -jar example_bots/DualBot.jar" | java -jar tools/ShowGame.jar

    ¿Como se depura una bot?

    Mmmmhhh, esta por resolver, es complejo como lanzarlo en debug con eclipse, por la forma de lanzar las clases.
    No se puede utilizar System.out.println , porque se basa en System.in para leer los comandos del servidor y si lo haces te dara timeouts tu Bot.
    Seguro que se te acaba ocurriendo alguna forma creativa para depurar el sistema, si es asi no dudes en enviar un email, yo de momento voy a probar con log4j.

    ¿Por qué da timeouts mi Bot?
    Por lo que he podido comprobar, el problema es porque hay un fallo en la lógica por el que el bot entra en un bucle y por eso no funciona o bien un fallo en la configuración, p.e.: no estas lanzando el comando desde el sitio donde están las clases o el comando para ejecutar ejecutar el bot: java -jar example_bots/RandomBot.jar da un error.

    Un Primer Bot:

    Aqui tienes un primer bot para que puedas hacerte una idea, este bot esta pensado de forma que ataca primero a los más débiles y a partir de que son varios planetas, hace ataques combinados desde todos los planetas a la vez al más débil y si este ya ha sido atacado hace poco al más fuerte.

    import java.util.TreeMap;
    import java.util.Vector;

    public class TheBot {

    static Vector atacados = null;

    public static void DoTurn(PlanetWars pw) {

    if (atacados == null) {
    atacados = new Vector();
    }
    // (1) If we currently have 3 fleet in flight, just do nothing.
    if (pw.MyFleets().size() >= 3) {
    return;
    }
    // (2) Find my strongest planet.
    Planet strongest = null;
    int sourceScore = Integer.MAX_VALUE;
    for (Planet p : pw.MyPlanets()) {
    int score = p.NumShips();
    if (score > sourceScore) {
    sourceScore = score;
    strongest = p;
    }
    }
    // (3) Find the weakest enemy or neutral planet.
    Planet weakEnemy = null;
    int minScore = Integer.MAX_VALUE;
    for (Planet p : pw.NotMyPlanets()) {
    int score = p.NumShips();
    if (score < minscore =" score;" weakenemy =" p;" strongenemy =" null;" maxscore =" Integer.MIN_VALUE;" score =" p.NumShips();"> maxScore) {
    maxScore = score;
    strongEnemy = p;
    }
    }
    int totalDeMisPlanetas = pw.MyPlanets().size();
    if (atacados.contains(weakEnemy)) {
    int totalDeNaves = strongEnemy.NumShips();
    for (Planet p : pw.MyPlanets()) {
    int navesDestePlaneta = totalDeNaves / totalDeMisPlanetas;
    if (p.NumShips()/3 > totalDeNaves) {
    navesDestePlaneta = p.NumShips()/2;
    totalDeNaves -= p.NumShips()/2;
    pw.IssueOrder(p, strongEnemy, navesDestePlaneta);
    } else {
    continue;
    }
    }
    } else {
    int totalDeNaves = weakEnemy.NumShips();
    for (Planet p : pw.MyPlanets()) {
    int navesDestePlaneta = totalDeNaves / totalDeMisPlanetas;
    if (p.NumShips()/2 > navesDestePlaneta) {
    navesDestePlaneta = p.NumShips()/2;
    totalDeNaves -= p.NumShips()/2;
    pw.IssueOrder(p, weakEnemy, navesDestePlaneta);
    }
    }
    atacados.add(weakEnemy);
    }
    }

    public static Planet getNearest(PlanetWars pw, Planet mine) {
    TreeMap map = new TreeMap();
    for (Planet p : pw.NeutralPlanets() ) {
    map.put(pw.Distance(mine.PlanetID(), p.PlanetID()), p);
    }
    return (Planet)map.firstEntry();
    }

    public static Planet getWeakest(PlanetWars pw) {
    Planet pret = null;
    double score = Integer.MAX_VALUE;
    for (Planet p : pw.NotMyPlanets() ) {
    double thisScore = 1.0 / (1 + p.NumShips());
    if (thisScore < score =" thisScore;" pret =" p;" line = "" message = "" c =" System.in.read()) >= 0) {
    switch (c) {
    case '\n':
    if (line.equals("go")) {
    PlanetWars pw = new PlanetWars(message);
    DoTurn(pw);
    pw.FinishTurn();
    message = "";
    } else {
    message += line + "\n";
    }
    line = "";
    break;
    default:
    line += (char)c;
    break;
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
Conclusión
Espero haber llamado tu atención sobre este reto tan interesante, y que si no puedes participar con un nuevo bot, que puedas conocer de primera mano el reto y seguirlo, al fin y al cabo son bots jugando con bots a cosas de robots.

Comentarios

  1. Bastante interesante, ya empece a jugar bastante para idear una estrategia :D

    ResponderEliminar
  2. Es el primer paso, ojo que es adictivo, la estrategia más sencilla es hacer ataques aleatorios, y creo que las más complejas son las que atacan en grupo, teniendo en cuenta el número de naves del planeta atacado y la distancia hasta los planetas haciendo "zonas controladas"... a disfrutar ;-)

    ResponderEliminar
  3. Pues a mí me has enganchado, de momento he subido el bot de ejemplo y voy por el puesto 238. Eso sí, el paquete Java que ofrecen da TimeOuts para los bots, en el foro he encontrado una versión anterior que va mejor. A ver si se me ocurre alguna buena estrategia y soy capaz de implementarla... :) Gracias por tu post

    ResponderEliminar
  4. Hola,

    Me he picado con esto al ver tu entrada, muchas gracias!
    Alguien ha conseguido arreglar el problema de los timeouts? Porque incluso cambiando a los otros paquetes que hay en el foro sigo igual :( sólo me funciona el engine con bots en c++

    Un saludo! y suerte a todos!

    ResponderEliminar
  5. En cuanto al tema de las estrategias, te recomiendo que las hagas en grupo, es decir, no ataques desde el planeta más grande, sino desde todos tus planetas a la vez... ahora puedes elegir que todos ataquen a la vez al mismo o a varios... con que envies más tropas que las que tiene el planeta conquistado, ya vale... pero ojo porque si lo dejas con solo 2-3 naves sera fácil de conquistar... mmmh la otra es ver juegos de los mejores e intentar adivinar sus estrategias y replicarlas... :-)

    Misato me alegro de que te hayas picado, me alegro de ver que hay 103 españoles compitiendo... mola ;-)

    ResponderEliminar
  6. Buenas noticias se han cerrado las clasificaciones y hay un español entre los 10 primeros, su nombre es protocolocon y en este link podeis seguir sus últimas competiciones: http://ai-contest.com/profile.php?user_id=11246 Muy buneas.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Cross Compiling Freeling

Como intentan robar las mafias utilizando AutoScout24

Smurfs' Village de CAPCOM interactive o como roban los pitufos de Apple