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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); }