/***********************************************************************
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_Plus;
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 int se busca si el atributo ya tiene valor insertado
* @param operador int 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 Vector Vector con las 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 imprime 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;
}
/**
* Modulo que copia una regla en la actual
* @param regla Regla a copiar
*/
public void copia(Regla regla){
condiciones=new Vector(regla.condiciones);
clase=new Atributo(regla.clase);
calidad=regla.calidad;
muestrasCubiertas=regla.muestrasCubiertas;
}
/**
* Funcion que devuelve el numero de muestras cubiertas por la regla
* @return Numero de muestras cubiertas
*/
public float obtenerMuestrasCubiertas(){
return muestrasCubiertas;
}
/**
* Modulo que elimina la condicion de la posicion indicada dejando la nueva en su lugar
* @param indice Posicion de la condicion
* @param nueva Condicion nueva a insertar
*/
public void eliminaCondicion(int indice,Condicion nueva){
condiciones.remove(indice);
condiciones.insertElementAt(nueva,indice);
}
/**
* Modulo que elimina la ultima condicion de la regla
*/
public void eliminaUltimaCondicion(){
condiciones.remove(condiciones.size()-1);
}
/**
* Modulo que inserta el numero de condiciones reales de la regla
* @param numero Numero de condiciones reales
*/
public void insertaNumCondicionesReales(int numero){
numCondicionesReales=numero;
}
/**
* Funcion que devuelve el numero de condiciones reales de la regla
* @return Numero de condiciones reales
*/
public int obtenerNumCondicionesReales(){
return numCondicionesReales;
}
}