Commit 7947fda7 authored by CRESCENCE Cassandre's avatar CRESCENCE Cassandre

Upload New File

parent b1ca7639
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tictactoecodingame;
import java.lang.Math;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import tictactoecodingame.Plateau;
import tictactoecodingame.Coup;
/**
*
* @author franck.tempet
*/
public class AlgoRechercheAleatoire extends AlgoRecherche{
Random rnd;
public AlgoRechercheAleatoire() {
rnd = new Random();
}
// PHASE DE SELECTION
public static double uctValue(int totalVisit, double nodeWinScore, int nodeVisit) { // méthode pour calculer UCT du noeud enfant d'un noeud parent donné
if (nodeVisit == 0){
return Integer.MAX_VALUE;
}
return nodeWinScore/((double) nodeVisit) + 1.41*Math.sqrt((double) Math.log( (double) (totalVisit/nodeVisit)));
}
public Node selectNodeWithBestUCT(Node parent){ // méthode pour sélectionner le noeud enfant qui a le plus grand UCT
double max = Integer.MIN_VALUE;
int totalVisit = parent.getState().getVisitCount();
for(Node child : parent.getChildArray()){
double uctValue = uctValue(totalVisit, child.getState().getWinScore(), child.getState().getVisitCount() );
int i =0;
if (uctValue> max){ // sélection du noeud possédant le meilleur uct et paramètrage de celui-ci
max = uctValue;
Node selectedNode= child;
selectedNode.setParent(parent);
parent.getChildArray().remove(child);
selectedNode.setChildArray(parent.getChildArray());
parent.getChildArray().add(child);
selectedNode.setCoupAssocie(parent.getState().getAllPossibleStates().get(i));
i=i + 1;
}
}
return selectedNode;
}
// PHASE D'EXPANSION
public static void expandNode(Node node, Tree tree){
State newState = new State(node.getState().getPlateau(), node.getParent().getState().getJoueur(), 0, 0);
node.setState(newState);
tree.getTree().add(node);
}
// PHASE DE SIMULATION
public boolean simulationFromNode(Node node, boolean _ponder){ // A FINIR
State state= node.getState();
Joueur joueur = state.getJoueur();
state.getPlateau().joueCoup(node.getCoupAssocie());
state.getPlateau().sauvegardePosition(0);
int i = 1;
if (state.getPlateau().partieTerminee() != true){
ArrayList<Coup> coups = state.getPlateau().getListeCoups(joueur);
Coup coupAleatoire = coups.get(rnd.nextInt( coups.size()));
state.getPlateau().joueCoup( coupAleatoire);
state.getPlateau().sauvegardePosition(i);
i=i+1;
}
else{
if (state.getPlateau().vainqueur() == joueur ){
return true;
}
if (state.getPlateau().vainqueur() != joueur){
return false;
}
for(int k=1; k<=i; k--){
state.getPlateau().restaurePosition(k);
}
}
}
// PHASE DE BACKPROPAGATION
public static void backpropagation(Tree tree, boolean resultatSimulation){
for(Node node: tree.getTree() ){
int a = node.getState().getVisitCount();
node.getState().setVisitCount(a + 1);
if(resultatSimulation == true){
node.getState().setWinScore(node.getState().getWinScore() + 1);
}
}
}
@Override
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) {
ArrayList<Coup> coups = _plateau.getListeCoups(_joueur);
return coups.get(rnd.nextInt( coups.size()));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment