Example #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();
  }