Ejemplo n.º 1
0
        private void ReceiveResults(string workerOutboxPath, Individual cur)
        {
            // Read the message and then delete the file.
            var results = Toml.ReadFile <ResultsMessage>(workerOutboxPath);

            File.Delete(workerOutboxPath);

            // Save the statistics for this individual.
            cur.ID           = _individualsEvaluated;
            cur.OverallData  = results.OverallStats;
            cur.StrategyData = results.StrategyStats;

            // Save which elements are relevant to the search
            cur.Fitness = cur.OverallData.TotalHealthDifference;

            var os = results.OverallStats;

            Console.WriteLine("------------------");
            Console.WriteLine(string.Format("Eval ({0}):", _individualsEvaluated));
            Console.WriteLine("Win Count: " + os.WinCount);
            Console.WriteLine("Total Health Difference: "
                              + os.TotalHealthDifference);
            Console.WriteLine("Damage Done: " + os.DamageDone);
            Console.WriteLine("Num Turns: " + os.NumTurns);
            Console.WriteLine("Cards Drawn: " + os.CardsDrawn);
            Console.WriteLine("Hand Size: " + os.HandSize);
            Console.WriteLine("Mana Spent: " + os.ManaSpent);
            Console.WriteLine("Mana Wasted: " + os.ManaWasted);
            Console.WriteLine("Strategy Alignment: " + os.StrategyAlignment);
            Console.WriteLine("Dust: " + os.Dust);
            Console.WriteLine("Deck Mana Sum: " + os.DeckManaSum);
            Console.WriteLine("Deck Mana Variance: " + os.DeckManaVariance);
            Console.WriteLine("Num Minion Cards: " + os.NumMinionCards);
            Console.WriteLine("Num Spell Cards: " + os.NumSpellCards);
            Console.WriteLine("------------------");
            foreach (var fs in results.StrategyStats)
            {
                Console.WriteLine("WinCount: " + fs.WinCount);
                Console.WriteLine("Alignment: " + fs.Alignment);
                Console.WriteLine("------------------");
            }

            // Save stats
            bool didHitMaxWins    = cur.OverallData.WinCount > _maxWins;
            bool didHitMaxFitness = cur.Fitness > _maxFitness;

            _maxWins    = Math.Max(_maxWins, cur.OverallData.WinCount);
            _maxFitness = Math.Max(_maxFitness, cur.Fitness);

            // Log the individuals
            _individualLog.LogIndividual(cur);
            if (didHitMaxWins)
            {
                _championLog.LogIndividual(cur);
            }
            if (didHitMaxFitness)
            {
                _fittestLog.LogIndividual(cur);
            }
        }
Ejemplo n.º 2
0
        private void LogIndividual(Individual cur)
        {
            var os = cur.OverallData;

            Console.WriteLine("------------------");
            Console.WriteLine(string.Format("Eval ({0}): {1}",
                                            cur.ID,
                                            string.Join("", cur.ToString())));
            Console.WriteLine("Win Count: " + os.WinCount);
            Console.WriteLine("Average Health Difference: "
                              + os.AverageHealthDifference);
            Console.WriteLine("Damage Done: " + os.DamageDone);
            Console.WriteLine("Num Turns: " + os.NumTurns);
            Console.WriteLine("Cards Drawn: " + os.CardsDrawn);
            Console.WriteLine("Hand Size: " + os.HandSize);
            Console.WriteLine("Mana Spent: " + os.ManaSpent);
            Console.WriteLine("Mana Wasted: " + os.ManaWasted);
            Console.WriteLine("Strategy Alignment: " + os.StrategyAlignment);
            Console.WriteLine("Dust: " + os.Dust);
            Console.WriteLine("Deck Mana Sum: " + os.DeckManaSum);
            Console.WriteLine("Deck Mana Variance: " + os.DeckManaVariance);
            Console.WriteLine("Num Minion Cards: " + os.NumMinionCards);
            Console.WriteLine("Num Spell Cards: " + os.NumSpellCards);
            Console.WriteLine("------------------");
            foreach (var fs in cur.StrategyData)
            {
                Console.WriteLine("WinCount: " + fs.WinCount);
                Console.WriteLine("Alignment: " + fs.Alignment);
                Console.WriteLine("------------------");
            }

            // Save stats
            bool didHitMaxWins =
                cur.OverallData.WinCount > _maxWins;
            bool didHitMaxFitness =
                cur.Fitness > _maxFitness;

            _maxWins    = Math.Max(_maxWins, cur.OverallData.WinCount);
            _maxFitness = Math.Max(_maxFitness, cur.Fitness);

            // Log the individuals
            _individualLog.LogIndividual(cur);
            if (didHitMaxWins)
            {
                _championLog.LogIndividual(cur);
            }
            if (didHitMaxFitness)
            {
                _fittestLog.LogIndividual(cur);
            }
        }
