ColoringMove MonteCarloSelection::selectMove() { //synchro avec le vrai graphe //recuperation du coup de l'adversaire vertex v; color c=-1; bool found; VertexIterator it = game.getGraph().getVertices(); while(it.hasNext()) { if(game.getGraph().getVertexProperties(it.getCurrent()).getColor() != tree->getGame()->getGraph().getVertexProperties(it.getCurrent()).getColor()) { v = it.getCurrent(); c = game.getGraph().getVertexProperties(v).getColor(); found = true; break; } it.moveNext(); } if(found) { //synchro de l'arbre std::vector<MonteCarloNode*> children = tree->getChildren(); for(std::vector<MonteCarloNode*>::iterator it=children.begin() ; it != children.end() ; ++it) { ColoringMove* move = (*it)->getMove(); if(move->getVertex()==v && move->getColor()==c) { (*it)->playMove(); tree=(*it); tree->deleteParent(); break; } } } //simulations simulate(tree, nb_simu, minimize, UCB1); //selection du coup std::vector<MonteCarloNode*> children = tree->getChildren(); MonteCarloNode* best(children.at(0)); int nbWon = best->gamesWon; for(std::vector<MonteCarloNode*>::iterator it=children.begin() ; it != children.end() ; ++it) { switch(minimize) { case false: if((*it)->gamesWon > nbWon) { nbWon = (*it)->gamesWon; best = (*it); } break; case true: if((*it)->gamesWon < nbWon) { nbWon = (*it)->gamesWon; best = (*it); } break; } } best->playMove(); tree = best; tree->deleteParent(); return *(tree->getMove()); }