Commit eefb5a99 authored by MACE Lloyd's avatar MACE Lloyd

Replace MCTS.java

parent 85b65b12
...@@ -22,6 +22,7 @@ public class MCTS { ...@@ -22,6 +22,7 @@ public class MCTS {
double coefficientUCT; double coefficientUCT;
Joueur joueur; Joueur joueur;
Joueur adversaire; Joueur adversaire;
Random r;
//CONSTRUCTEUR //CONSTRUCTEUR
public MCTS(Plateau plateau, Joueur joueur, Joueur adversaire) { public MCTS(Plateau plateau, Joueur joueur, Joueur adversaire) {
...@@ -29,59 +30,54 @@ public class MCTS { ...@@ -29,59 +30,54 @@ public class MCTS {
this.joueur = joueur; this.joueur = joueur;
this.adversaire = adversaire; this.adversaire = adversaire;
System.out.println(joueur + " / " + adversaire); //System.out.println(joueur + " / " + adversaire);
plateau.sauvegardePosition(0); plateau.sauvegardePosition(0);
//coefficientUCT = 0.8;
coefficientUCT = Math.sqrt(2); coefficientUCT = Math.sqrt(2);
r = new Random(System.currentTimeMillis());
Etat etat = new Etat(); Etat etat = new Etat();
etat.setJoueur(joueur); etat.setJoueur(joueur);
racine = new Noeud(); racine = new Noeud();
racine.setEtat(etat); racine.setEtat(etat);
} }
//Obtenir le meilleurCoup grâce au MCTS //Obtenir le meilleurCoup grâce au MCTS
public Coup meilleurCoup() { public Coup meilleurCoup() {
double endTime = System.currentTimeMillis() + 20; //L'algorithme tourne pendant 10s //double endTime = System.currentTimeMillis() + 1000; //L'algorithme tourne pendant 10s
Noeud noeudPrometteur; Noeud noeudPrometteur;
Noeud nouveauNoeud; Noeud noeudSimulation;
Joueur gagnantSimulation; Joueur gagnantSimulation;
ArrayList<Coup> coupsPossibles; ArrayList<Coup> coupsPossibles;
while (System.currentTimeMillis() < endTime) { //while (System.currentTimeMillis() < endTime) {
for (int i=0; i < 5000; i++) {
noeudPrometteur = selection(); noeudPrometteur = selection();
coupsPossibles = plateau.getListeCoups(joueur); coupsPossibles = plateau.getListeCoups(noeudPrometteur.getEtat().getJoueur());
if (coupsPossibles.isEmpty()) { if (coupsPossibles.isEmpty()) {
propagationArriere(noeudPrometteur, plateau.vainqueur()); propagationArriere(noeudPrometteur, plateau.vainqueur());
} }
else { else {
plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur()); noeudSimulation = expansion(noeudPrometteur, coupsPossibles);
while (!coupsPossibles.isEmpty()) { gagnantSimulation = simulation(noeudSimulation);
nouveauNoeud = expansion(noeudPrometteur, coupsPossibles); propagationArriere(noeudSimulation, gagnantSimulation);
gagnantSimulation = simulation(nouveauNoeud);
//System.out.print(gagnantSimulation + " ");
propagationArriere(nouveauNoeud, gagnantSimulation);
plateau.restaurePosition(noeudPrometteur.getEtat().getProfondeur());
}
} }
//System.out.println(); //System.out.println();
//System.out.println("_"); //System.out.println("_");
/*
if (!racine.getListeEnfant().isEmpty()) { if (!racine.getListeEnfant().isEmpty()) {
for (Noeud enfant : racine.getListeEnfant()) { for (Noeud enfant : racine.getListeEnfant()) {
System.out.print(enfant.getEtat().getNbVictoire() + "/" + enfant.getEtat().getNbVisite() + " | "); System.out.print(enfant.getEtat().getScoreVictoire() + " / " + enfant.getEtat().getNbVisite() + " " + enfant.getEtat().getDernierCoup().toString() + " | ");
} }
} }
System.out.println(); System.out.println();
System.out.println(racine.getEtat().getNbVictoire() + "/" + racine.getEtat().getNbVisite()); System.out.println(racine.getEtat().getScoreVictoire() + "/" + racine.getEtat().getNbVisite());
*/
} }
...@@ -106,21 +102,29 @@ public class MCTS { ...@@ -106,21 +102,29 @@ public class MCTS {
//Une fois le meilleur noeud trouvé, on choisit un noeud au hasard parmi tous les noeuds possible. //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) { public Noeud expansion(Noeud noeud, ArrayList<Coup> coupsPossibles) {
Joueur joueurTemp = Util.swapJoueur(noeud.getEtat().getJoueur(), joueur, adversaire); Joueur joueurTemp = Util.swapJoueur(noeud.getEtat().getJoueur(), joueur, adversaire);
int profondeur = noeud.getEtat().getProfondeur(); int newProfondeur = noeud.getEtat().getProfondeur() + 1;
Random r = new Random(); int randomIndex;
int randomIndex = r.nextInt(coupsPossibles.size()); Noeud randomNoeud;
Coup randomCoup = coupsPossibles.remove(randomIndex); Etat newEtat;
plateau.joueCoup(randomCoup); Noeud newNoeud;
Etat etat = new Etat(); for (Coup coup : coupsPossibles) {
etat.setJoueur(joueurTemp); newEtat = new Etat();
etat.setDernierCoup(randomCoup); newEtat.setJoueur(joueurTemp);
etat.setProfondeur(profondeur + 1); newEtat.setDernierCoup(coup);
newEtat.setProfondeur(newProfondeur);
Noeud nouveauNoeud = new Noeud(etat, noeud);
noeud.getListeEnfant().add(nouveauNoeud);
return nouveauNoeud; newNoeud = new Noeud(newEtat, noeud);
noeud.getListeEnfant().add(newNoeud);
}
ArrayList<Noeud> noeudsPossibles = noeud.getListeEnfant();
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 exploré, on simule une partie de coup aléatoire jusqu'à terminer la partie
...@@ -128,132 +132,119 @@ public class MCTS { ...@@ -128,132 +132,119 @@ public class MCTS {
Joueur joueurTemp = noeud.getEtat().getJoueur(); Joueur joueurTemp = noeud.getEtat().getJoueur();
while (!plateau.partieTerminee()) { while (!plateau.partieTerminee()) {
Random r = new Random();
int randomIndex = r.nextInt(plateau.getListeCoups(joueurTemp).size()); int randomIndex = r.nextInt(plateau.getListeCoups(joueurTemp).size());
Coup randomCoup = plateau.getListeCoups(joueurTemp).get(randomIndex); Coup randomCoup = plateau.getListeCoups(joueurTemp).get(randomIndex);
plateau.joueCoup(randomCoup); plateau.joueCoup(randomCoup);
//System.out.println(plateau);
joueurTemp = Util.swapJoueur(joueurTemp, joueur, adversaire); joueurTemp = Util.swapJoueur(joueurTemp, joueur, adversaire);
} }
joueurTemp = plateau.vainqueur(); joueurTemp = plateau.vainqueur();
return joueurTemp; return joueurTemp;
} }
public void propagationArriere(Noeud noeud, Joueur gagnant) { public void propagationArriere(Noeud noeud, Joueur gagnant) {
Noeud parent = noeud; Noeud parent = noeud;
while (parent != null) { while (parent != null) {
parent.getEtat().updateNbVisite(); parent.getEtat().updateNbVisite();
if (gagnant == null) {
parent.getEtat().updateNbVictoire(0.5);
}
if (gagnant != null && parent.getEtat().getJoueur() != gagnant) { if (gagnant != null && parent.getEtat().getJoueur() != gagnant) {
parent.getEtat().updateNbVictoire(); parent.getEtat().updateNbVictoire(1);
} }
parent = parent.getParent(); parent = parent.getParent();
} }
} }
}
/* //_____________________________________________________________________________________________________
//Obtenir le meilleurCoup grâce au MCTS /*
//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() { public Coup meilleurCoup() {
double endTime = System.currentTimeMillis() + 100; //L'algorithme tourne pendant 10s double endTime = System.currentTimeMillis() + 2000; //L'algorithme tourne pendant 10s
//System.out.println(racine.getEtat().getCoupsPossibles()); Noeud noeudPrometteur;
Noeud nouveauNoeud;
Joueur gagnantSimulation;
ArrayList<Coup> coupsPossibles;
while (System.currentTimeMillis() < endTime) { while (System.currentTimeMillis() < endTime) {
Noeud noeudPrometteur;
Noeud nouveauNoeud;
Joueur gagnantSimulation;
noeudPrometteur = selection(); noeudPrometteur = selection();
coupsPossibles = plateau.getListeCoups(noeudPrometteur.getEtat().getJoueur());
if (coupsPossibles.isEmpty()) {
propagationArriere(noeudPrometteur, plateau.vainqueur());
}
//System.out.println(noeudPrometteur.getEtat().getCoupsPossibles()); else {
//System.out.println(racine.getListeEnfant().size()); plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur());
ArrayList<Coup> coupsPossibles = plateau.getListeCoups(joueur);
if (coupsPossibles != null) {
while (!coupsPossibles.isEmpty()) { while (!coupsPossibles.isEmpty()) {
nouveauNoeud = expansion(noeudPrometteur, coupsPossibles); nouveauNoeud = expansion(noeudPrometteur, coupsPossibles);
//System.out.println("profondeur : " + nouveauNoeud.getEtat().getProfondeur());
gagnantSimulation = simulation(nouveauNoeud); gagnantSimulation = simulation(nouveauNoeud);
//System.out.print(resultat + " "); //System.out.println(plateau);
//System.out.println("gagnant : " + gagnantSimulation);
//System.out.print(gagnantSimulation + " ");
propagationArriere(nouveauNoeud, gagnantSimulation); propagationArriere(nouveauNoeud, gagnantSimulation);
//System.out.println(noeudPrometteur.getEtat().getCoupsPossibles()); plateau.restaurePosition(noeudPrometteur.getEtat().getProfondeur());
} }
} }
else {
gagnantSimulation = plateau.vainqueur();
propagationArriere(noeudPrometteur, gagnantSimulation);
}
/*
if (!plateau.getListeCoups(currentJoueur).isEmpty()) {
Util.swapJoueur(currentJoueur, joueur, adversaire);
while(noeudPrometteur.getListeEnfant().size() < plateau.getListeCoups(currentJoueur).size()) {
nouveauNoeud = expansion(noeudPrometteur);
gagnantSimulation = simulation(nouveauNoeud);
//System.out.print(resultat + " ");
propagationArriere(nouveauNoeud, gagnantSimulation);
//System.out.println(noeudPrometteur.getEtat().getCoupsPossibles());
}
}
else {
gagnantSimulation = simulation(noeudPrometteur);
propagationArriere(noeudPrometteur, gagnantSimulation);
}
*/
//System.out.println(); //System.out.println();
//System.out.println("_"); //System.out.println("_");
/*
if (!racine.getListeEnfant().isEmpty()) { if (!racine.getListeEnfant().isEmpty()) {
for (Noeud enfant : racine.getListeEnfant()) { for (Noeud enfant : racine.getListeEnfant()) {
System.out.print(enfant.getEtat().getNbVictoire() + "/" + enfant.getEtat().getNbVisite() + " "); System.out.print(enfant.getEtat().getScoreVictoire() + "/" + enfant.getEtat().getNbVisite() + " | ");
} }
} }
System.out.println(); System.out.println();
System.out.println(racine.getEtat().getNbVictoire() + "/" + racine.getEtat().getNbVisite() + " " ); System.out.println(racine.getEtat().getScoreVictoire() + "/" + racine.getEtat().getNbVisite());
*/ /*
}
}
plateau.restaurePosition(0);
return Util.getMeilleurCoup(racine); return Util.getMeilleurCoup(racine);
} } */
*/
/*
//4 PHASE DU MCTS /*
//4 PHASE DU MCTS
//Selectionne le noeud "prometteur" grâce à UCT. //Selectionne le noeud "prometteur" grâce à UCT.
public Noeud selection() { public Noeud selection() {
plateau.restaurePosition(0); plateau.restaurePosition(0);
currentJoueur = joueur;
Noeud noeudPrometteur = racine; Noeud noeudPrometteur = racine;
while (!noeudPrometteur.getListeEnfant().isEmpty()) { while (!noeudPrometteur.getListeEnfant().isEmpty()) {
noeudPrometteur = UCT.trouverNoeudPrometteur(noeudPrometteur, coefficientUCT); noeudPrometteur = UCT.trouverNoeudPrometteur(noeudPrometteur, coefficientUCT);
Util.swapJoueur(currentJoueur, joueur, adversaire);
plateau.joueCoup(noeudPrometteur.getEtat().getDernierCoup()); plateau.joueCoup(noeudPrometteur.getEtat().getDernierCoup());
plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur()); //plateau.sauvegardePosition(noeudPrometteur.getEtat().getProfondeur());
} }
return noeudPrometteur; 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 choisit un noeud au hasard parmi tous les noeuds possible.
public Noeud expansion(Noeud noeud, ArrayList<Coup> coupsPossibles) { 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 profondeur = noeud.getEtat().getProfondeur();
Random r = new Random();
int randomIndex = r.nextInt(coupsPossibles.size()); int randomIndex = r.nextInt(coupsPossibles.size());
Coup randomCoup = coupsPossibles.remove(randomIndex); Coup randomCoup = coupsPossibles.remove(randomIndex);
plateau.joueCoup(randomCoup); plateau.joueCoup(randomCoup);
plateau.sauvegardePosition(profondeur + 1); //System.out.println(plateau);
Util.swapJoueur(currentJoueur, joueur, adversaire);
Etat etat = new Etat(); Etat etat = new Etat();
//etat.setNumJoueur(currentJoueur.getIdJoueur()); etat.setJoueur(joueurTemp);
etat.setDernierCoup(randomCoup); etat.setDernierCoup(randomCoup);
etat.setProfondeur(profondeur + 1); etat.setProfondeur(profondeur + 1);
...@@ -265,35 +256,35 @@ public class MCTS { ...@@ -265,35 +256,35 @@ public class MCTS {
//A partir du nouveau noeud exploré, on simule une partie de coup aléatoire jusqu'à terminer la partie //A partir du nouveau noeud exploré, on simule une partie de coup aléatoire jusqu'à terminer la partie
public Joueur simulation(Noeud noeud) { public Joueur simulation(Noeud noeud) {
//int resultat = 0; Joueur joueurTemp = noeud.getEtat().getJoueur();
Joueur joueurTemp = currentJoueur;
while (!plateau.partieTerminee()) { while (!plateau.partieTerminee()) {
Random r = new Random();
int randomIndex = r.nextInt(plateau.getListeCoups(joueurTemp).size()); int randomIndex = r.nextInt(plateau.getListeCoups(joueurTemp).size());
Coup randomCoup = plateau.getListeCoups(joueurTemp).get(randomIndex); Coup randomCoup = plateau.getListeCoups(joueurTemp).get(randomIndex);
plateau.joueCoup(randomCoup); plateau.joueCoup(randomCoup);
Util.swapJoueur(joueurTemp, joueur, adversaire); //System.out.println(plateau);
joueurTemp = Util.swapJoueur(joueurTemp, joueur, adversaire);
} }
joueurTemp = plateau.vainqueur();
return plateau.vainqueur(); return joueurTemp;
} }
public void propagationArriere(Noeud noeud, Joueur gagnant) { public void propagationArriere(Noeud noeud, Joueur gagnant) {
Noeud parent = noeud; Noeud parent = noeud;
Joueur joueurTemp = currentJoueur;
while (parent != null) { while (parent != null) {
parent.getEtat().updateNbVisite(); parent.getEtat().updateNbVisite();
if (gagnant != null && currentJoueur != gagnant) { if (gagnant == null) {
parent.getEtat().updateNbVictoire(); parent.getEtat().updateNbVictoire(0.5);
}
if (gagnant != null && parent.getEtat().getJoueur() != gagnant) {
parent.getEtat().updateNbVictoire(1);
} }
parent = parent.getParent(); parent = parent.getParent();
Util.swapJoueur(currentJoueur, joueur, adversaire);
} }
} }
*/
} }
*/
\ No newline at end of file
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