/**
   * Luego de elegir entre las posibles jugadas, este metodo devuelve las coordenadas que nos llevan
   * a esa jugada elegida.
   *
   * @param jugador
   * @return
   */
  public int[] elegirMovimiento(int jugador) {
    Jugada ultima = movimientos.ultimo();

    Arbol<Jugada> arbolDecision = crearArbol(ultima, jugador);
    logger.debug("El arbol de decision tiene " + arbolDecision.cantidadNodos() + " nodos");
    logger.debug("El arbol de decision tiene profundidad " + arbolDecision.altura() + " nodos");
    logger.debug("El arbol de decision tiene grado " + arbolDecision.grado());

    this.numeroNodosUltima = arbolDecision.cantidadNodos();

    Jugada decision = elegirJugada(arbolDecision, jugador);

    int[] movida = ultima.coordenadaParaLlegarA(decision);

    return movida;
  }
  /**
   * Crea un arbol de TODOS los posibles movimientos a partir de una jugada. Este metodo puede ser
   * bastantee pesado ya que puede crear un arbol de varios miles de nodos al menos para la primera
   * jugada. Alternativamente luego de cada jugada cambia de jugador para simular TODAS las posibles
   * jugadas.
   *
   * @param movida
   * @param jugador
   * @return
   */
  public Arbol<Jugada> crearArbol(Jugada movida, int jugador) {
    Arbol<Jugada> result = new Arbol<Jugada>();

    Arbol.Nodo<Jugada> nodoRaiz = result.insertarHijo(null, movida);

    Cadena<Jugada> posiblesJugadas = movida.getPosiblesJugadas(jugador);
    int otroJugador = (jugador == JUGADOR ? COMPUTADORA : JUGADOR);

    Iterator<Jugada> iter = posiblesJugadas.iterator();
    while (iter.hasNext()) {
      Jugada hijo = iter.next();
      Arbol.Nodo<Jugada> nodoHijo = result.insertarHijo(nodoRaiz, hijo);
      Arbol<Jugada> arbolHijo = crearArbol(hijo, otroJugador);

      nodoHijo.colocarHijosDeRaizDeArbol(arbolHijo);
    }

    return result;
  }
