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); }
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)); }
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; }
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; } }
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; }
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); }
public abstract double Evaluate(BuyAgenda agenda, BuyAgenda[] leaders, List <Card> k, int minGames, int maxGames, int parallelDegree);
public ProvincialAI(BuyAgenda buyAgenda, string name = nameof(ProvincialAI)) { this.buyAgenda = buyAgenda.Clone(); this.name = name; }
/// <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);