예제 #1
0
  public void bayesExpand(Pelilauta lauta) {
    double[] values = new double[Pelilauta.getKoko() * Pelilauta.getKoko()];
    int[] strengths = new int[values.length];
    children = new NodenLapset();
    double boardSum = 0.0;
    int strengthOfPrediction = 0;
    Node newNode;

    for (int i = 0; i < values.length; i++) {
      values[i] = Pattern.valueOf(Pattern.match(lauta, Pelilauta.toX(i), Pelilauta.toY(i)));
      strengths[i] = Pattern.getSeenTotal(Pattern.match(lauta, Pelilauta.toX(i), Pelilauta.toY(i)));
      boardSum += values[i];
      strengthOfPrediction +=
          Pattern.getSeenTotal(Pattern.match(lauta, Pelilauta.toX(i), Pelilauta.toY(i)));
    }
    Pelilauta testiLauta;
    double difference;
    int differenceInStrength;
    for (int i = 0; i < values.length; i++) {
      if (!PlacementHandler.onkoLaillinenSiirto(lauta, Pelilauta.toX(i), Pelilauta.toY(i))) {
        continue;
      }
      difference = 0.0;
      differenceInStrength = 0;
      testiLauta = lauta.kopioi();
      PlacementHandler.pelaaSiirto(testiLauta, Pelilauta.toX(i), Pelilauta.toY(i));
      for (int x = -1; x < 2; x++) {
        for (int y = -1; y < 2; y++) {
          if (Pelilauta.onLaudalla(Pelilauta.toX(i) + x, Pelilauta.toY(i) + y)) {
            difference +=
                values[i]
                    - Pattern.valueOf(
                        Pattern.match(testiLauta, Pelilauta.toX(i) + x, Pelilauta.toY(i) + y));
            differenceInStrength +=
                strengths[i]
                    - Pattern.getSeenTotal(
                        Pattern.match(testiLauta, Pelilauta.toX(i), Pelilauta.toY(i)));
          }
        }
      }
      newNode = new Node(lauta, Pelilauta.toX(i), Pelilauta.toY(i));
      newNode.raveVierailut =
          (int) Math.round(Math.log(strengthOfPrediction - differenceInStrength) * 1000);
      if (lauta.getTurn() == Pelilauta.MUSTA) {
        newNode.raveVoitot =
            (int)
                Math.round(
                    newNode.raveVierailut * (1 / (1 + Math.pow(Math.E, boardSum - difference))));
      } else {
        newNode.raveVoitot =
            (int)
                Math.round(
                    newNode.raveVierailut
                        * (1 - (1 / (1 + Math.pow(Math.E, boardSum - difference)))));
      }
      if (1.0 * newNode.raveVoitot / newNode.raveVierailut > 0.44) {
        children.addNode(newNode);
      }
    }
    children.setMaxKoko(branchingFactor);
    Node passaus = new Node(lauta, -1, -1);
    children.addNode(passaus);
    children.sort();
  }
예제 #2
0
  /**
   * Yrittää parhaalta vaikuttavaa siirtoa, simuloi siitä edespäin pelin loppuun saakka, ja
   * päivittää jokaisen MC-puun solmun matkan varrella tällä tuloksella.
   */
  public void selectAction(Pelilauta lauta) {
    Pelilauta currentLauta = lauta.kopioi();
    int[] amafTaulu = new int[Pelilauta.getKoko() * Pelilauta.getKoko()];

    if (isNoLegalMovesAvailable()) {
      return;
    }
    Pino<Node> visited = new Pino<>();
    visited.add(this);
    Node currentNode = this;
    int tulos;

    while (!currentNode.isLeaf()) {
      if (raveSuoritukset == 0) {
        currentNode = currentNode.select();
        PlacementHandler.pelaaSiirto(currentLauta, currentNode.getX(), currentNode.getY());
      } else {
        currentNode = currentNode.selectRAVE(currentNode.vierailut);
        if ((Pelilauta.toSimple(currentNode.getX(), currentNode.getY()) > -1)
            && (amafTaulu[Pelilauta.toSimple(currentNode.getX(), currentNode.getY())] == 0)) {
          amafTaulu[Pelilauta.toSimple(currentNode.getX(), currentNode.getY())] =
              currentNode.getTurn();
        }
        PlacementHandler.pelaaSiirto(currentLauta, currentNode.getX(), currentNode.getY());
      }
      visited.add(currentNode);
    }
    // currentNode.bayesExpand2(currentLauta, branchingFactor);
    currentNode.expand(currentLauta);

    if (raveSuoritukset == 0) {
      currentNode = currentNode.select();
      PlacementHandler.pelaaSiirto(currentLauta, currentNode.getX(), currentNode.getY());
    } else {
      currentNode = currentNode.selectRAVE(currentNode.vierailut);
      if (currentNode.getX() == -1
          && currentNode.getY() == -1
          && currentLauta.isPassedOnLastMove()) {
        tulos = -1;
        if (GTP.score(currentLauta) > 0) {
          tulos = 1;
        }

        updateRAVE(visited, tulos, amafTaulu);

        currentNode.children = null;

        return;
      }
      if ((Pelilauta.toSimple(currentNode.getX(), currentNode.getY()) > -1)
          && (amafTaulu[Pelilauta.toSimple(currentNode.getX(), currentNode.getY())] == 0)) {
        amafTaulu[Pelilauta.toSimple(currentNode.getX(), currentNode.getY())] =
            currentNode.getTurn();
      }
      PlacementHandler.pelaaSiirto(currentLauta, currentNode.getX(), currentNode.getY());
    }

    visited.add(currentNode);

    currentLauta = currentNode.simulate(currentLauta, amafTaulu);
    tulos = simulScore(currentLauta);

    if (raveSuoritukset == 0) {
      update(visited, tulos);
    } else {
      updateRAVE(visited, tulos, amafTaulu);
    }
    return;
  }