示例#1
0
        public override void Initialize(GameIA gameTmp)
        {
            Main               = new List <Domino>();
            game               = gameTmp;
            nbDominoInitial    = game.players.Length > 2?6:7;
            nbPiocheInitial    = game.Dominos.Count - game.players.Length * nbDominoInitial;
            nbPioche           = 0;
            EnemyPossibleMains = new Dictionary <Player, List <DominoProbabilite> >();
            while (Main.Count < nbDominoInitial)
            {
                var index  = GameIA.rnd.Next(game.Pioche.Count);
                var domino = game.Pioche[index];
                game.Pioche.RemoveAt(index);
                Main.Add(domino);
            }
            var possibleDominos = game.Dominos.Where(d => !Main.Contains(d));

            foreach (var e in game.players)
            {
                if (e != this)
                {
                    EnemyPossibleMains[e] = new List <DominoProbabilite>();
                    foreach (var d in possibleDominos)
                    {
                        EnemyPossibleMains[e].Add(new DominoProbabilite(d, (double)nbDominoInitial / (double)possibleDominos.Count()));
                    }
                }
            }

            PiocheProbalibites = new List <DominoProbabilite>();
            foreach (var d in possibleDominos)
            {
                PiocheProbalibites.Add(new DominoProbabilite(d, (double)nbPiocheInitial / (double)possibleDominos.Count()));
            }
        }
示例#2
0
        public void Evaluate()
        {
            Dictionary <string, HashSet <string> > playedMatches = new Dictionary <string, HashSet <string> >();

            for (int i = 0; i < GENETIQUE_ITERATION; i++)
            {
                // Selection de celui qui à fait le moins de match
                var gamePlayers = SelectPlayers(playedMatches);

                // 100 games
                Dictionary <string, int> nbWin = new Dictionary <string, int>();
                foreach (var p in gamePlayers)
                {
                    nbWin[p.pl.id] = 0;
                }
                Parallel.For(0, GAME_ITERATION, new ParallelOptions {
                    MaxDegreeOfParallelism = MAX_DEGREE_PARALLEL
                }, k =>
                {
                    GameIA game     = new GameIA(50, 6, gamePlayers.Select(p => p.pl).ToArray());
                    var winnersGame = game.Run();
                    var winnerlist  = winnersGame.Select(w => w.id);
                    lock (syncObj)
                    {
                        foreach (var win in winnersGame)
                        {
                            nbWin[win.id] += 1;
                        }
                    }
                });

                // Mise à jour du classement
                var winners = nbWin.GroupBy(x => x.Value).OrderByDescending(x => x.Key).First();

                var wins = winners.Select(x => x.Key);
                foreach (var win in winners)
                {
                    classement[win.Key].won += 1;
                    foreach (var p in nbWin.Where(x => !wins.Contains(x.Key)))
                    {
                        classement[win.Key].wonGames.Add(new Tuple <string, int>(p.Key, win.Value));
                        classement[p.Key].lostGames.Add(new Tuple <string, int>(win.Key, p.Value));
                    }
                }
            }
        }