예제 #1
0
        public override int Jouer(PositionS p, bool asj1)
        {
            sw.Restart();
            Func <int, float, float> phi = (C, W) => (a + W) / (a + C);

            racine = new NoeudS(null, p);
            iter   = 0;
            while (sw.ElapsedMilliseconds < temps)
            {
                NoeudS no = racine;

                do // Sélection
                {
                    no.CalculMeilleurFils(phi, gen);
                    no = no.MeilleurFils();
                } while (no.cross > 0 && no.fils.Length > 0);

                float re = JeuHasard(no.p); // Simulation

                while (no != null)          // Rétropropagation
                {
                    no.cross += 1;
                    no.win   += re;
                    no        = no.pere;
                }
                iter++;
            }
            racine.CalculMeilleurFils(phi, gen);
            int rep = (asj1) ? racine.indiceMeilleurFils1 : racine.indiceMeilleurFils0;

            return(rep);
        }
예제 #2
0
        public virtual float JeuHasard(PositionS p)
        {
            PositionS q = p.Clone();

            while (q.NbCoups1 > 0 && q.NbCoups0 > 0)
            {
                q.EffectuerCoup(gen.Next(0, q.NbCoups1), gen.Next(0, q.NbCoups0));
            }
            return(q.Eval);
        }
예제 #3
0
        public override int Jouer(PositionS p, bool asj1)
        { //Re-ecrire méthode Jouer
            PositionTron pT = (PositionTron)p;
            int choix1 = 0;
            int choix0 = 0; ;
            string c = "";
            if (asj1 == true)
            {
                Console.WriteLine("Vous avez " + pT.NbCoups1 + " coups possibles à choisir." + "Vous pouvez choisir entre 0 et " + (pT.NbCoups1 - 1) + ".");
                Console.WriteLine("sens comme dessous:");
                if (pT.direc1[0, 0] == -1) { Console.WriteLine("Vous pouvez bouger vers le haut"); }
                if (pT.direc1[1, 1] == -1) { Console.WriteLine("Vous pouvez bouger à gauche"); }
                if (pT.direc1[2, 1] == 1) { Console.WriteLine("Vous pouvez bouger à droit"); }
                if (pT.direc1[3, 0] == 1) { Console.WriteLine("Vous pouvez bouger vers le bas"); }
                Console.WriteLine("Joueur 1, entrez votre choix !");
                c = Console.ReadLine();
                while (!Int32.TryParse(c, out choix1) || choix1 > pT.NbCoups1 - 1)
                {
                    Console.WriteLine("Erreur Input!!!entrez votre choix correcte!!!");
                    c = Console.ReadLine();
                    Int32.TryParse(c, out choix1);
                }
            }
            else if (asj1 == false)
            {
                Console.WriteLine("Vous avez " + pT.NbCoups0 + " coups possibles à choisir." + "Vous pouvez choisir entre 0 et " + (pT.NbCoups0 - 1) + ".");
                Console.WriteLine("sens comme dessous:");
                if (pT.direc0[0, 0] == -1)
                {
                    Console.WriteLine("Vous pouvez bougez vers le haut");
                }
                if (pT.direc0[1, 1] == -1)
                {
                    Console.WriteLine("Vous pouvez bougez vers  à gauche");
                }
                if (pT.direc0[2, 1] == 1)
                {
                    Console.WriteLine("Vous pouvez bougez vers à droit");
                }
                if (pT.direc0[3, 0] == 1)
                {
                    Console.WriteLine("Vous pouvez bougez le bas");
                }
                Console.WriteLine("Joueur 0, donnez votre choix !");
                c = Console.ReadLine();
                while (!Int32.TryParse(c, out choix0) || choix1 > pT.NbCoups0 - 1)
                {
                    Console.WriteLine("Erreur Input!!!entrez votre choix correcte!!!");
                    c = Console.ReadLine();
                    Int32.TryParse(c, out choix0);
                }
            }
            return asj1 ? choix1 : choix0;

        }
예제 #4
0
        public NoeudSP MeilleurFils(int j)
        {
            if (fils[indiceMeilleurFils1[j], indiceMeilleurFils0[j]] != null)
            {
                return(fils[indiceMeilleurFils1[j], indiceMeilleurFils0[j]]);
            }
            PositionS q = p.Clone();

            q.EffectuerCoup(indiceMeilleurFils1[j], indiceMeilleurFils0[j]);
            fils[indiceMeilleurFils1[j], indiceMeilleurFils0[j]] = new NoeudSP(this, q, this.N);
            return(fils[indiceMeilleurFils1[j], indiceMeilleurFils0[j]]);
        }
예제 #5
0
        public NoeudS MeilleurFils()
        {
            if (fils[indiceMeilleurFils1, indiceMeilleurFils0] != null)
            {
                return(fils[indiceMeilleurFils1, indiceMeilleurFils0]);
            }
            PositionS q = p.Clone();

            q.EffectuerCoup(indiceMeilleurFils1, indiceMeilleurFils0);
            fils[indiceMeilleurFils1, indiceMeilleurFils0] = new NoeudS(this, q);
            return(fils[indiceMeilleurFils1, indiceMeilleurFils0]);
        }
