コード例 #1
0
ファイル: UniformCrossover.cpp プロジェクト: NGTOne/libHierGA
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;
}
コード例 #2
0
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;
}