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