/**
   * Seleciona a melhor solução global encontrada (presente em população).
   *
   * @param populacao a população onde deve ser realizada a busca
   * @return Solução de menor custo em população
   */
  protected Solucao getMelhorSolucao(ArrayList<Solucao> populacao) {
    Solucao melhorSolucao = null;
    double menorCusto = Double.POSITIVE_INFINITY;
    double valorSol, numPontosCobertos;

    for (Solucao solucao : populacao) {
      valorSol = solucao.getValor();
      numPontosCobertos = solucao.getNumPontosCobertos();
      // Garante que cobre todos os pontos e que o custo é o menor
      if (valorSol < menorCusto && numPontosCobertos == sw.getNumPontos()) {
        menorCusto = valorSol;
        melhorSolucao = solucao;
      }
    }

    return melhorSolucao;
  }
  /**
   * Devolve uma solução que não cobre todos os pontos mas é uma das melhores entre as incompletas
   *
   * @param populacao A população onde será realizada a busca
   * @return Uma solução que não cobre todos os pontos
   */
  protected Solucao getSolucaoIncompleta(ArrayList<Solucao> populacao) {
    Solucao melhorSolucao = null;
    double menorCusto = Double.POSITIVE_INFINITY;
    int pontosCobertos = Integer.MIN_VALUE;
    double valorSol, numPontosCobertos;

    for (Solucao solucao : populacao) {
      valorSol = solucao.getValor();
      numPontosCobertos = solucao.getNumPontosCobertos();
      // Pega a solução de menor custo que cobre mais pontos
      if (valorSol < menorCusto && numPontosCobertos > pontosCobertos) {
        menorCusto = valorSol;
        numPontosCobertos = pontosCobertos;
        melhorSolucao = solucao;
      }
    }

    return melhorSolucao;
  }