コード例 #1
0
ファイル: Mutation.cs プロジェクト: qwak623/dominion
        public override void Mutate(BuyAgenda agenda, List <Card> kingdom)
        {
            if (agenda.BuyMenu.Count <= 1)
            {
                return;
            }

            int i = rnd.Next(agenda.BuyMenu.Count);

            agenda.BuyMenu.RemoveAt(i);
        }
コード例 #2
0
ファイル: Mutation.cs プロジェクト: qwak623/dominion
        public override void Mutate(BuyAgenda agenda, List <Card> kingdom)
        {
            if (agenda.BuyMenu.Count == 0)
            {
                return;
            }

            int i = rnd.Next(agenda.BuyMenu.Count);
            int j = rnd.Next(kingdom.Count);

            agenda.BuyMenu.Insert(i, (kingdom[j].Type, rnd.Next(9) + 1));
        }
コード例 #3
0
ファイル: Mutation.cs プロジェクト: qwak623/dominion
        public override void Mutate(BuyAgenda agenda, List <Card> kingdom)
        {
            if (agenda.BuyMenu.Count == 0)
            {
                return;
            }

            int i = rnd.Next(agenda.BuyMenu.Count);
            int j = rnd.Next(agenda.BuyMenu.Count);

            var tuple = agenda.BuyMenu[i];

            agenda.BuyMenu[i] = agenda.BuyMenu[j];
            agenda.BuyMenu[j] = tuple;
        }
コード例 #4
0
ファイル: Mutation.cs プロジェクト: qwak623/dominion
        public override void Mutate(BuyAgenda agenda, List <Card> kingdom)
        {
            int i = rnd.Next(3);

            switch (i)
            {
            case 0:
                agenda.Estates += rnd.NextSign();
                break;

            case 1:
                agenda.Duchies += rnd.NextSign();
                break;

            case 2:
                agenda.Provinces += rnd.NextSign();
                break;

            default:
                break;
            }
        }
コード例 #5
0
ファイル: Mutation.cs プロジェクト: qwak623/dominion
        public override void Mutate(BuyAgenda agenda, List <Card> kingdom)
        {
            if (agenda.BuyMenu.Count == 0)
            {
                return;
            }

            int i = rnd.Next(agenda.BuyMenu.Count);

            var tuple = agenda.BuyMenu[i];

            tuple.Number += rnd.NextSign();

            // if number = 0 card is never bought anyway
            if (tuple.Number == 0)
            {
                agenda.BuyMenu.RemoveAt(i);
                return;
            }

            agenda.BuyMenu[i] = tuple;
        }
コード例 #6
0
        public override double Evaluate(BuyAgenda agenda, BuyAgenda[] leaders, List <Card> k, int minGames, int maxGames, int parallelDegree)
        {
            double fitness = 0;
            object obj     = new object();

            //foreach (var leader in leaders)
            Parallel.ForEach(leaders, new ParallelOptions {
                MaxDegreeOfParallelism = parallelDegree
            }, leader =>
            {
                int wins = 0;
                int gameIndex;
                bool significantDifferenceFound = false;
                for (gameIndex = 0; gameIndex < maxGames && !significantDifferenceFound; gameIndex++)
                {
                    User[] users    = { new ProvincialAI(agenda), new ProvincialAI(leader) };
                    Kingdom kingdom = k.GetKingdom(users.Length);

                    var game   = new Game(users, kingdom);
                    var task   = game.Play();
                    var result = task.Result;

                    //wins += result.Score[0].CompareTo(result.Score[1]);
                    wins += result.Compare2Players();

                    if (gameIndex >= minGames && gameIndex % 200 == 0)
                    {
                        double errorMargin         = 2.0 / Math.Sqrt(gameIndex + 1);
                        double spread              = Math.Abs(wins / (double)gameIndex);
                        significantDifferenceFound = (errorMargin <= spread);
                    }
                }

                lock (obj)
                    fitness += wins / (double)gameIndex;
                //}
            });
            return(fitness);
        }
コード例 #7
0
 public abstract double Evaluate(BuyAgenda agenda, BuyAgenda[] leaders, List <Card> k, int minGames, int maxGames, int parallelDegree);
コード例 #8
0
ファイル: ProvincialAI.cs プロジェクト: qwak623/dominion
 public ProvincialAI(BuyAgenda buyAgenda, string name = nameof(ProvincialAI))
 {
     this.buyAgenda = buyAgenda.Clone();
     this.name      = name;
 }
コード例 #9
0
ファイル: Mutation.cs プロジェクト: qwak623/dominion
 /// <summary>
 /// Mutation changes agenda in parameter based on kingdom kards and it does not create new buyAgenda.
 /// </summary>
 /// <param name="agenda"></param>
 /// <param name="kingdom"></param>
 public abstract void Mutate(BuyAgenda agenda, List <Card> kingdom);