public double[] bayesExpand2(Pelilauta lauta, int max) { this.children = new NodenLapset(); double[] values = new double[Pelilauta.getKoko() * Pelilauta.getKoko()]; double[] negatives = new double[values.length]; double sum; Node node; children.setMaxKoko(max); int pattern; int location; for (int i = 0; i < values.length; i++) { values[i] = 0; } for (int i = 0; i < Pelilauta.getKoko() * Pelilauta.getKoko(); i++) { if (!PlacementHandler.onkoLaillinenSiirto(lauta, Pelilauta.toX(i), Pelilauta.toY(i))) { continue; } pattern = Pattern.match(lauta, Pelilauta.toX(i), Pelilauta.toY(i)); if (lauta.getTurn() == Pelilauta.VALKEA) { pattern = Pattern.swapColors(pattern); } for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { if (Pelilauta.onLaudalla(Pelilauta.toX(i) + k, Pelilauta.toY(i) + l)) { location = Pelilauta.toSimple(Pelilauta.toX(i) + k, Pelilauta.toY(i) + l); // values[location] += Math.log(Pattern.patternMovePredictions(pattern, k, l)) - // Math.log(Pattern.patternMovePredictions(pattern, k, l)); values[location] += Pattern.patternMovePredictions(pattern, k, l); } } } } sum = 0; for (int i = 0; i < Pelilauta.getKoko() * Pelilauta.getKoko(); i++) { if (!PlacementHandler.onkoLaillinenSiirto(lauta, Pelilauta.toX(i), Pelilauta.toY(i))) { continue; } sum += values[i]; } for (int i = 0; i < values.length; i++) { if (!PlacementHandler.onkoLaillinenSiirto(lauta, Pelilauta.toX(i), Pelilauta.toY(i))) { continue; } values[i] = values[i] / (sum); node = new Node(lauta, Pelilauta.toX(i), Pelilauta.toY(i)); node.raveVierailut += 5000 * values[i]; node.raveVoitot += (node.raveVierailut * 56) / 100; this.children.addNode(node); } children.sort(); return values; }
public static Pelilauta bayesSimulate(Pelilauta lauta, int[] amafTaulu) { double probability; double maxProbability; int maxSimple; while (lauta.getMoveNumber() < 700) { maxSimple = -1; maxProbability = -1; for (int i = 0; i < Pelilauta.getKoko() * Pelilauta.getKoko(); i++) { if (!PlacementHandler.onkoLaillinenSiirto(lauta, Pelilauta.toX(i), Pelilauta.toY(i)) || PlacementHandler.tuhoaakoSiirtoOmanSilman( lauta, Pelilauta.toX(i), Pelilauta.toY(i))) { continue; } probability = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { if (Pelilauta.onLaudalla(Pelilauta.toX(i) + k, Pelilauta.toY(i) + l)) { if (lauta.getTurn() == Pelilauta.MUSTA) { probability += Pattern.patternMovePredictions( Pattern.match(lauta, Pelilauta.toX(i) + k, Pelilauta.toY(i) + l), -k, -l); } else { probability += Pattern.patternMovePredictions( Pattern.swapColors( Pattern.match(lauta, Pelilauta.toX(i) + k, Pelilauta.toY(i) + l)), -k, -l); } } } } if (probability > maxProbability) { maxSimple = i; } } if (maxSimple == -1) { if (lauta.isPassedOnLastMove()) { break; } PlacementHandler.pass(lauta); continue; } PlacementHandler.pelaaSiirto(lauta, Pelilauta.toX(maxSimple), Pelilauta.toY(maxSimple)); if (amafTaulu[maxSimple] == 0) { amafTaulu[maxSimple] = lauta.getTurn(); } } // System.err.println("Siirtoja: " + lauta.getMoveNumber()); return lauta; }