private GNNSpiecies GetRandomSpiecieByFitness() { GNNSpiecies famTree = spiecies[0]; float num = Random.Range(0, 1.0f); if (fullSpieciesScore == 0) { foreach (GNNSpiecies sp in spiecies) { fullSpieciesScore += sp.score; } } double cumulative = 0; foreach (GNNSpiecies sp in spiecies) { cumulative += sp.score / fullSpieciesScore; if (num < cumulative) { famTree = sp; break; } } return(famTree); }
private void PopulateSimulations() { unisignedNet = new List <GNNNet>(); foreach (GNNSpiecies spiecie in spiecies) { int keep = (int)(spiecie.family.Count * 0.2f); if (keep == 0) { keep = 1; } for (int i = 0; i < keep; i++) { unisignedNet.Add(spiecie.family[i]); } } GNNNet[] parents = new GNNNet[2]; GNNNet child; int freeSpaces = CONFIG.POPULATION - unisignedNet.Count; for (int i = 0; i < freeSpaces; i++) { GNNSpiecies spiecie = GetRandomSpiecieByFitness(); parents[0] = spiecie.GetRandomNetByFitness(); parents[1] = spiecie.GetRandomNetByFitness(); if (parents[0].fitnessScore < parents[1].fitnessScore) { GNNNet tmp = parents[0]; parents[0] = parents[1]; parents[1] = tmp; } child = parents[0].Breed(parents[1]); if (Random.Range(0, 101) < 50) { child.Mutation(); } if (Random.Range(0, 101) < 10) { child.SafeMutation("node"); } if (Random.Range(0, 101) < 10) { child.SafeMutation("link"); } child.connections = child.connections.OrderBy(x => x.innov).ToList(); unisignedNet.Add(child); } }