UCTNode* TreePolicy(UCTNode* node, std::default_random_engine& engine) { Point passPoint(BOARD_SIZE, BOARD_SIZE); while (!(node->row == passPoint.row && node->column == passPoint.column && node->parent != nullptr && node->parent->row == passPoint.row && node->parent->column == passPoint.column)) { // Not terminal UCTNode* newChild = getNewChild(node, engine); if (newChild != nullptr) { node->addChild(newChild); return newChild; } else { node = bestChild(node); } } /*Point pass(BOARD_SIZE, BOARD_SIZE); if (node->move != pass && node->move.color != Empty) { assert(false); }*/ return node; }
float TabuSearch(float **dist, int dim) { int i, j; int no_improve; int *route, *route_new; int **tabu_list; float best_so_far = (float)INF; float cur_dist = (float)INF; srand(time(NULL)); // Init tabu list, a 2D triangle list tabu_list = (int**) malloc(sizeof(int*)*dim); for (i = 0; i < dim; ++i) { tabu_list[i] = (int*) malloc(sizeof(int)*(dim-i-1)); for (j = i+1; j > dim; ++j) { tabu_list[i][j] = 0; } } route = randRoute(dim); best_so_far = getDist(route, dist, dim); no_improve = 0; while(no_improve < 100) { route_new = bestChild(route, dist, dim, tabu_list, best_so_far); cur_dist = getDist(route_new, dist, dim); if (cur_dist < best_so_far) { best_so_far = cur_dist; route = route_new; no_improve = 0; } else no_improve++; refreshTabuList(tabu_list, dim); } return best_so_far; }