public GeneticAlgorithm(int populationSize, int dnaSize, float mutationRate, BotVersion botVersion) { nextGame = 0; scoreSum = 0; generation = 1; TBController.UpdateUIGeneration(generation); this.mutationRate = mutationRate; this.botVersion = botVersion; population = new List <TetrisDNA>(); //A new random population is created for (int i = 0; i < populationSize; i++) { TetrisDNA tetrisDNA = new TetrisDNA(dnaSize); tetrisDNA.SetRandomWeights(); population.Add(tetrisDNA); } if (population.Count > 0) { best = population[0]; } }
public static void WriteGeneration(BotVersion botVersion, TetrisGeneration tetrisGeneration) { string path = GetBotVersionGensLogFilePath(botVersion); if (path == "") { Debug.Log("Wrong bot version"); } else { List <TetrisGeneration> currentGenerations = ReadGenerationsList(botVersion, path); if (currentGenerations == null) { currentGenerations = new List <TetrisGeneration>(); } if (tetrisGeneration.genIndex > currentGenerations.Count) { currentGenerations.Add(tetrisGeneration); } else { currentGenerations[tetrisGeneration.genIndex - 1] = tetrisGeneration; } string json = JsonHelper.ToJson(currentGenerations, true); File.WriteAllText(path, json); } }
public static void WriteTesting(BotVersion botVersion, TestingData data) { string path = GetBotVersionTestingLogFilePath(botVersion); string json = JsonUtility.ToJson(data, true); File.AppendAllText(path, json); }
public void DrawValues(List <float> valueList, BotVersion botVersion, float minValue, float maxValue) { int maxElements = valueList.Count; Color circleColor = tetrisBotColor; Color connectionColor = tetrisBotConnectionColor; switch (botVersion) { case BotVersion.MCTSBot: circleColor = mctsBotColor; connectionColor = mctsBotConnectionColor; break; case BotVersion.HumanizedBot: circleColor = humanBotColor; connectionColor = humanBotConnectionColor; break; } float xGap = GraphWidth / maxElements; float yMinimum = 10f; float yMaximum = GraphHeight - yMinimum; if (minValue == maxValue) { maxValue += 0.5f; minValue -= 0.5f; } bool firstCircle = true; Vector2 previousCirclePosition = Vector2.zero; for (int i = 0; i < maxElements; i++) { if (valueList[i] != -1) { float xPosition = xGap * (i + 0.5f); float yPosition = ((valueList[i] - minValue) * (yMaximum - yMinimum) / (maxValue - minValue)) + yMinimum; Vector2 circlePosition = new Vector2(xPosition, yPosition); DrawCircle(circlePosition, circleColor); if (!firstCircle) { DrawConnection(previousCirclePosition, circlePosition, connectionColor); } else { firstCircle = false; } previousCirclePosition = circlePosition; } } }
public static TetrisGeneration GetGeneration(BotVersion botVersion, int index) { TetrisGeneration[] tetrisGenerations = ReadGenerationsArray(botVersion); if (tetrisGenerations == null) { return(null); } if (index >= tetrisGenerations.Length || index < 0) { Debug.LogError("Wrong index. Out of bounds"); return(null); } return(tetrisGenerations[index]); }
private static string GetBotVersionTestingLogFilePath(BotVersion botVersion) { switch (botVersion) { case BotVersion.TetrisBot: return(BasicBotTestingLogFile); case BotVersion.MCTSBot: return(MCTSBotTestingLogFile); case BotVersion.HumanizedBot: return(HumanBotTestingLogFile); } return(""); }
public static List <TetrisGeneration> ReadGenerationsList(BotVersion botVersion, string path = null) { if (path == null) { path = GetBotVersionGensLogFilePath(botVersion); } if (path == "") { Debug.LogError("Wrong bot version"); return(null); } string json = File.ReadAllText(path); return(JsonHelper.FromJsonList <TetrisGeneration>(json)); }
internal static void GetBotPluginsInformation() { if (Server.IsSocketConnected() == false || Core.Player == null) { return; } List <BotPlugin> botPluginHolderList = new List <BotPlugin>(); foreach (PluginContainer botPlugin in PluginManager.Plugins) { BotVersion botVersion = new BotVersion(); botVersion.Build = botPlugin.Plugin.Version.Build; botVersion.Major = botPlugin.Plugin.Version.Major; botVersion.Minor = botPlugin.Plugin.Version.Minor; botVersion.Revision = botPlugin.Plugin.Version.Revision; BotPlugin botPluginItem = new BotPlugin(); botPluginItem.Author = botPlugin.Plugin.Author; botPluginItem.Description = botPlugin.Plugin.Description; botPluginItem.Name = botPlugin.Plugin.Name; botPluginItem.IsEnabled = botPlugin.Enabled; botPluginItem.Version = botVersion; botPluginHolderList.Add(botPluginItem); } LocalPlayer player = Core.Player; BotPluginsMessage botPluginsMessage = new BotPluginsMessage(); botPluginsMessage.CoreAuthKey = Settings.Instance.CoreAuthKey; botPluginsMessage.PlayerName = player.Name; botPluginsMessage.Plugins = new BotPlugins(); botPluginsMessage.Plugins.Plugins = botPluginHolderList; Server.QueueMessage(JsonConvert.SerializeObject(botPluginsMessage)); }
private KeyValuePair <float, float> SendDataToDrawer(BotVersion botVersion, int maxElements) { List <float> data = new List <float>(); float minValue = float.MaxValue; float maxValue = float.MinValue; if (trainingTestingDropdown.value == 0) { List <TetrisGeneration> botVersionTrainingData = null; switch (botVersion) { case BotVersion.TetrisBot: botVersionTrainingData = tetrisBotTrainingData; break; case BotVersion.MCTSBot: botVersionTrainingData = mctsBotTrainingData; break; case BotVersion.HumanizedBot: botVersionTrainingData = humanBotTrainingData; break; } for (int i = 0; i < botVersionTrainingData.Count; i++) { float value = -1; switch ((TetrisDataStat)statDropdown.value) { case TetrisDataStat.BestScore: value = botVersionTrainingData[i].bestScore; data.Add(value); break; case TetrisDataStat.ScoreMean: value = botVersionTrainingData[i].scoreMean; data.Add(value); break; case TetrisDataStat.Lines: value = botVersionTrainingData[i].lines; data.Add(value); break; case TetrisDataStat.Level: value = botVersionTrainingData[i].level; data.Add(value); break; } if (value != -1) { if (value < minValue) { minValue = value; } else if (value > maxValue) { maxValue = value; } } } if (maxElements > botVersionTrainingData.Count) { for (int i = botVersionTrainingData.Count; i < maxElements; i++) { data.Add(-1); } } } else { //TODO } GraphDrawer.DrawValues(data, botVersion, minValue, maxValue); return(new KeyValuePair <float, float>(minValue, maxValue)); }