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(); }
/** * 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; }