Ejemplo n.º 3
0
        private void CalculateFitness(Individual cur)
        {
            cur.RawFitness = cur.TotalHealthDifference;
            cur.Features   = new [] { cur.DamageDone, cur.NumTurns };
            Console.WriteLine("Raw Fitness: " + cur.RawFitness);

            if (_featureMap.Add(cur))
            {
                // Reassess the fitness of all elements
                var queue = new Queue <Shard>();
                while (!_populationDeque.IsEmpty)
                {
                    Shard curShard = _populationDeque.DeleteMax();
                    curShard.Representative.Fitness =
                        -_featureMap.GetRank(curShard.Representative);
                    queue.Enqueue(curShard);
                }

                while (queue.Count > 0)
                {
                    Shard curShard = queue.Dequeue();
                    _populationDeque.Add(curShard);
                }
            }
            cur.Fitness = -_featureMap.GetRank(cur);
            Console.WriteLine("Fitness: " + cur.Fitness);

            // Save stats
            bool didHitMaxWins =
                cur.WinCount > _maxWins;
            bool didHitMaxFitness =
                cur.RawFitness > _maxFitness;

            _maxWins    = Math.Max(_maxWins, cur.WinCount);
            _maxFitness = Math.Max(_maxFitness, cur.RawFitness);

            // Log individual
            if (didHitMaxWins)
            {
                _champion_log.LogIndividual(cur);
            }
            if (didHitMaxFitness)
            {
                _fittest_log.LogIndividual(cur);
            }
        }
Ejemplo n.º 4
0
        private void CalculateFitness(Individual cur)
        {
            cur.Fitness = cur.TotalHealthDifference;
            Console.WriteLine("Fitness: " + cur.Fitness);

            // Save stats
            bool didHitMaxWins =
                cur.WinCount > _maxWins;
            bool didHitMaxFitness =
                cur.Fitness > _maxFitness;

            _maxWins    = Math.Max(_maxWins, cur.WinCount);
            _maxFitness = Math.Max(_maxFitness, cur.Fitness);

            // Log individual
            if (didHitMaxWins)
            {
                _champion_log.LogIndividual(cur);
            }
            if (didHitMaxFitness)
            {
                _fittest_log.LogIndividual(cur);
            }
        }