Esempio n. 3
0
  /** @param args the command line arguments */
  public static void main(String[] args) {
    Arbol a1 = new Arbol("1", 120, 2, "naranjo");
    Arbol a2 = new Arbol("2", 120, 2, "naranjo");
    Arbol a3 = new Arbol("3", 120, 2, "naranjo");
    Arbol a4 = new Arbol("4", 120, 2, "naranjo");
    Arbol a5 = new Arbol("5", 120, 2, "naranjo");
    Arbol a6 = new Arbol("6", 120, 2, "naranjo");
    Arbol a7 = new Arbol("7", 120, 2, "naranjo");
    Arbol a8 = new Arbol("8", 120, 2, "naranjo");
    Arbol a9 = new Arbol("9", 120, 2, "naranjo");

    Bosque b1 = new Bosque("1", "bosque adsi", 18000);
    b1.agregarArbol(a1);
    b1.agregarArbol(a2);
    b1.agregarArbol(a3);
    b1.agregarArbol(a4);
    b1.agregarArbol(a5);
    b1.agregarArbol(a6);
    b1.agregarArbol(a7);
    b1.agregarArbol(a8);
    b1.agregarArbol(a9);
    b1.agregarArbol(a1);

    List<Arbol> listaTempo = b1.getArboles();
    System.out.println(listaTempo.get(0).getIdArbol());
    listaTempo.remove(1);
    System.out.println(listaTempo.size());
    System.out.println(listaTempo.get(2).getIdArbol());

    for (Arbol arbol : listaTempo) {
      System.out.println(arbol.toString());
    }
    Arbol a10 = new Arbol("9", 120, 2, "naranjo");

    b1.talarArbol(a9);

    List<Arbol> listaTempo2 = b1.getArboles();
    for (Arbol arbol : listaTempo2) {
      System.out.println(arbol.toString());
    }
  }
  /**
   * Elige una jugada a partir del arbol de decision obtenido para el jugador pasado en parametro.
   * Para esto lo que hace es contar la cantidad de victorias que le da cada uno de los hijos de la
   * raiz (las posibles jugadas). Luego, lo unico que se hace es elegir el hijo que da la mayor
   * cantidad de victorias.
   *
   * @param arbolDecision
   * @param jugador
   * @return
   */
  private Jugada elegirJugada(Arbol<Jugada> arbolDecision, int jugador) {
    int maxCantidadVictorias = Integer.MIN_VALUE;
    Jugada elegida = null;

    Cadena<Arbol.Nodo<Jugada>> posibles = arbolDecision.getRaiz().getHijos();

    Iterator<Arbol.Nodo<Jugada>> iter = posibles.iterator();
    while (iter.hasNext()) {
      Arbol.Nodo<Jugada> nodo = iter.next();
      logger.debug("Jugada: \n" + nodo.getValor());
      int cantidadVictorias = getCantidadVictoriasAPartirDe(nodo, jugador, 1);
      logger.debug("Tiene " + cantidadVictorias + " victorias posibles");
      if (cantidadVictorias >= maxCantidadVictorias) {
        elegida = nodo.getValor();
        maxCantidadVictorias = cantidadVictorias;
      }
    }

    return elegida;
  }
  /** @param args the command line arguments */
  public static void main(String[] args) {
    // TODO code application logic here
    // Arbol tree = new Arbol(17);
    Arbol tree;
    // Arbol tree2 = new Arbol(99);
    List lista = new List();
    lista.pushback(45);
    lista.pushback(20);
    lista.pushback(15);
    lista.pushback(10);
    lista.pushback(7);
    lista.pushback(5);

    tree = lista.Huffman(lista);

    System.out.println(tree.getRaiz());

    /*tree.addNodo(new Nodo(44));
    tree.addNodo(new Nodo(8));
    tree.addNodo(new Nodo(5));
    tree.addNodo(new Nodo(14));
    tree.addNodo(new Nodo(4));
    tree.addNodo(new Nodo(34));
    tree.addNodo(new Nodo(2));
    tree.addNodo(new Nodo(52));
    tree.addNodo(new Nodo(21));
    tree.addNodo(new Nodo(52));
    tree.addNodo(new Nodo(11));
    tree.addNodo(new Nodo(12));
    tree.addNodo(new Nodo(91));
    tree.addNodo(new Nodo(17));
    */
    // tree2.addNodo(tree.getRaiz());
    /* System.out.println(tree.getRaiz().getValue());
    System.out.println(tree.getRaiz().getDerecha().getValue());
    System.out.println(tree.getRaiz().getIzquierda().getValue());
    System.out.println(tree.getRaiz().getDerecha().getDerecha().getValue());
    System.out.println(tree.getRaiz().getDerecha().getIzquierda().getValue());
    System.out.println(tree.getRaiz().getIzquierda().getDerecha().getValue());
    System.out.println(tree.getRaiz().getIzquierda().getIzquierda().getValue());

    tree.getRaiz().getDerecha().setPadre(tree.getRaiz());
    tree.getRaiz().getIzquierda().setPadre(tree.getRaiz());
    tree.getRaiz().getDerecha().getDerecha().setPadre(tree.getRaiz().getDerecha());
    tree.getRaiz().getDerecha().getIzquierda().setPadre(tree.getRaiz().getDerecha());
    tree.getRaiz().getIzquierda().getDerecha().setPadre(tree.getRaiz().getIzquierda());
    tree.getRaiz().getIzquierda().getIzquierda().setPadre(tree.getRaiz().getIzquierda());

    System.out.println("");

    System.out.println(tree.getRaiz().getDerecha().getPadre().getValue());
    System.out.println(tree.getRaiz().getIzquierda().getPadre().getValue());
    System.out.println(tree.getRaiz().getDerecha().getDerecha().getPadre().getValue());
    System.out.println(tree.getRaiz().getDerecha().getIzquierda().getPadre().getValue());
    System.out.println(tree.getRaiz().getIzquierda().getDerecha().getPadre().getValue());
    System.out.println(tree.getRaiz().getIzquierda().getIzquierda().getPadre().getValue());

    System.out.println("");
    */
    /* System.out.println(tree2.getRaiz().getValue());
    System.out.println(tree2.getRaiz().getIzquierda().getValue());
    System.out.println(tree2.getRaiz().getIzquierda().getDerecha().getValue());
    System.out.println(tree2.getRaiz().getIzquierda().getIzquierda().getValue());
    */
  }