예제 #6
0
        public override int Jouer(PositionS p, bool asj1)
        {
            sw.Restart();
            Func <int, float, float> phi = (W, C) => (a + W) / (a + C);

            racine = new NoeudSP(null, p, this.N);

            if (racine == null)
            {
                racine = new NoeudSP(null, p, this.N);
            }
            else
            {
                racine = racine.MeilleurFils(0);
                for (int i = 0; i < racine.p.NbCoups1 - 1; i++)
                {
                    for (int j = 0; j < racine.p.NbCoups1 - 1; j++)
                    {
                        if ((racine.fils[i, j] != null) && (racine.fils[i, j].p.Equals(p)))
                        {
                            racine = racine.fils[i, j];
                            break;
                        }
                    }
                }
            }
            int iter = 0;

            while (sw.ElapsedMilliseconds < temps)
            {
                this.TaskList = new List <Task>();
                NoeudSP no = racine;
                for (int i = 0; i < this.N; i++)
                {
                    int j = i;
                    this.TaskList.Add(Task.Run(() => Calcul(no, phi, j)));
                    iter++;
                }

                Task.WaitAll(this.TaskList.ToArray());
            }
            Console.WriteLine("{0} itérations", iter);
            Console.WriteLine(racine);
            racine.CalculMeilleurFils(phi, gen[N - 1]);
            int rep = (asj1) ? racine.indiceMeilleurFils1[0] : racine.indiceMeilleurFils0[0];

            return(rep);
        }
예제 #7
0
 public NoeudSP(NoeudSP pere, PositionS p, int nb_thread)
 {
     this.pere  = pere;                                          //
     this.p     = p;                                             //
     this.fils  = new NoeudSP[this.p.NbCoups1, this.p.NbCoups0]; //
     this.N     = nb_thread;
     this.win   = new int[nb_thread];
     this.cross = new int[nb_thread];
     for (int i = 0; i < N; i++)
     {
         this.win[i]   = 0;
         this.cross[i] = 0;
     }
     this.indiceMeilleurFils1 = new int[nb_thread];
     this.indiceMeilleurFils0 = new int[nb_thread];
 }
예제 #8
0
        public override int Jouer(PositionS p, bool asj1)
        {
            sw.Restart();
            Func <int, float, float> phi = (W, C) => (a + W) / (a + C);

            racine = new NoeudS(null, p);
            int iter = 0;
            int totale_re;

            while (sw.ElapsedMilliseconds < temps)
            {
                this.TaskList = new List <Task <int> >();
                totale_re     = 0;
                NoeudS no = racine;

                do // Sélection
                {
                    no.CalculMeilleurFils(phi, gen[N - 1]);
                    no = no.MeilleurFils();
                } while (no.cross > 0 && no.fils.Length > 0);


                for (int i = 0; i < this.N; i++)//simulation
                {
                    int j = i;
                    TaskList.Add(Task.Run(() => JeuHasard(no.p, j)));
                }
                Task.WaitAll(TaskList.ToArray());
                for (int i = 0; i < TaskList.Count; i++)
                {
                    totale_re += TaskList[i].Result;
                }

                while (no != null) // Rétropropagation
                {
                    no.cross += this.N * 2;
                    no.win   += totale_re;
                    no        = no.pere;
                }

                iter++;
            }
            racine.CalculMeilleurFils(phi, gen[N - 1]);
            int rep = (asj1) ? racine.indiceMeilleurFils1 : racine.indiceMeilleurFils0;

            return(rep);
        }
예제 #9
0
        int JeuHasard(PositionS p, int i)
        {
            PositionS q  = p.Clone();
            int       re = 1;

            while (q.NbCoups1 > 0 && q.NbCoups0 > 0)
            {
                q.EffectuerCoup(gen[i].Next(0, q.NbCoups1), gen[i].Next(0, q.NbCoups0));
            }
            if (q.Eval < 0)
            {
                re = -1;
            }
            if (q.Eval > 0)
            {
                re = 1;
            }
            return(re);
        }
예제 #10
0
 public void NouveauMatch(PositionS pInitiale)
 {
     pCourante = pInitiale.Clone();
 }
예제 #11
0
 //Constructeur de la classe PartieS
 public PartieS(JoueurS j1, JoueurS j0, PositionS pInitiale)
 {
     this.j1   = j1;
     this.j0   = j0;
     pCourante = pInitiale.Clone();
 }
예제 #12
0
 public abstract int Jouer(PositionS p, bool asj1);
예제 #13
0
 public override int Jouer(PositionS p, bool asj1)
 {
     return asj1 ? gen.Next(p.NbCoups1) : gen.Next(p.NbCoups0);
 }
예제 #14
0
 public NoeudS(NoeudS pere, PositionS p)
 {
     this.pere = pere;
     this.p    = p;
     fils      = new NoeudS[this.p.NbCoups1, this.p.NbCoups0];
 }