Ejemplo n.º 5
0
        private void LogIndividual(Individual cur)
        {
            // Standard IO Logging
            var os = cur.OverallData;

            Console.WriteLine("------------------");
            Console.WriteLine(string.Format("Eval ({0}):", cur.ID));

            /////////////////////////
            //FileStream fileStream = null;
            //string filePath = @"C:\Users\weizsw\iCloudDrive\Documents\Ai for Games\EvoStone\TestBed\StrategySearch\weight.txt";
            ////将待写的入数据从字符串转换为字节数组
            //Encoding encoder = Encoding.UTF8;
            //byte[] bytes = encoder.GetBytes(os.WinCount.ToString());
            //try
            //{
            //    fileStream = File.OpenWrite(filePath);
            //    //设定书写的开始位置为文件的末尾
            //    fileStream.Position = fileStream.Length;
            //    //将待写入内容追加到文件末尾
            //    fileStream.Write(bytes, 0, bytes.Length);
            //}
            //catch (Exception ex)
            //{
            //    Console.WriteLine("文件打开失败{0}", ex.ToString());
            //}
            //finally
            //{
            //    fileStream.Close();
            //}

            //////////////////////

            using (StreamWriter sw = File.AppendText(@"C:\Users\weizsw\iCloudDrive\Documents\Ai for Games\EvoStone\TestBed\StrategySearch\win.txt"))
            {
                sw.Write(os.WinCount.ToString() + ",");
            }

            Console.WriteLine("Win Count: " + os.WinCount);
            Console.WriteLine("Average Health Difference: "
                              + os.AverageHealthDifference);
            Console.WriteLine("Damage Done: " + os.DamageDone);
            Console.WriteLine("Num Turns: " + os.NumTurns);
            Console.WriteLine("Cards Drawn: " + os.CardsDrawn);
            Console.WriteLine("Hand Size: " + os.HandSize);
            Console.WriteLine("Mana Spent: " + os.ManaSpent);
            Console.WriteLine("Mana Wasted: " + os.ManaWasted);
            Console.WriteLine("Strategy Alignment: " + os.StrategyAlignment);
            Console.WriteLine("Dust: " + os.Dust);
            Console.WriteLine("Deck Mana Sum: " + os.DeckManaSum);
            Console.WriteLine("Deck Mana Variance: " + os.DeckManaVariance);
            Console.WriteLine("Num Minion Cards: " + os.NumMinionCards);
            Console.WriteLine("Num Spell Cards: " + os.NumSpellCards);
            Console.WriteLine("------------------");
            foreach (var fs in cur.StrategyData)
            {
                Console.WriteLine("WinCount: " + fs.WinCount);
                Console.WriteLine("Alignment: " + fs.Alignment);
                Console.WriteLine("------------------");
            }

            // Save stats
            bool didHitMaxWins    = cur.OverallData.WinCount > _maxWins;
            bool didHitMaxFitness = cur.Fitness > _maxFitness;

            _maxWins    = Math.Max(_maxWins, cur.OverallData.WinCount);
            _maxFitness = Math.Max(_maxFitness, cur.Fitness);

            // Log the individuals
            _individualLog.LogIndividual(cur);
            if (cur.OverallData.WinCount == _maxWins)
            {
                _championLog.LogIndividual(cur);
            }
            if (cur.Fitness == _maxFitness)
            {
                _fittestLog.LogIndividual(cur);
            }
        }
Ejemplo n.º 6
0
        private void LogIndividual(Individual cur)
        {
            // Standard IO Logging
            var os = cur.OverallData;

            Console.WriteLine("------------------");
            Console.WriteLine(string.Format("Eval ({0}):", cur.ID));

            ///////////////////////////
            FileStream fileStream = null;
            string     filePath   = "/Users/hc/Desktop/wincount.txt";
            //将待写的入数据从字符串转换为字节数组
            Encoding encoder = Encoding.UTF8;

            byte[] bytes = encoder.GetBytes(os.WinCount.ToString() + "\n");
            try
            {
                fileStream = File.OpenWrite(filePath);
                //设定书写的开始位置为文件的末尾
                fileStream.Position = fileStream.Length;
                //将待写入内容追加到文件末尾
                fileStream.Write(bytes, 0, bytes.Length);
            }
            catch (Exception ex)
            {
                Console.WriteLine("文件打开失败{0}", ex.ToString());
            }
            finally
            {
                fileStream.Close();
            }
            //////////////////////////

            Console.WriteLine("Win Count: " + os.WinCount);
            Console.WriteLine("Average Health Difference: "
                              + os.AverageHealthDifference);
            Console.WriteLine("Damage Done: " + os.DamageDone);
            Console.WriteLine("Num Turns: " + os.NumTurns);
            Console.WriteLine("Cards Drawn: " + os.CardsDrawn);
            Console.WriteLine("Hand Size: " + os.HandSize);
            Console.WriteLine("Mana Spent: " + os.ManaSpent);
            Console.WriteLine("Mana Wasted: " + os.ManaWasted);
            Console.WriteLine("Strategy Alignment: " + os.StrategyAlignment);
            Console.WriteLine("Dust: " + os.Dust);
            Console.WriteLine("Deck Mana Sum: " + os.DeckManaSum);
            Console.WriteLine("Deck Mana Variance: " + os.DeckManaVariance);
            Console.WriteLine("Num Minion Cards: " + os.NumMinionCards);
            Console.WriteLine("Num Spell Cards: " + os.NumSpellCards);
            Console.WriteLine("------------------");
            foreach (var fs in cur.StrategyData)
            {
                Console.WriteLine("WinCount: " + fs.WinCount);
                Console.WriteLine("Alignment: " + fs.Alignment);
                Console.WriteLine("------------------");
            }

            // Save stats
            bool didHitMaxWins    = cur.OverallData.WinCount > _maxWins;
            bool didHitMaxFitness = cur.Fitness > _maxFitness;

            _maxWins    = Math.Max(_maxWins, cur.OverallData.WinCount);
            _maxFitness = Math.Max(_maxFitness, cur.Fitness);

            // Log the individuals
            _individualLog.LogIndividual(cur);
            if (cur.OverallData.WinCount == _maxWins)
            {
                _championLog.LogIndividual(cur);
            }
            if (cur.Fitness == _maxFitness)
            {
                _fittestLog.LogIndividual(cur);
            }
        }
