/** * 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(); }