/*********************************************************************** This file is part of KEEL-software, the Data Mining tool for regression, classification, clustering, pattern mining and so on. Copyright (C) 2004-2010 F. Herrera (herrera@decsai.ugr.es) L. S�nchez (luciano@uniovi.es) J. Alcal�-Fdez (jalcala@decsai.ugr.es) S. Garc�a (sglopez@ujaen.es) A. Fern�ndez (alberto.fernandez@ujaen.es) J. Luengo (julianlm@decsai.ugr.es) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ **********************************************************************/ package keel.Algorithms.Genetic_Rule_Learning.Advanced_Ant_Miner; import java.util.*; import java.io.PrintStream; import keel.Dataset.*; /** * <p>T�tulo: Ant Colony Optimization</p> * <p>Descripci�n: Clase regla. * Representa una regla descubierta por el algoritmo ACO. </p> * <p>Copyright: Copyright (c) 2007</p> * <p>Empresa: </p> * @author Vicente Rub�n del Pino Ruiz * @version 1.0 */ public class Regla { private Vector condiciones; //Atributos de la regla private Atributo clase; //Clase de la regla private float calidad; //Calidad de la regla a la hora de clasificar private static ComparadorRegla c; private float muestrasCubiertas; //Segunda medicion de calidad private int numCondicionesReales; /** * Constructor por defecto * * Crea una regla vacia, sin atributos y sin clase definida */ public Regla() { condiciones = new Vector(); clase = new Atributo(); c = new ComparadorRegla(); muestrasCubiertas = 0; calidad = 0; } /** * Constructor de copia. * Crea una regla a partir de la que se le pasa por parametro. * @param regla Regla Regla a copiar en la actual */ public Regla(Regla regla) { c = new ComparadorRegla(); condiciones = new Vector(regla.condiciones); clase = new Atributo(regla.clase); muestrasCubiertas = regla.muestrasCubiertas; calidad = regla.calidad; muestrasCubiertas = regla.muestrasCubiertas; numCondicionesReales = regla.numCondicionesReales; } /** * Constructor * Crea una regla a partir de los atributos y la clase que se le pasan * por parametro. * * @param conjuntoAtributos Vector * @param claseOriginal String */ public Regla(Vector conjuntoAtributos, Atributo claseOriginal) { condiciones = new Vector(conjuntoAtributos); clase = claseOriginal; c = new ComparadorRegla(); } /** * Modulo que inserta un atributo junto con su valor en la regla * * @param original Atributo Atributo que se inserta en la regla. */ public void insertarCondicion(Condicion original) { condiciones.addElement(original); } /** * Modulo que inserta la clase a la que identifica la regla con todos * sus atributos * * @param original Atributo Clase que se inserta en la regla */ public void insertarClase(Atributo original) { clase = original; } /** * Modulo que ordena los atributos de la regla de menor a mayor * */ public void ordenaCondiciones() { ComparadorCondicion c = Condicion.getComparadorCondiciones(); Collections.sort(condiciones, c); } /** * Modulo que asigna la calidad correspondiente a la regla * * @param original double Calidad que se asignara a la regla */ public void asignarCalidad(float original) { calidad = original; } /** * Modulo que inserta el numero de muestras cubiertas * @param numero int Numero de muestras cubiertas */ public void asignarMuestrasCubiertas(float numero) { muestrasCubiertas = numero; } /** * Funcion que avisa si un atributo esta ya junto con su valor en una regla * * @param original Atributo Atributo que se busca en la regla * @return boolean True si el atributo esta en la regla, False en caso contrario */ public boolean estaCondicion(Condicion original) { boolean devolver = condiciones.contains(original); return devolver; } /** * Funcion que indica si un atributo ya tiene asignado un valor en la regla * @param atributo Se busca si el atributo ya tiene valor insertado * @param operador Operador * @return boolean True si el atributo ya tiene un valor, false en caso contrario */ public boolean tieneValorAtributo(int atributo, int operador) { int indice = atributo; Condicion actual; for (int i = 0; i < condiciones.size(); i++) { actual = (Condicion) condiciones.get(i); if (actual.tieneValor(indice, operador)) { //Si se encuentra que el atributo ya tiene un valor asignado return true; //se sale del bucle y se devuelve true; } } return false; } /** * Funcion que devuelve la clase predicha por la regla para la muestra en * el caso de que la regla tenga las mismas condiciones que la muestra. En * caso contrario devuelve null. * @param mt Muestra Muestra a comprobar su clase predicha * @param cVacias Condiciones Vacias * @return Atributo Clase predica por la regla */ public Atributo prediccion(Muestra mt, Vector cVacias) { Atributo clasePredicha = null; if (estanCondicionesEn(mt, cVacias)) { clasePredicha = clase; //System.out.println("------------***********"); } return clasePredicha; } /** * Funcion que indica si la regla cubre la muestra que se le pasa por argumento * @param ejemplo Muestra Muestra a comprobar si se cubre con la regla o no. * @return boolean Boolean que indica si se cubre la muestra (true) o false en caso contrario */ public boolean cubreMuestra(Muestra ejemplo) { int numCondiciones = condiciones.size(); int columnaComprobar; Condicion condicionActual; Atributo condicionComprobar; for (int i = 0; i < numCondiciones; i++) { condicionActual = (Condicion) condiciones.get(i); //Cogemos una condicion de la regla columnaComprobar = condicionActual.getIndice(); //Miramos a que atributo corresponde la condicion condicionComprobar = ejemplo.getValor(columnaComprobar); if (!condicionActual.cubre(condicionComprobar)) { //Si la condicion y el valor de la muestra no coinciden return false; } } if (! (ejemplo.getClase()).esIgual(clase)) { //Sino coinciden las clases return false; } return true; } public boolean cubreMuestra(Muestra ejemplo, Vector cVacias) { int numCondiciones = condiciones.size(); int columnaComprobar; Condicion condicionActual; Atributo condicionComprobar; for (int i = 0; i < numCondiciones; i++) { condicionActual = (Condicion) condiciones.get(i); //Cogemos una condicion de la regla columnaComprobar = condicionActual.getIndice(); //Miramos a que atributo corresponde la condicion condicionComprobar = ejemplo.getValor(columnaComprobar); if (!condicionActual.cubre(condicionComprobar) && !cVacias.contains(condicionActual)) { //Si la condicion y el valor de la muestra no coinciden return false; } } if (! (ejemplo.getClase()).esIgual(clase)) { //Sino coinciden las clases return false; } return true; } public boolean cubreMuestraCondiciones(Muestra ejemplo, Vector cVacias) { int numCondiciones = condiciones.size(); int columnaComprobar; Condicion condicionActual; Atributo condicionComprobar; for (int i = 0; i < numCondiciones; i++) { condicionActual = (Condicion) condiciones.get(i); //Cogemos una condicion de la regla columnaComprobar = condicionActual.getIndice(); //Miramos a que atributo corresponde la condicion condicionComprobar = ejemplo.getValor(columnaComprobar); if (!condicionActual.cubre(condicionComprobar) && !cVacias.contains(condicionActual)) { //Si la condicion y el valor de la muestra no coinciden return false; } } return true; } /** * Funcion que indica si en la muestra se encuentran todas las condiciones de la regla * @param mt Muestra Muestra donde se buscaran las condiciones de la regla * @return boolean Indica si estan todos los atributos(true) o no (false) */ public boolean estanCondicionesEn(Muestra mt) { Condicion co; Atributo at; int indice; String cadena; Atributo original; int valorOriginal; int valorCondicion; int operador; for (int i = 0; i < condiciones.size(); i++) { co = (Condicion) condiciones.get(i); at = co.getValor(); indice = at.getAtributo(); original = mt.getValor(indice); cadena = original.getValor(); operador = co.getOperador(); if (!cadena.equals("Null")) { switch (operador) { case 0: //= if (!original.esIgual(at)) { return false; } break; case 1: //< valorOriginal = Integer.parseInt(original.getValor()); valorCondicion = Integer.parseInt(at.getValor()); if (valorOriginal > valorCondicion) { return false; } break; case 2: //> valorOriginal = Integer.parseInt(original.getValor()); valorCondicion = Integer.parseInt(at.getValor()); if (valorOriginal < valorCondicion) { return false; } break; } } } return true; //Si termina el bucle sin entrar en el if se devuelve true, en caso contrario false } public boolean estanCondicionesEn(Muestra mt, Vector cVacias) { Condicion co; Atributo at; int indice; Atributo original; int valorOriginal; int valorCondicion; int operador; for (int i = 0; i < condiciones.size(); i++) { co = (Condicion) condiciones.get(i); at = co.getValor(); indice = at.getAtributo(); original = mt.getValor(indice); operador = co.getOperador(); if (!co.cubre(original)) { return false; } } return true; //Si termina el bucle sin entrar en el if se devuelve true, en caso contrario false } /** * Funcion que devuelve la clase que predice la regla * @return Atributo Clase predicha por la regla */ public Atributo obtenerReglaPredicha() { return clase; } /** * Funcion que devuelve un vector con todas las condiciones que se siguen en la regla * @return Vector Lista de las condiciones. */ public Vector listaCondiciones() { Vector devolver; devolver = new Vector(condiciones); return devolver; } /** * Funcion que devuelve la calidad de la regla * @return double Double con la calidad que tiene la regla */ public float obtenerCalidad() { return calidad; } /** * Modulo que imprime por pantalla la regla * @param cVacias Condiciones Vacias */ public void imprime(Vector cVacias) { int tamanio; Atributo at; Condicion co; int operador; int tipo; int i = 0; String valor; Attribute[] nombres; Attribute actual; nombres = Attributes.getInputAttributes(); tamanio = condiciones.size(); for (i = 0; i < tamanio - 1; i++) { co = (Condicion) condiciones.get(i); if (!cVacias.contains(co)) { at = co.getValor(); operador = co.getOperador(); tipo = at.getAtributo(); actual = nombres[tipo]; valor = at.getValor(); switch (operador) { case 0: //= System.out.print("< " + actual.getName() + " = " + valor + " >" + " AND "); break; case 1: //< System.out.print("< " + actual.getName() + " < " + valor + " >" + " AND "); break; case 2: //> System.out.print("< " + actual.getName() + " > " + valor + " >" + " AND "); break; } //del switch } //del if } //del for co = (Condicion) condiciones.get(i); if (!cVacias.contains(co)) { operador = co.getOperador(); at = co.getValor(); tipo = at.getAtributo(); actual = nombres[tipo]; valor = at.getValor(); switch (operador) { case 0: //= System.out.print("< " + actual.getName() + " = " + valor + " >" + " ==> "); break; case 1: //< System.out.print("< " + actual.getName() + " < " + valor + " >" + " ==> "); break; case 2: //> System.out.print("< " + actual.getName() + " > " + valor + " >" + " ==> "); break; } } valor = clase.getValor(); System.out.print(valor); System.out.println("\t (" + calidad + " )"); } /** * Modulo que imprime en un fichero la regla * @param salida Fichero donde se imprimira la regla * @param cVacias Condiciones Vacias */ public void imprimeFichero(PrintStream salida, Vector cVacias) { int tamanio; Atributo at; Condicion co; int operador; int tipo; int i = 0; String valor; Attribute[] nombres; Attribute actual; nombres = Attributes.getInputAttributes(); tamanio = condiciones.size(); for (i = 0; i < tamanio - 1; i++) { co = (Condicion) condiciones.get(i); if (!cVacias.contains(co)) { at = co.getValor(); operador = co.getOperador(); tipo = at.getAtributo(); actual = nombres[tipo]; valor = at.getValor(); switch (operador) { case 0: //= salida.print("< " + actual.getName() + " = " + valor + " >" + " AND "); break; case 1: //< salida.print("< " + actual.getName() + " < " + valor + " >" + " AND "); break; case 2: //> salida.print("< " + actual.getName() + " > " + valor + " >" + " AND "); break; } //del switch } //del if } //del for co = (Condicion) condiciones.get(i); if (!cVacias.contains(co)) { operador = co.getOperador(); at = co.getValor(); tipo = at.getAtributo(); actual = nombres[tipo]; valor = at.getValor(); switch (operador) { case 0: //= salida.print("< " + actual.getName() + " = " + valor + " >" + " ==> "); break; case 1: //< salida.print("< " + actual.getName() + " < " + valor + " >" + " ==> "); break; case 2: //> salida.print("< " + actual.getName() + " > " + valor + " >" + " ==> "); break; } } valor = clase.getValor(); salida.print(valor); salida.println("\t (" + calidad + " )"); } /** * Funcion que devuelve el numero de condiciones que contiene la regla * @return int Numero de condiciones de la regla */ public int obtenerNumCondiciones() { int devolver; devolver = condiciones.size(); return devolver; } /** * Modulo que inserta las condiciones que se pasan por parametro en la regla * @param atributos Vector Vector con las condiciones a insertar */ public void insertaAtributos(Vector atributos) { condiciones = new Vector(atributos); } /** * Modulo que elimina la condicion que se pasa por parametro de la regla * @param condicion Atributo Condicion a eliminar de la regla. */ public void eliminaCondicion(Condicion condicion) { condiciones.remove(condicion); } /** * Funcion que indica si dos reglas son iguales o no. * @param regla Regla Regla a comparar con la actual. * @return boolean Booleano que indicia si son iguales (true) o no (false) */ public boolean esIgual(Regla regla) { if (regla == null) { return false; } ComparadorCondicion c = Condicion.getComparadorCondiciones(); Collections.sort(regla.condiciones, c); Collections.sort(condiciones, c); if (condiciones.equals(regla.condiciones)) { if (clase.esIgual(regla.clase)) { return true; } } return false; } /** * Funcion que devuelve un comparador de reglas. * @return ComparadorRegla Comparador de reglas */ public static ComparadorRegla obtenerComparador() { return c; } public void copia(Regla regla) { condiciones = new Vector(regla.condiciones); clase = new Atributo(regla.clase); calidad = regla.calidad; muestrasCubiertas = regla.muestrasCubiertas; } public float obtenerMuestrasCubiertas() { return muestrasCubiertas; } public void eliminaCondicion(int indice, Condicion nueva) { condiciones.remove(indice); condiciones.insertElementAt(nueva, indice); } public void eliminaUltimaCondicion() { condiciones.remove(condiciones.size() - 1); } public void insertaNumCondicionesReales(int numero) { numCondicionesReales = numero; } public int obtenerNumCondicionesReales() { return numCondicionesReales; } }