std::vector<ParseTree*> XPathTokenElement::evaluate(ParseTree* t) { // return all children of t that match nodeName std::vector<ParseTree*> nodes; for (auto c : t->children) { if (antlrcpp::is<TerminalNode*>(c)) { TerminalNode* tnode = dynamic_cast<TerminalNode*>(c); if ((tnode->getSymbol()->getType() == _tokenType && !_invert) || (tnode->getSymbol()->getType() != _tokenType && _invert)) { nodes.push_back(tnode); } } } return nodes; }
int GpModel::main( int argc, char** argv ) { GpModel model(30); model.setCrossoverOperator(new RegularAndFairSizeCrossover(200)); model.setMutationOperator(new RegularMutation()); model.setReproductionOperator(new RegularReproduction()); model.getTreeGenerator().setPreferredDepth(2); model.getTreeGenerator().setPreferredMethod(TreeGenerator::M_RAMPED); model.setLowerFitnessBetter(true); model.create(); model.setProbabilityCrossover(1.0); model.setProbabilityMutation(0.01); model.setProbabilityReproduction(1 - (model.getProbabilityCrossover() + model.getProbabilityMutation())); TestFunctionListener listener; // for (int i = 0; i < 1000; ++i) { int i = 0; while (true) { ++i; double average_fitness = 0.0; double average_size = 0.0; for (int j = 0; j < model.getPopulationSize(); ++j) { TerminalNode* node = model.evaluate(model.getTree(j), listener); int fitness = node->getValue(); delete node; model.getTree(j).setFitness(abs(fitness)); average_fitness += abs(fitness); average_size += model.getTree(j).getSize(); } BDEBUG("avg-size=" + TO_STRING(average_size / model.getPopulationSize()) + "\tavg-fitness=" + TO_STRING(average_fitness / model.getPopulationSize()) + "\tepoch=" + TO_STRING(i) + ""); model.step(); // model.crossover(); } return 0; }