private void CreateFirstGeneration()
    {
        population = new List <ClimberGenetics>(PopulationSize);

        for (int i = 0; i < PopulationSize; i++)
        {
            ClimberGenetics genetics      = new ClimberGenetics();
            int             numActions    = Random.Range(MinActions, MaxActions + 1);
            BodyShapeGene   bodyShapeGene = new BodyShapeGene(
                Random.Range(MinBodyWidth, MaxBodyWidth),
                Random.Range(MinBodyHeight, MaxBodyHeight));
            Gene previousAction = null;

            genetics.Chromosome.Add(bodyShapeGene);

            for (int j = 0; j < numActions; j++)
            {
                Gene actionGene = CreateNewActionGene(genetics, previousAction);

                previousAction = actionGene;
                genetics.Chromosome.Add(actionGene);
            }

            population.Add(genetics);
        }

        Logger.Add("Created random genetic information for a population of " + population.Count);
    }
    private Gene CreateNewActionGene(ClimberGenetics genetics, Gene previousGene)
    {
        Gene     actionGene = null;
        GeneType actionType = RandomGeneType(new[] {
            GeneType.GrabAction,
            GeneType.ReleaseAction,
            GeneType.SwingAction,
            GeneType.NonAction,
        });

        if (actionType == GeneType.GrabAction)
        {
            Vector3 localPoint = Vector3.zero;
            int     index      = Random.Range(0, 4);

            if (index == 0)
            {
                localPoint = new Vector3(-0.5f, -0.5f, 0f);
            }
            else if (index == 1)
            {
                localPoint = new Vector3(0.5f, -0.5f, 0f);
            }
            else if (index == 2)
            {
                localPoint = new Vector3(0.5f, 0.5f, 0f);
            }
            else if (index == 3)
            {
                localPoint = new Vector3(-0.5f, 0.5f, 0f);
            }

            actionGene = new GrabActionGene(localPoint);
        }
        else if (actionType == GeneType.ReleaseAction)
        {
            actionGene = new ReleaseActionGene();
        }
        else if (actionType == GeneType.SwingAction)
        {
            BodyShapeGene bodyShapeGene     = (BodyShapeGene)genetics.Chromosome[0];
            Vector3       localApplyAtPoint = new Vector3(
                Random.Range(-bodyShapeGene.Width * 0.5f, bodyShapeGene.Width * 0.5f),
                Random.Range(-bodyShapeGene.Height * 0.5f, bodyShapeGene.Height * 0.5f),
                0f);
            int   direction = Random.Range(0, 2) == 0 ? -1 : 1;
            float strength  = Random.Range(MinSwingStrength, MaxSwingStrength);

            actionGene = new SwingActionGene(localApplyAtPoint, direction, strength);
        }
        else if (actionType == GeneType.NonAction)
        {
            actionGene = new NonActionGene(Random.Range(MinNonActionTime, MaxNonActionTime));
        }

        return(actionGene);
    }
Beispiel #3
0
    void Start()
    {
        bodyShapeGene = (BodyShapeGene)Genetics.Chromosome[0];
        actionGenes   = new List <Gene>();
        body          = GetComponent <Rigidbody>();
        lineRenderer  = transform.parent.GetComponent <LineRenderer>();
        textMesh      = Text.GetComponent <TextMesh>();

        for (int i = 1; i < Genetics.Chromosome.Count; i++)
        {
            actionGenes.Add(Genetics.Chromosome[i]);
        }

        transform.localScale = new Vector3(bodyShapeGene.Width, bodyShapeGene.Height, 1f);
        previousPosition     = transform.position;
    }
    private void StartFitnessTest()
    {
        GameObject      climberObj;
        Climber         climber;
        ClimberGenetics genetics      = population[currentPopulationIndex];
        BodyShapeGene   bodyShapeGene = (BodyShapeGene)genetics.Chromosome[0];

        isRunningFitnessTest = true;

        climberObj = Instantiate <GameObject>(ClimberPrefab);
        climberObj.transform.parent   = objectsContainer;
        climberObj.transform.position = SpawnPosition - new Vector3(0f, bodyShapeGene.Height * 0.5f, 0f);
        climber           = climberObj.GetComponentInChildren <Climber>();
        climber.Genetics  = genetics;
        currentClimber    = climber;
        currentClimberObj = climberObj;
    }
    private void MutateGene(ClimberGenetics genetics, Gene gene)
    {
        if (gene.Type == GeneType.BodyShape)
        {
            BodyShapeGene bodyShapeGene = (BodyShapeGene)gene;

            bodyShapeGene.Width  += bodyShapeGene.Width * Random.Range(-MutationStrength, MutationStrength);
            bodyShapeGene.Height += bodyShapeGene.Height * Random.Range(-MutationStrength, MutationStrength);
        }
        else if (gene.Type == GeneType.GrabAction)
        {
            if (Random.Range(0f, 1f) < MutationStrength)
            {
                GrabActionGene grabActionGene = (GrabActionGene)gene;
                Vector3        localPoint     = Vector3.zero;
                int            index          = Random.Range(0, 4);

                if (index == 0)
                {
                    localPoint = new Vector3(-0.5f, -0.5f, 0f);
                }
                else if (index == 1)
                {
                    localPoint = new Vector3(0.5f, -0.5f, 0f);
                }
                else if (index == 2)
                {
                    localPoint = new Vector3(0.5f, 0.5f, 0f);
                }
                else if (index == 3)
                {
                    localPoint = new Vector3(-0.5f, 0.5f, 0f);
                }

                grabActionGene.LocalPoint = localPoint;
            }
        }
        else if (gene.Type == GeneType.ReleaseAction)
        {
            // No properties to mutate
        }
        else if (gene.Type == GeneType.SwingAction)
        {
            SwingActionGene swingActionGene = (SwingActionGene)gene;
            BodyShapeGene   bodyShapeGene   = (BodyShapeGene)genetics.Chromosome[0];
            float           localX          = swingActionGene.LocalPoint.x + swingActionGene.LocalPoint.x * Random.Range(-MutationStrength, MutationStrength);
            float           localY          = swingActionGene.LocalPoint.y + swingActionGene.LocalPoint.y * Random.Range(-MutationStrength, MutationStrength);

            swingActionGene.LocalPoint = new Vector3(
                Mathf.Clamp(localX, -bodyShapeGene.Width * 0.5f, bodyShapeGene.Width * 0.5f),
                Mathf.Clamp(localY, -bodyShapeGene.Height * 0.5f, bodyShapeGene.Height * 0.5f),
                swingActionGene.LocalPoint.z);

            if (Random.Range(0f, 1f) < MutationStrength)
            {
                swingActionGene.Direction = Random.Range(0, 2) == 0 ? -1 : 1;
            }

            swingActionGene.Strength = Mathf.Clamp(
                swingActionGene.Strength + swingActionGene.Strength * Random.Range(-MutationStrength, MutationStrength),
                MinSwingStrength,
                MaxSwingStrength);
        }
        else if (gene.Type == GeneType.NonAction)
        {
            NonActionGene nonActionGene = (NonActionGene)gene;

            nonActionGene.Time = Mathf.Clamp(
                nonActionGene.Time + nonActionGene.Time * Random.Range(-MutationStrength, MutationStrength),
                MinNonActionTime,
                MaxNonActionTime);
        }
    }