Ejemplo n.º 7
0
        private void ReceiveResults(string workerOutboxPath, Individual cur)
        {
            // Read the file and calculate a true fitness
            string[] textLines = File.ReadAllLines(workerOutboxPath);

            // Delete the file!
            File.Delete(workerOutboxPath);

            // Pull out the data from the text of the file.
            char[]   delimeters = { '*' };
            string[] cardNames  = textLines[0].Split(delimeters);
            string[] countText  = textLines[1].Split(delimeters);
            cur.ID       = _individualsEvaluated;
            cur.WinCount = Int32.Parse(textLines[2]);
            cur.TotalHealthDifference = Int32.Parse(textLines[3]);
            cur.DamageDone            = Int32.Parse(textLines[4]);
            cur.NumTurns          = Int32.Parse(textLines[5]);
            cur.CardsDrawn        = Int32.Parse(textLines[6]);
            cur.ManaSpent         = Int32.Parse(textLines[7]);
            cur.StrategyAlignment = Int32.Parse(textLines[8]);

            Console.WriteLine("------------------");
            Console.WriteLine(string.Format("Eval ({0}): {1}",
                                            _individualsEvaluated, cur));
            Console.WriteLine(String.Join(" ", countText));
            Console.WriteLine("Win Count: " + cur.WinCount);
            Console.WriteLine("Total Health Difference: "
                              + cur.TotalHealthDifference);
            Console.WriteLine("Damage Done: " + cur.DamageDone);
            Console.WriteLine("Num Turns: " + cur.NumTurns);
            Console.WriteLine("Cards Drawn: " + cur.CardsDrawn);
            Console.WriteLine("Mana Spent: " + cur.ManaSpent);
            Console.WriteLine("Strategy Alignment: " + cur.StrategyAlignment);
            Console.WriteLine("------------------");

            // Build a build a frequency table based on card usage
            // for each name.
            var cardUsage = new int[_cardSet.Count];

            for (int cardId = 0; cardId < _cardSet.Count; cardId++)
            {
                bool seenCard = false;
                for (int i = 0; i < cardNames.Length; i++)
                {
                    if (_cardSet[cardId].Name.Equals(cardNames[i]))
                    {
                        if (seenCard)
                        {
                            cardUsage[cardId] /= 2;
                        }
                        else
                        {
                            cardUsage[cardId] = Int32.Parse(countText[i]);
                        }
                        seenCard = true;
                    }
                }
            }

            // Put the cards in the order of usage.
            cur.GenerateCardRanking(cardUsage);

            // Log the individual
            _individualLog.LogIndividual(cur);
        }