ControllerPtr PopulationControlArchitecture::selectParentByBinaryTournament(ControllerPtr exclude) { NewsItem *selectedSolutionA = population->randomNews(exclude); ControllerPtr parentA; if (selectedSolutionA != NULL) { if (debug) { cout << population->getId() << " - ParentA: " << selectedSolutionA->getAgentId() << " (" << selectedSolutionA->getTimestamp() << ")" << endl; } parentA = selectedSolutionA->getContent(); } if (parentA == NULL) { // the population gave us a NULL parent; generate a random one //cout << population->getId() << " - ParentA: NULL" << endl; if (debug) { cout << "Got NULL parent A, generating random parent A." << endl; } parentA = this->createRandomGenome(); } // select a second parent, excluding the first from the selection NewsItem *selectedSolutionB = population->randomNews(parentA, exclude); ControllerPtr parentB; if (selectedSolutionB != NULL) { if (debug) { cout << population->getId() << " - ParentB: " << selectedSolutionB->getAgentId() << " (" << selectedSolutionB->getTimestamp() << ")" << endl; } parentB = selectedSolutionB->getContent(); } if (parentB == NULL) { // the population gave us a NULL parent; generate a random one //cout << population->getId() << " - ParentB: NULL" << endl; if (debug) { cout << "Got NULL parent B, generating random parent B." << endl; } parentB = this->createRandomGenome(); } if (debug) { cout << "ParentA: " << parentA->GetOriginalFitness() << " vs ParentB: " << parentB->GetOriginalFitness() << endl; } if (parentA->GetOriginalFitness() > parentB->GetOriginalFitness()) { return parentA; } else { return parentB; } }