Beispiel #1
0
        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];
            }
        }
Beispiel #2
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);
        }
    }
Beispiel #3
0
    public static void WriteTesting(BotVersion botVersion, TestingData data)
    {
        string path = GetBotVersionTestingLogFilePath(botVersion);

        string json = JsonUtility.ToJson(data, true);

        File.AppendAllText(path, json);
    }
Beispiel #4
0
    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;
            }
        }
    }
Beispiel #5
0
    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]);
    }
Beispiel #6
0
    private static string GetBotVersionTestingLogFilePath(BotVersion botVersion)
    {
        switch (botVersion)
        {
        case BotVersion.TetrisBot:
            return(BasicBotTestingLogFile);

        case BotVersion.MCTSBot:
            return(MCTSBotTestingLogFile);

        case BotVersion.HumanizedBot:
            return(HumanBotTestingLogFile);
        }
        return("");
    }
Beispiel #7
0
    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));
    }
Beispiel #8
0
        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));
        }
Beispiel #9
0
    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));
    }