Пример #1
0
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;
}
Пример #2
0
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;
}