std::vector<GenomeTemplate> UniformCrossover::crossOver( std::vector<GenomeTemplate> parents ) { unsigned int shortestGenomeLength = this->shortestGenome(parents); if ( !this->parentProbabilities.empty() && this->parentProbabilities.size() < parents.size() ) throw MismatchedCountsException("Number of probabilities needs to match the number of parents!"); std::vector<GenomeTemplate> children; for (unsigned int i = 0; i < this->numOffspring; i++) { GenomeTemplate child; for (unsigned int k = 0; k < shortestGenomeLength; k++) if (this->parentProbabilities.empty()) { child.add(HierRNG::choose(parents).getGene(k)); } else { child.add(HierRNG::choose( parents, this->parentProbabilities ).getGene(k)); } children.push_back(child); } return children; }
GenomeTemplate BlanketResolver::resolve( std::vector<Genome*> blanketGenomes, std::vector<bool> & usedGenomes, unsigned int target ) { GenomeTemplate resolved; GenomeTemplate unresolved = blanketGenomes[target]->getTemplate(); for (unsigned int i = 0; i < unresolved.genomeLength(); i++) { Locus * temp = unresolved.getLocus(i); if (!temp->isConstructive()) { resolved.add(unresolved.getGene(i)); } else { resolved.add(BlanketResolver::resolve( blanketGenomes, usedGenomes, BlanketResolver::findMetaComponentIndex( blanketGenomes, usedGenomes, ((PopulationLocus*)temp)->getNode() ) )); } } return resolved; }