Commit f8cbd57c authored by MACE Lloyd's avatar MACE Lloyd

Replace MCTS.java

parent eefb5a99
......@@ -30,8 +30,6 @@ public class MCTS {
this.joueur = joueur;
this.adversaire = adversaire;
//System.out.println(joueur + " / " + adversaire);
plateau.sauvegardePosition(0);
//coefficientUCT = 0.8;
coefficientUCT = Math.sqrt(2);
......@@ -47,30 +45,27 @@ public class MCTS {
//Obtenir le meilleurCoup grâce au MCTS
public Coup meilleurCoup() {
//double endTime = System.currentTimeMillis() + 1000; //L'algorithme tourne pendant 10s
//double endTime = System.currentTimeMillis() + 1000; // temps en milliseconde
Noeud noeudPrometteur;
Noeud noeudSimulation;
Joueur gagnantSimulation;
ArrayList<Coup> coupsPossibles;
//while (System.currentTimeMillis() < endTime) {
for (int i=0; i < 5000; i++) {
for (int i=0; i < 2000; i++) { //nombre d'itérations variable
noeudPrometteur = selection();
coupsPossibles = plateau.getListeCoups(noeudPrometteur.getEtat().getJoueur());
if (coupsPossibles.isEmpty()) {
if (plateau.partieTerminee()) {
propagationArriere(noeudPrometteur, plateau.vainqueur());
}
else {
coupsPossibles = plateau.getListeCoups(noeudPrometteur.getEtat().getJoueur());
noeudSimulation = expansion(noeudPrometteur, coupsPossibles);
gagnantSimulation = simulation(noeudSimulation);
propagationArriere(noeudSimulation, gagnantSimulation);
}
//System.out.println();
//System.out.println("_");
/* //TESTS
if (!racine.getListeEnfant().isEmpty()) {
for (Noeud enfant : racine.getListeEnfant()) {
System.out.print(enfant.getEtat().getScoreVictoire() + " / " + enfant.getEtat().getNbVisite() + " " + enfant.getEtat().getDernierCoup().toString() + " | ");
......@@ -78,9 +73,9 @@ public class MCTS {
}
System.out.println();
System.out.println(racine.getEtat().getScoreVictoire() + "/" + racine.getEtat().getNbVisite());
*/
}
plateau.restaurePosition(0);
return Util.getMeilleurCoup(racine);
}
......@@ -89,23 +84,21 @@ public class MCTS {
//Selectionne le noeud "prometteur" grâce à UCT.
public Noeud selection() {
plateau.restaurePosition(0);
Noeud noeudPrometteur = racine;
while (!noeudPrometteur.getListeEnfant().isEmpty()) {
noeudPrometteur = UCT.trouverNoeudPrometteur(noeudPrometteur, coefficientUCT);
plateau.joueCoup(noeudPrometteur.getEtat().getDernierCoup());
//plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur());
}
return noeudPrometteur;
}
//Une fois le meilleur noeud trouvé, on choisit un noeud au hasard parmi tous les noeuds possible.
//Une fois le meilleur noeud trouvé, on créé tous les noeuds enfant possible, et on en choisit un au hasard.
public Noeud expansion(Noeud noeud, ArrayList<Coup> coupsPossibles) {
Joueur joueurTemp = Util.swapJoueur(noeud.getEtat().getJoueur(), joueur, adversaire);
int newProfondeur = noeud.getEtat().getProfondeur() + 1;
int randomIndex;
Noeud randomNoeud;
Etat newEtat;
Noeud randomNoeud;
Noeud newNoeud;
for (Coup coup : coupsPossibles) {
......@@ -123,11 +116,10 @@ public class MCTS {
randomIndex = r.nextInt(noeudsPossibles.size());
randomNoeud = noeudsPossibles.get(randomIndex);
plateau.joueCoup(randomNoeud.getEtat().getDernierCoup());
//System.out.println(plateau);
return randomNoeud;
}
//A partir du nouveau noeud exploré, on simule une partie de coup aléatoire jusqu'à terminer la partie
//A partir du nouveau noeud choisi durant l'expansion, on simule une partie de coup aléatoire jusqu'à terminer la partie.
public Joueur simulation(Noeud noeud) {
Joueur joueurTemp = noeud.getEtat().getJoueur();
......@@ -135,142 +127,16 @@ public class MCTS {
int randomIndex = r.nextInt(plateau.getListeCoups(joueurTemp).size());
Coup randomCoup = plateau.getListeCoups(joueurTemp).get(randomIndex);
plateau.joueCoup(randomCoup);
//System.out.println(plateau);
joueurTemp = Util.swapJoueur(joueurTemp, joueur, adversaire);
}
joueurTemp = plateau.vainqueur();
return joueurTemp;
}
public void propagationArriere(Noeud noeud, Joueur gagnant) {
Noeud parent = noeud;
while (parent != null) {
parent.getEtat().updateNbVisite();
if (gagnant == null) {
parent.getEtat().updateNbVictoire(0.5);
}
if (gagnant != null && parent.getEtat().getJoueur() != gagnant) {
parent.getEtat().updateNbVictoire(1);
}
parent = parent.getParent();
}
}
//_____________________________________________________________________________________________________
/*
//VERSION QUI A L'AIR DE FONCTIONNER AU PREMIER COUP (JOUE AU MILIEU) MAIS LES SIMULATIONS DEVRAIENT SE FAIRE UNIQUEMENT APRES LA SELECTION, ET UNE SEULE FOIS
//LA JE FAIS PLUSIEURS SIMULATION POUR UNE SEULE SELECTION
//Obtenir le meilleurCoup grâce au MCTS
public Coup meilleurCoup() {
double endTime = System.currentTimeMillis() + 2000; //L'algorithme tourne pendant 10s
Noeud noeudPrometteur;
Noeud nouveauNoeud;
Joueur gagnantSimulation;
ArrayList<Coup> coupsPossibles;
while (System.currentTimeMillis() < endTime) {
noeudPrometteur = selection();
coupsPossibles = plateau.getListeCoups(noeudPrometteur.getEtat().getJoueur());
if (coupsPossibles.isEmpty()) {
propagationArriere(noeudPrometteur, plateau.vainqueur());
}
else {
plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur());
while (!coupsPossibles.isEmpty()) {
nouveauNoeud = expansion(noeudPrometteur, coupsPossibles);
//System.out.println("profondeur : " + nouveauNoeud.getEtat().getProfondeur());
gagnantSimulation = simulation(nouveauNoeud);
//System.out.println(plateau);
//System.out.println("gagnant : " + gagnantSimulation);
//System.out.print(gagnantSimulation + " ");
propagationArriere(nouveauNoeud, gagnantSimulation);
plateau.restaurePosition(noeudPrometteur.getEtat().getProfondeur());
}
}
//System.out.println();
//System.out.println("_");
if (!racine.getListeEnfant().isEmpty()) {
for (Noeud enfant : racine.getListeEnfant()) {
System.out.print(enfant.getEtat().getScoreVictoire() + "/" + enfant.getEtat().getNbVisite() + " | ");
}
}
System.out.println();
System.out.println(racine.getEtat().getScoreVictoire() + "/" + racine.getEtat().getNbVisite());
}
plateau.restaurePosition(0);
return Util.getMeilleurCoup(racine);
} */
/*
//4 PHASE DU MCTS
//Selectionne le noeud "prometteur" grâce à UCT.
public Noeud selection() {
plateau.restaurePosition(0);
Noeud noeudPrometteur = racine;
while (!noeudPrometteur.getListeEnfant().isEmpty()) {
noeudPrometteur = UCT.trouverNoeudPrometteur(noeudPrometteur, coefficientUCT);
plateau.joueCoup(noeudPrometteur.getEtat().getDernierCoup());
//plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur());
}
return noeudPrometteur;
}
//Une fois le meilleur noeud trouvé, on choisit un noeud au hasard parmi tous les noeuds possible.
public Noeud expansion(Noeud noeud, ArrayList<Coup> coupsPossibles) {
Joueur joueurTemp = Util.swapJoueur(noeud.getEtat().getJoueur(), joueur, adversaire);
//System.out.println(joueurTemp);
int profondeur = noeud.getEtat().getProfondeur();
int randomIndex = r.nextInt(coupsPossibles.size());
Coup randomCoup = coupsPossibles.remove(randomIndex);
plateau.joueCoup(randomCoup);
//System.out.println(plateau);
Etat etat = new Etat();
etat.setJoueur(joueurTemp);
etat.setDernierCoup(randomCoup);
etat.setProfondeur(profondeur + 1);
Noeud nouveauNoeud = new Noeud(etat, noeud);
noeud.getListeEnfant().add(nouveauNoeud);
return nouveauNoeud;
}
//A partir du nouveau noeud exploré, on simule une partie de coup aléatoire jusqu'à terminer la partie
public Joueur simulation(Noeud noeud) {
Joueur joueurTemp = noeud.getEtat().getJoueur();
while (!plateau.partieTerminee()) {
int randomIndex = r.nextInt(plateau.getListeCoups(joueurTemp).size());
Coup randomCoup = plateau.getListeCoups(joueurTemp).get(randomIndex);
plateau.joueCoup(randomCoup);
//System.out.println(plateau);
joueurTemp = Util.swapJoueur(joueurTemp, joueur, adversaire);
}
joueurTemp = plateau.vainqueur();
return joueurTemp;
}
//Une fois la simulation terminée, on met à jour l'arbre.
public void propagationArriere(Noeud noeud, Joueur gagnant) {
plateau.restaurePosition(0);
Noeud parent = noeud;
while (parent != null) {
......@@ -284,7 +150,5 @@ public class MCTS {
parent = parent.getParent();
}
}
*/
}
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