public void WriteToFiles(string fileName) { //makes it an os-friendly fileName (with the correct / or \ depening on the platform), also makes it unique by adding file endings like (00, 01) fileName = fileName.Replace('/', Path.DirectorySeparatorChar).Replace('\\', Path.DirectorySeparatorChar); TyDebug.LogInfo("Wrote " + fileName); CreatePathIfNonExistent(fileName); WriteCsvFile(fileName, _csvLogs); }
private static void LearnFromExe(string[] args) { TyDebug.LogInfo("Executable Learn"); var enemy = TycheAgent.GetTrainingAgent(0.0f, false); TyLearnSetup learnSetup = new TyLearnSetup(); learnSetup.Rounds = 50; learnSetup.MatchesPerRound = 1; Dictionary <string, string> keyValues = new Dictionary <string, string>(); char[] split = { '=' }; for (int i = 0; i < args.Length; i++) { var keyValuePair = args[i].Split(split, StringSplitOptions.RemoveEmptyEntries); if (keyValuePair.Length == 2) { keyValues.Add(keyValuePair[0], keyValuePair[1]); } else { TyDebug.LogError("Arg '" + args[i] + "' is not allowed"); } } var deck0Value = DeckFu.All.ToString(); keyValues.TryGetValue("deck0", out deck0Value); var deck1Value = DeckFu.All.ToString(); keyValues.TryGetValue("deck1", out deck1Value); int generations = TryGetIntValue(keyValues, "gens", 20); var myDeck = DeckFromEnumString(deck0Value); var hisDeck = DeckFromEnumString(deck1Value); learnSetup.Clear(); learnSetup.Run(generations, myDeck, hisDeck, enemy); }
private static void AllMirroredDecksAllAgents() { const int ROUNDS = 100; const int MATCHES_PER_ROUND = 1; TyDebug.LogInfo("Debug Test"); TyDebug.LogInfo("Total matches: " + (ROUNDS * MATCHES_PER_ROUND)); List <List <TyDeckHeroPair> > decks = new List <List <TyDeckHeroPair> > { DeckFromEnum(DeckFu.Druid), DeckFromEnum(DeckFu.Mage), DeckFromEnum(DeckFu.Paladin), DeckFromEnum(DeckFu.Priest), DeckFromEnum(DeckFu.Rogue), DeckFromEnum(DeckFu.Shaman), DeckFromEnum(DeckFu.Warlock), DeckFromEnum(DeckFu.Warrior) }; //for (int i = 0; i < _allEnemyAgents.Count; i++) { for (int j = 0; j < decks.Count; j++) { var deck = decks[j]; TyDebug.LogInfo(deck[0].Name); for (int l = 0; l < 4; l++) { var myAgent = new TycheAgent(); var enemyAgent = TycheAgent.GetTrainingAgent(); //_allEnemyAgents[i % _allEnemyAgents.Count]; TyMatchSetup training = new TyMatchSetup(myAgent, enemyAgent); training.RunRounds(deck, deck, ROUNDS, MATCHES_PER_ROUND); training.PrintFinalResults(); } } } TyDebug.LogInfo("Press a key to close."); Console.ReadLine(); }
public void RunRounds(List <TyDeckHeroPair> decks0, List <TyDeckHeroPair> decks1, int rounds, int matchesPerRound) { var totalStartTime = TyUtility.GetSecondsSinceStart(); System.Random random = new Random(); var s1 = ""; for (int i = 0; i < decks0.Count; i++) { s1 += decks0[i].Name + ","; } var s2 = ""; for (int i = 0; i < decks1.Count; i++) { s2 += decks1[i].Name + ","; } TyDebug.LogInfo("Decks: " + s1 + " vs. " + s2); for (int i = 0; i < rounds; i++) { var roundStartTime = TyUtility.GetSecondsSinceStart(); var deck0 = decks0.GetUniformRandom(random); var deck1 = decks1.GetUniformRandom(random); var startPlayer = (i % 2) + 1; RunMatches(deck0, deck1, matchesPerRound, startPlayer); var roundTime = TyUtility.GetSecondsSinceStart() - roundStartTime; if (PrintMatchTimes) { PrintFinalResults(roundTime, matchesPerRound); } } _totalTimeUsed = TyUtility.GetSecondsSinceStart() - totalStartTime; }
private static void DebugLearn() { TyDebug.LogInfo("Debug Learn"); var enemy = new BotB.BotB(); TyLearnSetup learnSetup = new TyLearnSetup(); learnSetup.Rounds = 1; learnSetup.MatchesPerRound = 1; const int GENERATIONS = 20; learnSetup.Clear(); learnSetup.Run(GENERATIONS, DeckFromEnum(DeckFu.Mage), DeckFromEnum(DeckFu.Mage), enemy); learnSetup.Clear(); learnSetup.Run(GENERATIONS, DeckFromEnum(DeckFu.Warrior), DeckFromEnum(DeckFu.Warrior), enemy); learnSetup.Clear(); learnSetup.Run(GENERATIONS, DeckFromEnum(DeckFu.Shaman), DeckFromEnum(DeckFu.Shaman), enemy); }
private static void Main(string[] args) { _randomLateAgent = new List <AbstractAgent> { GetAgent(Agent.RandomLate) }; _faceHunterAgent = new List <AbstractAgent> { GetAgent(Agent.FaceHunter) }; _randomAgent = new List <AbstractAgent> { GetAgent(Agent.Random) }; _botBAgent = new List <AbstractAgent> { GetAgent(Agent.BotB) }; _allEnemyAgents = new List <AbstractAgent> { GetAgent(Agent.RandomLate), GetAgent(Agent.FaceHunter), GetAgent(Agent.Random), GetAgent(Agent.BotB) }; TyDebug.Assert(false); //var c = Cards.FromName("Medivh, the Guardian"); //TyDebug.LogInfo(c.AssetId); //var allCards = Cards.All; //foreach(var card in allCards) // TyDebug.LogInfo(card.FullPrint()); QuickTest(); //AllMirroredDecksAllAgents(); //if (args.Length == 0) // DebugLearn(); //else // LearnFromExe(args); }
private static void QuickTest() { const int ROUNDS = 40; const int MATCHES_PER_ROUND = 1; TyDebug.LogInfo("Quick Test Setup"); TyDebug.LogInfo("Total matches to play: " + (ROUNDS * MATCHES_PER_ROUND)); List <List <TyDeckHeroPair> > decks = new List <List <TyDeckHeroPair> > { DeckFromEnum(DeckFu.Shaman) /* * DeckFromEnum(DeckFu.Warrior), * DeckFromEnum(DeckFu.Druid), * DeckFromEnum(DeckFu.Warlock), * DeckFromEnum(DeckFu.Paladin), * DeckFromEnum(DeckFu.Rogue), * DeckFromEnum(DeckFu.Priest), * DeckFromEnum(DeckFu.Mage), */ }; for (int j = 0; j < decks.Count; j++) { var myAgent = TycheAgent.GetSearchTreeAgent(20); var enemyAgent = TycheAgent.GetTrainingAgent(0.0f, false); TyMatchSetup training = new TyMatchSetup(myAgent, enemyAgent); //training.PrintMatchTimes = true; training.RunRounds(decks[j], decks[j], ROUNDS, MATCHES_PER_ROUND); training.PrintFinalResults(); } TyDebug.LogInfo("Press a key to close."); Console.ReadLine(); }
public void Run(int numGenerations, List <TyDeckHeroPair> myDeck, List <TyDeckHeroPair> enemyDeck, AbstractAgent enemyAgent) { var myDeckName = TyDeckHeroPair.GetDeckListPrint(myDeck); var enemyDeckName = TyDeckHeroPair.GetDeckListPrint(enemyDeck); FileName = myDeckName + "Vs" + enemyDeckName + "_" + enemyAgent.GetType().Name; while (File.Exists(FileName + ".txt")) { FileName += "0"; } WriteGlobalToFile(); TyDebug.LogInfo(FileName); TyDebug.LogInfo("Generations: " + numGenerations); for (int step = 0; step < numGenerations; step++) { var startDate = DateTime.Now; Train(_currentPopulation, myDeck, enemyDeck, enemyAgent); var children = GiveBirth(SelectFittest(_currentPopulation), _random, step + 1); Train(children, myDeck, enemyDeck, enemyAgent); _currentPopulation = MixPopulations(_currentPopulation, children, step + 1); Log("Generation " + (step)); LogPopulation(_currentPopulation); var diff = DateTime.Now.Subtract(startDate); Log("Generation took " + diff.Minutes + " min, " + diff.Seconds + " s"); WriteCurrentToFile(FileName + ".txt"); _csvLog.WriteToFiles(FileName); } }
private void PrintFinalResults(double time, int matches) { TyDebug.LogInfo("Result: " + _agent0.GetType().Name + ": " + ((float)_agent0Wins / (float)_totalPlays) * 100.0f + "% vs " + _agent1.GetType().Name + ": " + ((float)_agent1Wins / (float)_totalPlays) * 100.0f + "%. " + matches + " matches took " + time.ToString("0.000") + "s"); }