/**
   * Método que faz um merge da regra passada como parâmetro com a regra atual. Só executa o merge
   * nos atributos númericos, os atributos discretos ficam iguais à regra atual. Deve ser usada após
   * a verificação se as retas se cruzam.
   *
   * @param r2 Regra a ser aglutinada com a atual
   * @return true casa haja um merge, false caso nao
   */
  public boolean merge(Regra r2) {
    boolean c = this.verificarIntervalos(r2);
    // Caso as regras se cruzem, elas podem ser juntas.
    if (c) {
      for (int i = 0; i < corpo.length; i++) {
        Atributo at1 = this.corpo[i];
        if (at1.isNumerico()) {
          Atributo at2 = r2.corpo[i];
          if (!at1.isVazio()) {
            double[] v1 = at1.getValores();
            double[] v2 = at2.getValores();

            // Se o limite inferior da regras passada como parametro for menor,
            // o limite da regra atual é alterado
            if (v2[0] < v1[0]) v1[0] = v2[0];

            // Mesmo procedimento, agora para o limite superior
            if (v2[1] > v1[1]) v1[1] = v2[1];

            at1.atualizar(v1[0], v1[1]);
          }
        }
      }
    }
    return c;
  }
 /**
  * Método que preencher uma regra atraves de um array de valores obtido pela nuvem de particulas
  *
  * @param novosValores Array com os novos valores para a a regra
  */
 public void preencherRegraArray(double[] novosValores) {
   int j = 0;
   for (int i = 0; i < corpo.length; i++) {
     Atributo atributo = corpo[i];
     if (atributo.isNominal()) {
       // Diminui o valor de 1 para voltar aos valores normais no padrao do weka (vazio == -1).
       double valor = novosValores[j++] - 1;
       atributo.atualizar(valor, AtributoNominal.igual);
     } else {
       AtributoNumerico a = (AtributoNumerico) atributo;
       double valor1 = novosValores[j++];
       double valor2 = novosValores[j++];
       if ((valor1 == valor2) && (valor1 == a.limiteMinimo || valor1 == a.limiteMaximo))
         atributo.atualizar(Double.MIN_VALUE, Double.MIN_VALUE);
       else atributo.atualizar(valor1, valor2);
     }
   }
   getNumAtributosNaoVazios();
 }