/* * Same thing here. Builds the right joint connecting two nodes and applies the gene parameters. */ private void BuildMuscle(MuscleGene gene) { if (gene.enableMode == Gene.EnableMode.Disabled) { return; } muscleDensity += 2f / nodes.Length; Rigidbody node1 = nodes[gene.originNode]; Rigidbody node2 = nodes [gene.connectedNode]; switch (gene.jointType) { case Gene.JointType.Fixed: // node1.transform.position = node2.transform.position; FixedJoint fixedJoint = node1.gameObject.AddComponent <FixedJoint> (); fixedJoint.connectedBody = node2; break; case Gene.JointType.Spring: AxisMuscle muscle = node1.gameObject.AddComponent <AxisMuscle> (); muscle.connectedBody = node2; node2.transform.position = (node1.transform.position + gene.axis * 2); muscle.Spawn(gene); break; } }
private void UseGene(MuscleGene gene) { this.heartBeat = gene.heartBeat; this.contractTime = gene.contractTime; this.contractedLength = gene.contractedLength; this.extensionDistance = gene.extensionDistance; this.movementAxis = gene.axis; this.enableMode = gene.enableMode; }
public void Spawn(MuscleGene gene) { if (gene != null) { this.UseGene(gene); } else { this.RandomizeParams(); } this.Spawn(); }
/* p2 fitness > p1fitness */ public void SetParents( ProunGenome p1, ProunGenome p2, float p1Fitness, float p2Fitness, MutationParams mutationParams) { int p1Size = p1.body.Length; int p2Size = p2.body.Length; int smallerSize = p2Size > p1Size ? p1Size : p2Size; int largerSize = p1Size > p2Size ? p1Size : p2Size; float fitnessRatio = p2Fitness / (p1Fitness + p2Fitness); int newSize = 0; NodeGene[] _newBody = new NodeGene[largerSize]; for (int i = 0; i < smallerSize; i++, newSize++) { _newBody [i] = Utility.genFloat() < fitnessRatio ? p2.body [i] : p1.body [i]; } if (p2Size > p1Size) { for (int i = smallerSize; i < largerSize; i++, newSize++) { _newBody [i] = p2.body [i]; } } NodeGene[] newBody = new NodeGene[newSize]; for (int i = 0; i < newSize; i++) { newBody [i] = _newBody [i]; newBody [i].index = i; } AdjacencyMatrix <MuscleGene> newMind = new AdjacencyMatrix <MuscleGene> (newSize); for (int i = 0; i < smallerSize; i++) { for (int j = 0; j < smallerSize; j++) { MuscleGene muscleGene = p1.mind.GetNeighbor(i, j); if (muscleGene != null) { newMind.SetNeighbor(i, j, muscleGene.Disable()); } } } for (int i = 0; i < p2Size; i++) { for (int j = 0; j < p2Size; j++) { MuscleGene muscleGene = p2.mind.GetNeighbor(i, j); if (muscleGene != null) { newMind.SetNeighbor(i, j, (MuscleGene)muscleGene.Mutate(mutationParams.muscleGeneMutationParams)); } } } this.body = newBody; this.mind = newMind; }