Download Method Summary - Departament d`Enginyeria Informàtica i

Document related concepts
no text concepts found
Transcript
PROYECTO FINAL DE CARRERA
Estudio para la implementación de un
sistema de razonamiento basado en casos
Manuel Miguel Giménez Arjona,
[email protected]
Ingeniería Técnica en Informática de Gestión
DIRECTORES:
Ivan López Arévalo
Aïda Valls Mateu
Escola Tècnica Superior d’Enginyeria (ETSE)
Universitat Rovira i Virgili (URV)
http://www.etse.urv.es
Curso 2005-06
Estudio para la implementación de un sistema de razonamiento basado en casos
RESUMEN
Este proyecto abordará una investigación general sobre los sistemas de razonamiento basados en
casos. El lector podrá comprender desde un comienzo el significado de dichos sistemas, su
funcionamiento, metodología y dominios en los que es posible su aplicación. En el documento se
presenta una revisión bibliográfica de aquellos autores que mejoraron la metodología o la
eficiencia de estos sistemas, así como también una revisión bibliográfica de las diferentes
técnicas fusionadas que ofrecieron un notable incremento en la calidad del sistema. Así mismo
también se estudiaran algunos de los diferentes sistemas de razonamiento existentes, tanto
académicos, como comerciales. Finalmente se implementa un módulo genérico de razonamiento
basado en casos para definición, gestión, recuperación y retención de casos. Este módulo es
independiente del dominio de aplicación.
1
Estudio para la implementación de un sistema de razonamiento basado en casos
CONTENIDO
1. INTRODUCCIÓN......................................................................................................... 4
1.1
Objetivos............................................................................................................ 5
2. RAZONAMIENTO BASADO EN CASOS ................................................................. 6
2.1 Origen y Evolución.................................................................................................. 7
2.2 ¿ Qué es un caso ?, significado y descripción de un caso ....................................... 8
2.3 La base de casos ...................................................................................................... 9
2.4 La metodología de CBR ........................................................................................ 11
2.5 Ventajas de CBR ................................................................................................... 11
2.6 Desventajas de CBR .............................................................................................. 12
2.7 Principales Aplicaciones........................................................................................ 12
3. EL CICLO DE CBR .................................................................................................... 15
3.1 Retrieve (Recuperación) ....................................................................................... 17
3.2 Reuse (Reutilizar) ................................................................................................. 21
2.3 Revise (Revisar) ................................................................................................... 23
2.4 Retain (Recordar) ................................................................................................. 24
4. CBR CON OTRAS TÉCNICAS ................................................................................. 26
4.1 CBR Y RBS (Rule-based systems) ...................................................................... 26
4.2 CBR y MBR (Model-based Reasoning)............................................................... 28
4.3 CBR y Lógica Difusa (Fuzzy Logic).................................................................... 31
4.4 CBR y algoritmos genéticos ................................................................................. 33
4.5 CBR y ANN (Artificial Neural Networks)........................................................... 35
4.6 CBR y Ontologías................................................................................................. 37
5. MOTORES DE CBR................................................................................................... 40
5.1 Motores académicos ............................................................................................. 40
5.1.1 Caspian .......................................................................................................... 40
5.1.2 Selection Engine ............................................................................................ 42
5.1.3 NaCoDAE...................................................................................................... 44
5.1.4 IUCBRF......................................................................................................... 45
5.1.5 Cbr-Shell........................................................................................................ 47
5.2 Motores Comerciales............................................................................................ 47
5.2.1 Kate................................................................................................................ 48
5.2.2 CBR- Works .................................................................................................. 48
5.2.3 Orenge ........................................................................................................... 49
5.2.4 ReMind .......................................................................................................... 50
5.2.5 ReCall ............................................................................................................ 50
5.2.6 ESTEEM........................................................................................................ 51
5.2.7 ART*Enterprise............................................................................................. 52
6. IMPLEMENTACIÓN DE MÓDULO GENÉRICO DE RECUPERACIÓN ............. 53
6.1 Descripción de las herramientas de software empleadas....................................... 53
6.1.1 The Selection Engine Project ........................................................................ 53
6.1.1.1 Motor de recuperación de Selection Engine............................................ 54
6.1.1.2 Clases empleadas para definir y extraer casos......................................... 57
6.1.1.3 Gestor general de clases .......................................................................... 61
6.1.2 Ozone DataBase ............................................................................................. 63
6.2 Desarrollo de la aplicación .................................................................................... 65
6.2.1 Creación de la Base de Casos ......................................................................... 65
6.2.2 El entorno de CBR Extraction Module .......................................................... 66
6.2.2.1 Conexión a la Base de Casos................................................................... 67
2
Estudio para la implementación de un sistema de razonamiento basado en casos
6.2.2.2 Definición de atributos ............................................................................ 68
6.2.2.3 Manipulación de casos ............................................................................ 69
6.2.2.4 Visualización de casos............................................................................. 72
6.2.2.5 Definición del caso base .......................................................................... 72
6.2.2.6 Presentación extendida de resultados ...................................................... 81
6.2.2.7 Definición del número máximo de casos Similares ................................ 83
7. CONCLUSIONES....................................................................................................... 84
REFERENCIAS .............................................................................................................. 86
APÉNDICES ............................................................................................................... 92
Apéndice A. Resumen de herramientas CBR.............................................................. 93
Apéndice B. Application Program Interface ............................................................... 96
Apéndice C. Código CBR Extraction Module .......................................................... 129
3
Estudio para la implementación de un sistema de razonamiento basado en casos
1. INTRODUCCIÓN
El razonamiento humano es muy extenso y se basa en razonamiento mediante ejemplos y casos,
es decir cuando una persona se encuentra con un nuevo problema, normalmente emplea
conocimiento previo para ayudarse a resolverlo, conocimiento que ha vivido y experimentado ya
que por ese motivo sabe cual será la solución aproximada a dicho problema.
Este proyecto ha sido realizado dentro del Grupo de Investigación en Inteligencia Artificial
BANZAI del Departamento de Ingeniería Informática y Matemáticas de la URV. El proyecto
abordará una investigación general sobre los sistemas de razonamiento basado en casos (en
ingles denominado Case-based Reasoning -CBR-). Se explica qué son, cuáles son sus
características principales, cuál es su funcionamiento, cuál su utilidad académica y comercial y
sus ventajas y desventajas. Así como también se presenta una revisión bibliográfica sobre
razonamiento basado en casos, técnicas de recuperación, reutilización, adaptación y retención de
diferentes sistemas. Un sistema de razonamiento basado en casos es de gran utilidad, pero en la
actualidad, numerosos científicos investigan la interacción entre los diferentes sistemas de
inteligencia. En este sentido, las posibilidades de investigación son muy amplias, ya que existe
una gran variedad de sistemas inteligentes que en combinación con otros logran un incremento la
calidad del sistema. Así mismo en este proyecto se realizara una revisión bibliográfica sobre los
diferentes sistemas híbridos con CBR que se han realizado.
El proyecto también incluye una evaluación de los diferentes motores CBR académicos y
comerciales del mercado. Se explicará su entorno de programación, dominio, la representación
de los casos, tipo de adaptación e interface. Por último se implementará un sistema genérico de
razonamiento basado en casos (recuperación y retención). Para ello se ha creado una aplicación
completa e independiente de la base de casos, que a parte de realizar las etapas de recuperación y
retención de experiencias (casos), gestiona completamente un sistema CBR. El propio
usuario/empresa además podrá crear desde cero el entorno en el que desea aplicar el sistema de
razonamiento basado en casos. En esta parte se explica con detalle la descripción y uso de las
diferentes opciones creadas en la aplicación.
En el último apartado se ofrecen las conclusiones que se han obtenido de la realización de este
proyecto. Finalmente en los apéndices finales se muestran unas tablas resúmenes sobre los
diferentes motores CBR, así como el API (Application Program Interface) y el código de la
aplicación realizada.
4
Estudio para la implementación de un sistema de razonamiento basado en casos
1.1 Objetivos
Los objetivos en la realización del proyecto han sido los siguientes:
1. Estudio y revisión bibliográfica de técnicas aplicadas en CBR.
En el segundo apartado se explicará que es un sistema CBR. Esto incluye el origen y
evolución, la definición, su metodología de funcionamiento, las ventajas y desventajas,
así como sus diferentes aplicaciones en los entornos en que son utilizados. En el tercer
apartado se indagará más exhaustivamente en el funcionamiento de un sistema CBR,
explicando y dando a conocer el ciclo básico que todo sistema basado en el
razonamiento ha de poseer. Cada apartado de este ciclo será estudiado ofreciendo una
revisión biográfica de las diferentes técnicas y métodos que emplearon los autores para
mejorar o incrementar el manejo y la eficiencia de un sistema CBR. En el cuarto
apartado se estudiará los sistemas híbridos producidos al aplicar CBR con otras áreas de
la inteligencia artificial. Se explicará en que consisten las técnicas y se ofrecerá una
revisión biográfica de los sistemas híbridos desarrollados por los diferentes autores. Que
sistemas se crearon, su campo de interacción y las mejoras obtenidas en la fusión.
2. Estudio de los diferentes motores de CBR.
En el quinto apartado se realiza un estudio sobre las diferentes herramientas CBR
comerciales y académicas halladas. De cada una de estas herramientas se estudiará su
entorno de programación, el dominio de aplicación, la metodología de recuperación de
datos, así como las diferentes técnicas utilizadas para la adaptación de los datos
recuperados. Sobre este apartado en el apéndice A se presentan unas tablas que resumen
todas estas áreas en todos los sistemas CBR.
3. Implementación de un entorno genérico de extracción para diversos dominios.
En el sexto apartado del documento se realizará la implementación de un módulo
genérico de recuperación de casos llamado CBR Extraction Module. Es genérico ya que
puede emplearse en diferentes dominios. El usuario podrá modelar un dominio nuevo
cada vez que lo desee, utilizando como medio para la modelación, gestión y cálculo de
similitudes el propio CBR Extraction Module, sin necesidad de utilizar ningún otro
módulo complementario. Para ello se describirán las herramientas empleadas, así como
la base de datos utilizada para este fin. Finalmente se describe el entorno creado, todas
sus características y usos para el usuario.
5
Estudio para la implementación de un sistema de razonamiento basado en casos
2. RAZONAMIENTO BASADO EN CASOS
CBR (Case-based Reasoning) es un conjunto de técnicas para el desarrollo de sistemas basados
en el conocimiento que recupera y reutiliza las soluciones de experiencias pasadas para resolver
problemas parecidos y así obtener los mejores resultados. De ahora en adelante, en este
documento se hará uso indistintamente a la referencia de Razonamiento Basado en Casos o
mediante el acrónimo CBR.
El razonamiento basado en casos puede verse como un subconjunto de razonamiento analógico,
el cual consiste en alterar algún episodio de la solución de un problema previo para resolver un
problema nuevo, ambos problemas relacionados de alguna manera. La diferencia es que las
analogías de razonamiento basado en casos se realizan siempre en un mismo dominio, es decir,
el problema fuente y el problema meta pertenecen al mismo dominio. A diferencia, el
razonamiento analógico encuentra similitudes entre diferentes dominios.
Un sistema CBR puede verse como un sistema experto, es decir, aquellos programas
informáticos que se realizan haciendo explícito el conocimiento codificado y almacenado en
ellos, que tienen información específica de un dominio y que ejecutan tareas relativas a este
dominio, por lo tanto, el éxito del sistema radica fundamentalmente en el conocimiento sobre el
dominio de que trata y su capacidad de aprendizaje.
Las partes más importantes de un sistema CBR son:
•
La base de casos (también llamada librería de casos) y
•
El motor de similitudes.
Un sistema CBR necesita por lo tanto de una colección de experiencias, llamadas casos,
almacenadas en una base de casos, donde cada caso se compone generalmente de una
descripción del problema y la solución que se aplicó. Así pues un sistema CBR se basa en dos
grandes hipótesis. En primer lugar que un sistema puede ser un buen solucionador de problemas
eficiente y efectivo sin necesidad de poseer un conocimiento completo de la relación que existe
entre un problema y su solución. Y en segundo lugar es que los problemas tienden a repetirse y
por ello la experiencia es un recurso útil.
6
Estudio para la implementación de un sistema de razonamiento basado en casos
2.1 Origen y Evolución
Las raíces del CBR hay que buscarlas en la psicología donde se demuestra en muchas ocasiones
que los seres humanos resolvemos problemas en base a nuestras experiencias pasadas y no ha
partir de un conocimiento profundo del problema. Los médicos, por ejemplo, buscan conjuntos
de síntomas que identifican al paciente con algún conjunto de casos previos.
Los primeros trabajos de CBR se deben gracias a Schank y Abelson [1] a finales de los años 70.
Estos trabajos se basaban en la suposición de que las personas almacenamos el conocimiento en
forma de guiones que nos permiten hacer predicciones y realizar inferencias. Estos guiones
aunque resultaron ser un modelo incompleto de memoria sirvieron como base para los trabajos
que Roger Schank y su grupo desarrollaron en la Universidad de Yale a principios de los años
80. En el Año 1982 se crea el modelo dinámico de memoria de Schank [2] y fue en el grupo de
Yale donde se sentaron las bases del CBR y se desarrollaron las primeras aplicaciones según
estas bases.
CYRUS [3, 4] fue el primer sistema CBR, desarrollado por Janet Kolodner [5] sobre los años
1983-1984 basado en el modelo dinámico de memoria de Schank. Aquí los casos representaban
conocimiento a cerca de los viajes y las entrevistas del secretario de estado americano Cyrus
Vance. Posteriormente, también en Yale se desarrollaron MEDIATOR [6] por Kolodner y
Simpson sobre los años 1984-1989, el cual que fue un sistema de arbitraje de fútbol. JUDGE [7]
desarrollado por Bain en los años 1984-1986 el cual contenía una base de casos de sentencias
resueltas para la ayuda de toma de decisiones en los casos legales. CHEF [8] creado por
Hammond en los años 1986-1989 para el diseño de recetas de comida china. PERSUADER [9]
para la construcción de argumentaciones en casos legales, CASEY [10] para el diagnóstico de
enfermedades cardiovasculares y JULIA [11] para el diseño de menús.
En los años 1986 - 1989, cabe destacar el trabajo de Bruce Porter, en la Universidad de Texas, en
la integración de casos y conocimiento que dio lugar al sistema PROTOS [12], aplicado al
diagnóstico de enfermedades del aparato auditivo.
Por otro lado cabe destacar el trabajo de Edwina Rissland de la Universidad de Massachussets en
el desarrollo del sistema HYPO [13], dicho sistema construía argumentos legales a favor y en
contra de los litigantes en base a las similitudes y diferencias con otros casos
Una de las primeras aplicaciones de CBR en funcionamiento real fue el sistema CLAVIER [14],
el desarrollo de este sistema comenzó en 1987 y sigue usándose desde 1990. Este sistema
7
Estudio para la implementación de un sistema de razonamiento basado en casos
ayudaba al proceso de seleccionar y colocar dentro del autoclave las piezas a hornear de misiles
y aviones, y para ello era necesario confiar más en la experiencia de cargas anteriores que no en
la propia ciencia. Los operarios de los autoclaves se basaban en dibujos de distribuciones
utilizadas previamente con éxito para determinar como se iba a cargar el autoclave. Se
seleccionaba una disposición que hubiera funcionado bien y se adaptaba a la situación actual.
La Unión Europea financió en la década de los 90 dos proyectos, INRECA I y II [15], dedicados
a investigar en el desarrollo de herramientas y metodologías para sistemas CBR, alrededor de los
cuales surgieron y se consolidaron dos compañías: Acknosoft en Francia y TecInno en
Alemania. Posteriormente las actividades de Acknosoft se han orientado a las aplicaciones de
diagnóstico, mientras que TecInno se especializa en aplicaciones de comercio electrónico.
Aunque inicialmente el CBR no fue acogido con buenos ojos por la comunidad de Inteligencia
Artificial por el hecho que para resolver un problema no hace falta entenderlo, sino tener una
buena base de casos parecidos. En la segunda mitad de los años 90 el CBR ha ido encontrando
su lugar en la comunidad. Tal y como se demuestra en los años 1995 y 1999 dos artículos sobre
CBR [16, 17], los cuales recibieron el premio al mejor artículo de investigación en el IJCAI
(Internacional Join Conference on Artificial Intelligence), la conferencia más importante de
Inteligencia Artificial.
2.2 ¿Qué es un caso?, significado y descripción de un caso
El principal activo de un sistema CBR es la base de casos. Un caso contiene información útil en
un contexto concreto, el problema es identificar los atributos que caracterizan al contexto y
detectar cuándo dos contextos son similares. Un caso es una experiencia que enseña algo, de tal
manera puede haber experiencias que no aporten ninguna nueva información al sistema, lo cual
plantea el problema de identificar cuando dos casos son superficialmente distintos. Además lo
que el caso enseña es relativo a unos determinados objetivos, y por lo tanto, se ha de tener en
cuenta que una determinada solución puede fallar, en CBR interesa no solo guardar las
soluciones que funcionan sino también aquellas otras que fallaron, ya que ambas contienen
información útil que permitirá repetir las soluciones exitosas, y evitar la repetición de las
fallidas.
8
Estudio para la implementación de un sistema de razonamiento basado en casos
Generalmente un caso se compone de las siguientes partes:
1. La descripción de un problema, ya sea la situación a interpretar, el problema de
planificación a resolver o el artefacto a diseñar. Esta es la parte de casos que se utiliza
para determinar su similitud.
2. La descripción de una solución. Además del artefacto construido, el plan aplicado o la
interpretación asignada. En la solución de un caso se puede guardar información
adicional, sobre todo con el objetivo de facilitar futuras adaptaciones. Información
acerca del proceso que llevó a la obtención de la solución, qué alternativas se
consideraron, cuáles se eligieron y cuáles se descartaron, y el motivo de la elección o el
rechazo de dicho caso.
Esta es una estructura general, es decir, se pueden encontrar casos en los que tan solo estén
compuestos de la descripción del problema y de la solución aplicada. Pero también se pueden
encontrar casos en los que no se hace una distinción entre las partes de un caso, sino que cada
caso esta descrito por un conjunto de atributos, y una consulta solo contiene una parte de ellos,
de forma que el problema son los atributos contenidos en la consulta y la solución los que no
están. Esto es típico en las aplicaciones de diseño.
Gracias al concepto de guardar las experiencias en forma de casos se obtienen unas ventajas
sobre otros sistemas. Las ventajas son:
•
A los expertos les resulta más fácil proporcionar ejemplos, que no crear reglas de
comportamiento.
•
Se puede obtener un nuevo caso cada vez que se resuelve un nuevo problema, se puede
indicar su resultado, explicarlo y clasificarlo como fracaso o éxito. Ya que un caso
clasificado como fracaso es también información útil.
•
Es posible comparar los casos y adaptarlos de manera efectiva.
•
Los casos mantienen su vigencia durante bastante tiempo, es decir, los problemas tienden a
repetirse.
2.3 La base de casos
Como se ha dicho anteriormente, la base de casos es el principal activo de un sistema CBR y
estaría formada por todas las experiencias representadas en forma de casos, ya sean casos en que
la solución fue la correcta o casos incorrectos. Los entornos en los que se puede crear una base
de datos con casos son muy variados y al mismo tiempo pueden ser muy complejos.
9
Estudio para la implementación de un sistema de razonamiento basado en casos
En la Figura 1, se puede ver ejemplos de casos en un dominio de atención al cliente para
solucionar problemas con impresoras. La base de casos estaría compuesta de n casos basados en
las experiencias de un experto. Como se puede apreciar cada caso se compone de una serie de
atributos y su valor correspondiente. Se puede observar que en esta base de casos, un caso está
definido por los atributos: descripción, modelo, luz estado papel, luz estado tinta color, luz
estado tinta negra y interruptor impresora. El último atributo corresponde a la solución a los
atributos planteados. Este ejemplo es muy sencillo, sirve para ilustrar un caso, pero los casos por
norma general estarán definidos con bastantes más atributos de los que se ve en el ejemplo.
C
A
S
O
1
PROBLEMA
DESCRIPCIÓN: Impresora no imprime
MODELO: Epson stylus Color 700
LUZ ESTADO PAPEL: Apagada
LUZ ESTADO TINTA COLOR: Apagada
LUZ ESTADO TINTA NEGRA: Encendida
INTERRUPTOR IMPRESORA: Encendida
SOLUCION
CAMBIAR CARTUCHO DE TINTA
C
A
S
O
2
PROBLEMA
DESCRIPCIÓN: Impresora no imprime
MODELO: Epson stylus Color 700
LUZ ESTADO PAPEL: Apagada
LUZ ESTADO TINTA COLOR: Encendida
LUZ ESTADO TINTA NEGRA: Apagada
INTERRUPTOR IMPRESORA: Encendida
SOLUCION
CAMBIAR CARTUCHO DE TINTA
C
A
S
O
N
PROBLEMA
DESCRIPCIÓN: Impresora no imprime
MODELO: Epson stylus Color 700
LUZ ESTADO PAPEL: Encendida
LUZ ESTADO TINTA COLOR: Apagada
LUZ ESTADO TINTA NEGRA: Apagada
INTERRUPTOR IMPRESORA: Encendida
SOLUCION
REPONER PAPEL EN LA IMPRESORA
Figura 1. Esquema de representación de una base de casos.
10
BASE
DE
CASOS
Estudio para la implementación de un sistema de razonamiento basado en casos
2.4 La metodología de CBR
En la Figura 2 podemos ver de forma muy sencilla cómo se obtiene la solución a un problema
nuevo. Gracias a que se dispone un espacio de problemas con las descripciones de los casos se
puede buscar el caso más parecido al problema planteado por conocimiento de similitud. La
solución de este caso parecido, equivaldrá a una posible solución del caso nuevo.
Espacio de
Problemas
Descripción del
problema nuevo
Espacio de
Soluciones
Solución
Propuesta al
nuevo caso
Figura 2. Metodología de CBR.
Este funcionamiento es lo que se implementa en el motor de razonamiento mediante sistemas
expertos, sistemas de producción, etc.
2.5 Ventajas de CBR
En primer lugar el CBR facilita la adquisición de conocimiento porque a los expertos les resulta
mucho más fácil solucionar el caso que proponer reglas de aplicación general. Un segundo
aspecto favorable del CBR como tecnología para el desarrollo de sistemas basados en el
conocimiento es que facilita el aprendizaje. De la manera más sencilla un sistema CBR puede
aprender por simple acumulación de casos, ya que cada vez que se soluciona un nuevo problema
este puede ser incorporado como un nuevo caso a la base de casos. Un tercer aspecto a
considerar es que gracias al CBR se pueden proponer soluciones en dominios poco formalizados
o que no se comprenden del todo, no es necesario que toda la información del dominio esté
completa.
11
Estudio para la implementación de un sistema de razonamiento basado en casos
Otras ventajas del CBR son:
•
Permite construir razonadores más eficientes, puesto que suele ser menos costoso modificar
una solución previa que construir una nueva solución desde cero.
•
Los casos pueden proporcionar también “información negativa”, alertando sobre posibles
fallos.
•
Se facilita el mantenimiento de la base de conocimiento, ya que los usuarios pueden añadir
nuevos casos sin ayuda de los expertos.
•
Es más fácil conseguir que los usuarios acepten las sugerencias del sistema ya que estas
están avaladas por una situación previa.
2.6 Desventajas de CBR
Como en todo sistema, este, aparte de ventajas también existen desventajas que se han de tener
presente a la hora de utilizar un sistema CBR. Estas desventajas son descritas a continuación:
•
El razonamiento basado en casos no pretende encontrar la solución exacta al problema. El
usuario recupera soluciones óptimas basadas en experiencias pasadas.
•
El cálculo de la similitud entre el nuevo caso y los existentes en la base de casos puede
resultar extremadamente complejo.
•
“Comienzo frío”, es decir, al principio si un sistema CBR contiene pocos casos y esto hace
que el sistema no pueda ofrecer buenas soluciones.
•
El usuario ha de interpretar la medida de similitud para justificar la solución que el sistema
le ha ofrecido.
2.7 Principales Aplicaciones
Janet kolodner [18] describe una serie de características que permiten identificar aquellos
dominios en los que la aproximación basada en casos tiene probabilidades de éxito. Las
aplicaciones de los sistemas CBR se pueden clasificar en dos grandes grupos:
1. Clasificación e interpretación de situaciones
2. Resolución de problemas
12
Estudio para la implementación de un sistema de razonamiento basado en casos
En general las aplicaciones industriales están dentro del primer grupo, donde las técnicas a
utilizar están mejor definidas, la representación de los casos es más sencilla y existen
herramientas comerciales que soportan el desarrollo. Los sistemas de resolución de problemas,
por el contrario son más habituales en el ámbito académico ya que necesitan representaciones
más complicadas y más esfuerzo de adquisición y formalización de conocimiento.
En el ámbito de los sistemas CBR de clasificación e interpretación destacan los siguientes
dominios de aplicación:
•
Servicios de atención al cliente (help-desk). Este es el dominio donde más éxito han tenido
los sistemas CBR fuera del mundo académico. El problema fundamental de los servicios de
atención al cliente al cliente es básicamente económico: si el producto sobre el que se presta
soporte es sofisticado, entonces es necesario que la persona que resuelve las dudas de los
clientes sea un experto, pero claro, a una empresa le resulta muy costoso dedicar personal
cualificado a una tarea repetitiva, ya que los problemas de los clientes tienden a repetirse.
La solución basada en CBR consiste en construir una base de casos con los problemas
resueltos de los expertos y encargar a una persona menos cualificada de atender a los
clientes. De esta forma el experto sólo será consultado cuando el cliente planteé un problema
que no haya sido resuelto previamente. Naturalmente cada vez que los expertos resuelven un
nuevo problema, éste pasa a formar parte de la base de casos.
•
Diagnóstico y resolución de fallos. Los sistemas de diagnóstico basados en CBR se plantean
como herramientas de ayuda que el experto utiliza para acelerar su trabajo y que además
sirven como una “memoria corporativa” a través de la cual distintos expertos comparten el
resultado de su actividad diaria.
•
Predicción y valoración. En dominios difíciles de formalizar la casuística1 es una fuente
valiosa de predicciones, y por lo tanto resultan aptos para las aproximaciones basadas en
casos. Desde el punto de vista técnico, la principal dificultad en el desarrollo en este tipo de
sistemas radica en establecer cuales son los atributos predictivos que permitan determinar la
similitud entre una situación pasada y la actual.
•
Enseñanza. Diversos pedagogos argumentan sobre las ventajas de la enseñanza basada en
ejemplos y es por ello que se han desarrollado trabajos dentro de lo que se llama “enseñanza
1
Consideración de los diversos casos particulares que se pueden prever en determinado dominio.
13
Estudio para la implementación de un sistema de razonamiento basado en casos
basada en casos”. Un sistema de este tipo suele incluir, además de un conjunto de ejemplos
de valor pedagógico, un entorno simulado donde el alumno realiza algún tipo de interacción,
de forma que en base a dicha interacción, el sistema sea capaz de sugerir ejemplos que
aporten información relevante a la tarea que en ese momento se esté realizando.
•
Comercio electrónico. En este dominio se han realizado algunos trabajos que sacan partido
de los procesos de “recuperación aproximada” propios del CBR. En los sistemas de
comercio electrónico convencionales, la interfaz de consulta consiste en un catálogo y/o
formulario de consulta a base de datos. El inconveniente de las consultas a base de datos es
que recuperan lo que el usuario pide y solo eso, lo que en muchas ocasiones acaba siendo
una lista de resultados vacía o demasiado larga. Si se dispone de una función de similitud
entre descripciones, se podrá ofrecer productos parecidos que puedan interesar al cliente.
Por lo que se refiere a los sistemas CBR de resolución de problemas, sus aplicaciones se
restringen casi exclusivamente al ámbito académico en dos áreas de inteligencia artificial:
planificación y diseño.
•
Los sistemas de planificación basados en CBR suelen adoptar estrategias mixtas, donde es
posible generar planes desde cero pero si existe un problema ya resuelto similar al actual, se
prefiere, por razones de eficiencia, modificar la solución antigua.
•
Los sistemas de diseño suelen ser más sofisticados que los de planificación, y requieren de
un de adquisición de conocimiento que los hace difícilmente realizables. CLAVIER [14] es
precisamente una de las primeras aplicaciones industriales del CBR y es precisamente un
sistema de diseño, más exactamente es un sistema de diseño para la fabricación de piezas en
aeronáutica.
14
Estudio para la implementación de un sistema de razonamiento basado en casos
3. EL CICLO DE CBR
El funcionamiento de un sistema CBR se apoya en un ciclo básico llamado ciclo CBR [19]
donde se puede ver a de forma general el funcionamiento desde que se plantea un nuevo
problema hasta que se decide insertar como nueva experiencia en la base de casos del sistema
CBR.
Los sistemas CBR se apoyan en los cuatro procesos básicos mostrados en la Figura 3:
1.- RETRIEVE (recuperar)
2.- REUSE (reutilizar)
3.- REVISE (revisar)
4.- RETAIN (recordar)
Figura 3. Ciclo de razonamiento basado en casos.
15
Estudio para la implementación de un sistema de razonamiento basado en casos
RETRIEVE (recuperar):
La recuperación de los casos más similares al caso o problema actual. Esta es una de las áreas de
investigación más activas en CBR y también donde más resultados se han obtenido. Esta área es
una de las más importantes y en ella se pueden encontrar diferentes algoritmos aplicados con
mayor o menor éxito.
REUSE (reutilizar):
Proponer como solución al problema actual la adoptada anteriormente. Aquí aparece el concepto
adaptación, que se hace necesaria cuando la solución recuperada no es directamente aplicable al
problema en curso. La adaptación puede ir desde un simple ajuste de parámetros mediante la
aplicación de ciertas formulas, hasta el uso de complejos modelos propios de los sistemas
basados en el conocimiento.
REVISE (revisar):
Evaluar los resultados de la solución propuesta para confirmar su correcto funcionamiento. Esta
área en ocasiones es automática pero en la mayoría de sistemas es un área que estará a cargo de
un operador humano.
RETAIN (recordar):
Guardar en la base de casos la nueva experiencia para que pueda ser utilizada en futuros
problemas. El recuerdo de casos es parte esencial de un sistema CBR, por lo tanto la inclusión de
nuevos casos puede dar lugar a la reorganización de la base de casos o a la definición de
estructuras de índices. A medida que aumenta el número de casos se plantean cuestiones de
eficiencia, ya que los procesos son más lentos cuantos más casos existen en la base de casos, y
por lo tanto se ha de ser más crítico a la hora de decidir que casos se incluyen en el sistema.
Existen técnicas que se ocupan de eliminar los casos poco utilizados, o de identificar familias de
casos relacionados para así mantener sólo aquellos casos que realmente aporten información al
sistema.
La forma en que se representan los casos, cómo se determina la similitud, cómo se realiza la
adaptación y cómo se decide cuantos casos hay que almacenar para conseguir una cobertura
suficiente del dominio de aplicación, son cuestiones que están relacionadas entre sí. Por ejemplo
cuantas más capacidades de adaptación tenga el sistema, menos casos hay que almacenar y más
nos acercamos a los sistemas basados en reglas. Si hay más conocimiento de adaptación,
entonces es necesario menos conocimiento de similitud.
16
Estudio para la implementación de un sistema de razonamiento basado en casos
La Figura 3 es un marco general de funcionamiento de los sistemas CBR, pero no todos los
sistemas CBR incluyen las cuatro fases del ciclo. En particular la fase de adaptación se obvia en
muchos sistemas, o se deja en manos de los usuarios.
En los siguientes apartados se describen con más detalles cada una de las fases del ciclo viendo
las técnicas utilizadas en cada una de ellas.
3.1 Retrieve (Recuperación)
El proceso de recuperación más simple consiste en recorrer secuencialmente la base de casos y
aplicar la función de similitud entre la consulta y cada caso, seleccionando todos los casos para
los que se supere cierto parentesco con el caso propuesto. Sin embargo en los sistemas reales con
un gran número de casos y una función de similitud costosa de calcular, la recuperación lineal
puede resultar muy cara al sistema.
La comunidad CBR ha desarrollado o adaptado estructuras de datos y algoritmos para realizar
este proceso eficientemente. Entre estos métodos podemos encontrar:
•
Árboles de decisión introducidos mediante el algoritmo ID3 o alguna de sus variantes. A
partir de el conjunto de casos y una vez fijados los atributos que actúan como índices, se
induce un árbol de decisión que permite recuperar en un mínimo de pasos los casos más
relevantes para una consulta dada
•
Modelos basados en memoria. Este tipo de estructuras se suelen utilizar en sistemas
sofisticados ya que no sólo sirven como estructura para optimizar el algoritmo de
recuperación sino que además incluyen conocimiento adicional en forma de generalizaciones
de los casos. En esta línea destacan los Memory Organization packages (MOPs) [2]
•
Redes de activación (Spreading Activation Networks). Este tipo de estructuras son una
adaptación de las redes neuronales donde la memoria de casos se representa como una red de
nodos interconectados. La recuperación se implementa como un proceso que activa los
nodos asociados con la consulta y propaga la activación a otros nodos.
•
Árboles k-d. Esta estructura de datos es una generalización de los árboles de decisión
desarrollada inicialmente en aplicaciones de informática gráfica. Esta estructura está pensada
17
Estudio para la implementación de un sistema de razonamiento basado en casos
para dado un conjunto de puntos repartidos en un espacio métrico k-dimensional, recuperar
eficientemente los k vecinos más próximos (k-nearest neighbors) a un punto dado. No se
plantea la recuperación del vecino más próximo porque análisis teóricos demuestran que la
complejidad de un algoritmo que recuperase el más próximo sería mucho más alta que la de
recuperar los k más próximos.
Como ya habíamos comentado la recuperación de los casos más similares al problema planteado
es una de las áreas de investigación más activas, veamos ahora una revisión de los métodos
utilizados más importantes.
Suh, Jhee, Ko y Lee [20] realizaron un sistema experto de razonamiento basado en casos para la
calidad de la formulación y el procesamiento de parámetros de productos químicos, de manera
que pudieran ofrecer la máxima calidad a los consumidores. Esta propuesta utiliza una jerarquía
de casos indexados para la recuperación de los casos y esta provisto de sofisticadas métricas de
similitud para acentuar la búsqueda. La recuperación del caso comienza seleccionando el caso
base que más se ajusta en la jerarquía de casos indexada. Entre el caso base escogido y todos los
demás de la base de casos se compara y se puntúa en base a una métrica de similitud para
encontrar el caso más parecido, por lo tanto esta medida es necesaria para tasar la similitud entre
los atributos de los casos. La similitud entre el pasado caso y el nuevo caso fue evaluada de dos
maneras diferentes:
1. Order-to-order-similarity (OOS): Evalúa la similitud entre el pasado caso y el nuevo
caso comparando los objetivos de los atributos de dos casos.
2. Order-to-result-similarity (ORS): Evalúa la similitud entre el pasado caso y el nuevo
caso comparando los Atributos del nuevo caso, y el resultado de los atributos del caso
pasado.
ORS fue un poco más preciso que OOS para evaluar la similitud entre los casos de la base de
casos.
Leake et al. [21] presentan el estudio de un programa CBR para la ayuda a la toma de decisiones
en el estampado de color de los coches. El gestor de estampado envuelve cinco principios
básicos para la integración de un sistema CBR. Estos son la interacción paralela entre el experto
y el sistema, la disponibilidad de la información cuando sea necesaria, la integración con otros
recursos para complementar la información, la realización rápida y en el menor tiempo posible
de las tareas y finalmente la captura de nuevas experiencias para su posterior consulta. Estos
principios son propios del modelo cognitivo del razonamiento basado en casos [7].
18
Estudio para la implementación de un sistema de razonamiento basado en casos
El gestor de estampado asocia cada tipo de zona del automóvil con una colección predefinida de
características. Un grupo de estas se asocian con regiones geométricas de cada zona y otro grupo
se asocian al tipo de material usado (aluminio, hierro, etc.). En el momento que el sistema
recupera los casos más parecidos se realiza un primer filtrado acuerdo la zona, por ejemplo el
parachoques, de este modo solo se recuperan los casos específicos de esta zona. Posteriormente,
el sistema utiliza la medida nearest-neighbor con pesos en sus características para la búsqueda
de los casos más parecidos. Una vez ha realizado todas las tareas, el sistema de estampado
genera un documento de los casos recuperados con el cual el experto puede comprender la
lógica aplicada por el sistema en la elección de los casos.
Katy Börner [22] describe una propuesta estructural llamada case-based structure generation
basada en la construcción de estructuras de casos por analogía conceptual (Conceptual Analogy)
para soporte a una base de casos. Según esta propuesta se han de encontrar conjuntos de
similitudes conceptuales entre el problema y la base de casos. Para encontrar la solución al
problema planteado se realiza una agrupación conceptual de casos, representándolos por grafos
en clases jerárquicas de estructura similar. Los casos son representados por conceptos, se les da
un problema y una solución parcial (Figura 4). Una vez encontrados los casos más parecidos se
generan colecciones de ellos ordenados por la similitud con el problema planteado.
Figura 4. Representación del problema y solución
Esta propuesta puede ser utilizada como soporte de diseño de tareas para aquellos dominios que
no permiten la adquisición de una consistente colección de restricciones, o reglas provenientes
de una colección de pasadas experiencias.
Gómez de Silva y Maher [23] describen un software llamado DEMEX, un sistema de ayuda para
los problemas que se plantean en el diseño de la construcción. Las estrategias de recuperación
necesitan ser definidas para que puedan proporcionar más de un solo caso en la búsqueda de la
base de casos. Por ello se definen dos estrategias :
19
Estudio para la implementación de un sistema de razonamiento basado en casos
1. Model based index. Usa el modelo de memoria para la identificación de información
relevante en la especificación inicial del diseño. La descripción de un problema consiste
en una lista de pares atributo-valor, gracias a estos pares más relevantes de la
especificación del problema y por eliminación de los menos significativos se crea una
reformulación de la especificación y se utiliza como índice para la recuperación de
casos. Este modelo consta de cuatro subprocesos, recuperación del modelo, selección del
modelo, suma de atributos de la especificación e identificación de los atributos críticos
de la especificación.
2. Case-base index. Esta estrategia esta provista de una búsqueda iterativa de la
especificación inicial del problema. Este algoritmo consta de tres pasos, recuperación de
casos, análisis de los casos recuperados y selección de un caso interesante.
Stephanie E.August y Lawrence P. Mcnamee [24] presentan una propuesta de argumento por
analogía llamada lenguaje natural. Muchas de las experiencias más valiosas están almacenadas
en forma de documentos de texto, por eso es natural tratar de la gestión de los documentos
mediante CBR. Implementan ARIEL, que es un sistema que detecta la presencia de las analogías
en una editorial de texto, identifica el origen de los componentes. Durante la comprensión del
texto AIREL crea correspondencias entre los componentes que se han detectado analogías o
modelos identificados como analogías gracias a la comparación de conceptos que se encuentra
en el texto.
Macaya et al. [25] proponen el razonamiento basado en casos como metodología para la
diagnosis y resintonía de reguladores PID (Proporcional-Integral-Derivativo). Dichos
reguladores son utilizados para sistemas en tiempo real y de ellos se desea que la señal de salida
sea proporcional a la de entrada, a su integral y a su derivada.
Los casos son estructuras de datos que permiten guardar información de las situaciones vividas
por el proceso incorporando tanto información numérica, cualitativa o descriptiva útil par la
interpretación y solución de un problema. En el sistema se propone una estructura de caso según
cuatro conceptos: especificaciones de funcionamiento, parámetros de proceso, parámetros de
regulador y evaluación del regulador. El funcionamiento deseado del regulador vendrá dado por
las especificaciones de funcionamiento. Éstas servirán en la recuperación para diferenciar entre
tipos de reguladores y a su vez permitirán incluir en la estructura de casos índices relativos a su
evaluación. Es decir si un caso registrado fue correctamente sintonizado y por tanto ser
reutilizado o por el contrario al utilizar los parámetros del regulador no se pudo cumplir con las
especificaciones requeridas.
20
Estudio para la implementación de un sistema de razonamiento basado en casos
Para la recuperación de casos el sistema utiliza el algoritmo nearest-neighbour en el que se
incluye el peso que se aplica a las variables del caso que representa la situación actual, y el peso
de las variables de los casos que se compararan. Esta función distancia puede aplicarse tanto a
las variables numéricas como a las variables simbólicas utilizadas para representar valores
cualitativos. El valor de semejanza obtenido será un valor normalizado entre 0 y 1. Siendo el 1 el
máximo nivel de semejanza y en consecuencia la igualdad. Una vez seleccionado el caso más
parecido a la situación actual, se comprueba que la evaluación que se hizo del funcionamiento
del regulador en el pasado fue buena. En el caso que esto fuera cierto se aplica la misma solución
a la nueva situación. En el caso que la evaluación que se hizo en el pasado fuera negativa sería
indicador de que si se mantienen los parámetros del regulador para la nueva situación
probablemente no funcionaria.
3.2 Reuse (Reutilizar)
Las soluciones recuperadas en la etapa anterior, corresponden a aquellos problemas vividos en el
pasado más parecidos con al problema inicial. Aquí aparece el concepto adaptación, que se hace
necesaria cuando la solución recuperada no es directamente aplicable al problema en curso. En
consecuencia las soluciones, en ocasiones han de ser adaptadas al nuevo problema para que su
correcto funcionamiento a la hora de ser reutilizadas. La fase de adaptación, normalmente será
realizada por un experto humano, pero también es posible encontrar sistemas CBR que pueden
ofrecer un ajuste de parámetros mediante la aplicación de ciertas formulas. Y también es posible
encontrar sistemas CBR que mediante la utilización de otras técnicas logren la automatización de
esta etapa, consiguiendo con ello precisión y autonomía.
Gómez de Silva y Maher [26] describen la implementación del proyecto llamado CASECAD. El
objetivo de este proyecto es proponer e implementar una representación para el diseño de casos
para soporte hacia los diseñadores a encontrar colecciones de los casos más relevantes de los
problemas propuestos. La representación de los casos está implementada usando FRAMEKIT
(software para la representación de casos) y la representación grafica de los casos es
implementada usando AutoCAD.
La adaptación del caso recuperado en CASECAD no se realiza de manera automática sino que
son los propios diseñadores los que realizan la adaptación de caso, para ello disponen de un
editor de herramientas para poder cambiar la representación del caso utilizando directamente
21
Estudio para la implementación de un sistema de razonamiento basado en casos
AutoCAD. Una vez se ha modificado el nuevo caso este pasará a ser automáticamente indexado
dentro de la base de casos.
Por otro lado, Gómez de Silva y Maher [27] han desarrollado una metodología para el diseño
estructural conceptual usando algoritmos genéticos. En la adaptación utilizan un simple
algoritmo genético (Genetic Algortihm -GA-) [28] el cual provee de técnicas importantes, de
hecho podemos encontrar tres notaciones que son muy útiles de los sistemas biológicos:
•
Phenotype, el cual puede ser el diseño de solución para sistemas.
•
Genotype, el camino para la representación o la codificación de la información usada
para producir el Phenotype.
•
Survival of the fittest, determina si un Genotype perdura en la reproducción.
En los sistemas GA el Genotype es representado normalmente como una cadena binaria, la
longitud de la cual varía con cada aplicación. La representación del Genotype permite la
combinación o la mutación para la construcción de mejores cadenas. Un algoritmo genético
simple considera una población de n cadenas y aplica los operadores de mutation, crossover y
reproduction en orden para crear la siguiente generación. Reproduction es un proceso en el cual
las cadenas son copiadas acuerdo con su funcionalidad idónea. Crossover es un proceso en el
cual las más recientes cadenas que se han reproducido son apareados aleatoriamente con cada
par de cadenas intercambiando parcialmente la información. Mutation es una alteración aleatoria
ocasional de uno de los bits en la cadena. La recuperación parcial de casos provee de una
población inicial al algoritmo. Los atributos-valor representados en los casos pueden ser
reinterpretados en el contexto de un algoritmo genético y las soluciones generadas serán
conocidas como Phenotype. De esta forma, usando algoritmos genéticos se puede adaptar un
caso.
Champán [29] y su equipo de investigación de la Universidad de Claude proponen un modelo
para la asistencia interactiva de la fase de adaptación de un sistema CBR. El principal objetivo
del proyecto ARDECO (Assisted reuse of design episodes) es estudiar como los usuarios de
sistemas CAD (Computer Aided Design) practican el reuso. Para la creación del modelado de
episodios existen dos alternativas; el modelado dinámico, que es representado por una secuencia
de operaciones, o el modelado estático visto como una secuencia de estados. Los autores utilizan
solo el modelado estático y su particular estructura ha sido nombrada "tree with shortcuts". La
figura 5 muestra un pequeño ejemplo de la estructura:
22
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 5: “tree with shortcuts”
La secuencia cronológica de los estados de la A a la E es guardado como una ruta, pero como se
puede ver en cada subestado existe un acceso directo a otro estado, de esta forma se puede ir
directamente de un estado inicial a un estado final. En el estado B se puede ver que se puede
llegar a dos estados finales, el E y el G. Durante la representación del conocimiento de
adaptación, las relaciones recuperadas entre casos son representadas mediante las flechas
curvadas, mientras que las flechas rectas representan las relaciones de reuso aplicables. Como se
puede ver en la Figura 6.
Figura 6. Representación para reuso de estados
En el momento de la adaptación el experto dispone de esta guía para comprobar las diferencias
entre los estados del caso recuperado y de esta forma ayudar en la realización de los cambios
necesarios para el correcto funcionamiento de la solución.
2.3 Revise (Revisar)
Los sistemas CBR, como se ha dicho anteriormente aprenden nuevas experiencias, nuevos casos
que aporten un enriquecimiento del sistema. Así pues después de reutilizar una posible solución
esta puede ser correcta o no, si es correcta la nueva solución será almacenada en el sistema, pero
si la solución no ha sido satisfactoria entonces se tendrá que revisar.
La revisión de casos comprende básicamente dos fases:
23
Estudio para la implementación de un sistema de razonamiento basado en casos
•
Evaluar la solución. Es decir, decidir si la solución dada es la correcta al problema
planteado. Esta fase normalmente se realizará por algún método externo al sistema CBR,
como por ejemplo el usuario. A veces es necesario realizar simulaciones.
•
Reparar los fallos. Si no es correcta la solución se han de detectar los fallos y corregirlos.
Este apartado en los sistemas CBR está bastante descuidado por la gran mayoría de autores
encontrados, mayormente las áreas más estudiadas y desarrolladas son las de recuperación de
casos y reuso (adaptación de ellos). La gran mayoría de autores dan por hecho que la adaptación
de los casos realizada de forma automática por el sistema se encuentra fundamentada en unas
reglas lógicas y acertadas. Pero como la mayoría de autores comentan existe un operador final
que después de probar la solución en la vida real puede decidir si es apta o no apta para ser
introducida en el sistema. La revisión de casos es controlada en la mayoría de sistemas por un
operador humano, es por ello, que la mayoría de autores no ofrecen investigaciones profundas
sobre este punto y se dediquen a la mejora y estudio de las otras áreas.
Leake et. al [30] presentan una propuesta de adaptación y evaluación de los casos que serán
insertados en el sistema CBR. La adaptación de los casos por parte de un sistema es una tarea
muy difícil o imposible de realizar en algunos dominios. Pero es posible realizar una adaptación
del caso utilizando otra base de casos realizada explícitamente para este fin.
La propuesta utiliza una librería de casos para la adaptación de los casos basada en la
experiencia, dichas librerías de forma más sencilla ya han sido utilizadas en otros sistemas de
razonamiento para el guiado de la adaptación de los casos [31,32]. El método, llamado RCR (Reaplication cost and relavance) se basa la observación de la adaptación que el operador realiza
sobre el caso. Es decir, el sistema encapsula esquemas de derivación propios al adaptar el caso.
De esta forma son creadas guías de ayuda al operador en el momento de la adaptación, así como
su revisión para comprobar que la adaptación se ha realizado correctamente. Pero dichas guías
no solo tienen este uso sino que también son utilizadas para predecir la dificultad de la
adaptación, para ello se da toda la información necesaria calculando los costes de adaptación de
los casos mediante estimaciones de la diferencia entre los problemas actuales y los casos de
adaptación. Una vez el operador confirma la adaptación esta será insertada en la base de casos.
2.4 Retain (Recordar)
Una de las principales características de un sistema CBR es poder recordar los nuevos casos y su
solución aplicada, para ello es fundamental poder retener estos casos en lo que se llama la base
24
Estudio para la implementación de un sistema de razonamiento basado en casos
de casos. Esta cada vez irá aumentando y enriqueciéndose gracias a las soluciones de problemas
basados en la experiencia. La forma de estructuración de la base de casos y las políticas de
retención que el sistema CBR facilitaran el buen funcionamiento. Por ello el primer problema
que debe tratar un sistema de aprendizaje es decidir que casos se aprenden. La eficiencia de un
sistema CBR se puede degradar cuando el número de casos crece excesivamente y por tanto, se
debe evitar incluir casos que no aporten información nueva al sistema. El rango de posibilidades
va desde los sistemas que, de forma autónoma deciden que casos deben incluir hasta los que
delegan esta posibilidad en el mismo usuario.
El segundo problema relacionado con el aprendizaje es la que se refiere a la organización de la
estructura de casos. Dependiendo de la complejidad de la estructura utilizada, este proceso puede
ser más o menos complicado:
•
Si la organización es lineal, basta con añadir un nuevo elemento a la lista.
•
Si la estructura se induce a partir de los casos, será necesario redefinir la periódicamente la
estructura de indexación. Normalmente este proceso se realiza fuera de línea para no
perturbar la interacción del usuario con el sistema.
•
En los modelos más complejos donde se presentan generalizaciones de los casos, es
necesario aplicar, técnicas de aprendizaje más sofisticadas, similares a las aplicadas en otros
campos de inteligencia artificial
También se han realizado trabajos acerca del mantenimiento de la base de casos. Estas técnicas
permiten identificar casos poco utilizados y que por lo tanto puede interesar eliminar, así como
casos defectuosos o redundantes.
Tsatsoulis [33] propone una propuesta de utilizar CBR y aprendizaje y como los casos se van
expandiendo gracias al aprendizaje que el sistema realiza. Se nos presenta un sistema llamado
IDIOTS (Intelligent System for Design of Telecommunications Systems), el cual una vez tiene un
nuevo diseño ya ha sido revisado y aceptado por el sistema ha de ser recordado por el sistema.
Para este cometido han diseñado un sistema dinámico y que puede automáticamente expandir el
conociendo aprendido de las experiencias. El proceso es tan simple como tan solo añadir el
nuevo caso en la memoria dinámica, ya que la implementación del sistema está basada en la
teoría de Conceptual Clustering[34]. Esta metodología proporciona una organización del grupo
de casos que son conceptualmente relacionados, así por tanto los casos quedan almacenados en
varios niveles de abstracción y al mismo tiempo el conociendo queda organizado para su rápida
recuperación.
25
Estudio para la implementación de un sistema de razonamiento basado en casos
4. CBR CON OTRAS TÉCNICAS
CBR se ha combinado con otras técnicas de Inteligencia Artificial para la resolución de
problemas, dando así lugar a sistemas híbridos de razonamiento. Un sistema híbrido de
Inteligencia Artificial está formado por la integración de varios subsistemas inteligentes, cada
uno de los cuales mantiene su propio lenguaje de representación y un mecanismo diferente de
inferir soluciones. El objetivo de los sistemas híbridos es mejorar la eficiencia y la potencia de
razonamiento así como la expresión de los sistemas inteligentes aislados. En general la
investigación en el campo de los sistemas híbridos trata de mejorar la forma de desarrollar
sistemas y construir mecanismos más potentes, utilizando menos esfuerzo que el necesario para
generar un sistema basado en un solo sistema inteligente.
Los sistemas híbridos tienen potencial para resolver algunos problemas que son muy difíciles de
afrontar utilizando un único método de razonamiento. Por ello en este apartado se presenta la
utilización de un sistema basado en el razonamiento basado en casos con otras técnicas aplicadas
conjuntamente.
4.1 CBR Y RBS (Rule-based systems)
Los sistemas basados en reglas (rule-based systems - RBS-) son programas diseñados para
actuar como un experto humano en un dominio o área de conociendo particular, para ello aplican
técnicas de inteligencia artificial y su función es aportar soluciones a problemas y/o también
nuevo conocimiento. Los RBS disponen de una base de conocimientos (reglas) y una base de
hechos (datos relevantes relativos al problema), gracias al motor de inferencia que disponen
obtienen conocimiento nuevo a partir del existente. La inferencia puede ser de tres tipos:
deducción, es decir aplicando lógica de inferencia, inducción
donde se generalizan
observaciones para sintetizar conocimiento de más alto nivel y finalmente abducción,
razonamiento por explicación posible.
Los sistemas basados en reglas usan el “modus ponens”, es decir, si A es un hecho cierto y la
implicación A B es cierta, entonces se deriva que el hecho B es cierto. Así pues usando
técnicas de búsqueda mas comparación de patrones, los sistemas basados en reglas automatizan
métodos de razonamiento, que son progresiones de conjuntos de datos de partida hacia una
solución o conclusión.
26
Estudio para la implementación de un sistema de razonamiento basado en casos
A continuación se presentan tres artículos en los que se aplicó satisfactoriamente un RBS junto
con CBR y como dicha unión mejoró y/o ayudó en el proceso de gestión y administración del
conocimiento.
Montani y Bellazzi [35] del Departamento de Informática y Sistemas de la Universidad de Di
Pavia en Italia presentan una herramienta que aprovecha las capacidades de CBR y RBS. Se trata
de una herramienta Web para el tratamiento y decisión de pacientes que sufren Diabetes del tipo
I (IDDM), la cual es una de las mayores enfermedades crónicas en los territorios
industrializados. Para combatir la Diabetes tipo I, los pacientes necesitan inyecciones de insulina
cada cierto periodo para regular el metabolismo de la glucosa en la sangre.
Un caso de CBR es creado durante la visita periódica concretada del médico, el caso está
definido por una colección pares valor, es decir, solución – resultado. La solución es el protocolo
terapéutico asignado por el médico después de la revisión, y el resultado es el número de
episodios hypoglycemicos que sufrió el paciente al realizar dicho protocolo. Por otra parte estos
resultados son integrados en el sistema de razonamiento basado en reglas, el cual es capaz de
identificar si un paciente padece problemas de hipoglucemia o hyperglicemia, puede presentar
un listado con las sugerencias del problema y con su tratamiento de insulina, dieta e incluso
ejercicio físico recomendado. El hecho que la aplicación resida vía Web, permite al paciente
desde su propia casa ver la evolución de su historial, la insulina y los ejercicios que ha de
realizar. En cambio al médico es una herramienta para ayuda a la toma de decisiones.
Gómez et. al. [36] de la Universidad de Vigo y de la Universidad de Salamanca presentan un
trabajo sobre el estudio de aplicar las técnicas de CBR y RBS conjuntamente. Mas
concretamente el propósito del trabajo es la automatización de la tercera fase del ciclo CBR
llamada revisión, en la cual se comprueba si es correcta la solución propuesta para después ser
almacenada en la base de casos. Dicha automatización la realiza un RBS, con lo cual el
programa gana autonomía y precisión ya que no es un experto humano el que ha de decidir si la
solución es correcta.
Cuando se dispone un nuevo problema este, como en todo ciclo CBR, pasa a ser comparado con
los casos de la base de casos, para extraer aquellos casos más parecidos al caso inicial,
posteriormente el caso es adaptado para que la solución sea idónea al problema planteado y
posteriormente pasa a la fase de revisión en la cual el RBS aplica las reglas que dispone y decide
si la adaptación es correcta, si lo es se guarda en la base de casos, pero si la adaptación ha sido
incorrecta vuelve a esta fase para que sea aplicada otro tipo de adaptación al problema. De esta
27
Estudio para la implementación de un sistema de razonamiento basado en casos
forma se gana confidencialidad en el sistema y precisión a la hora de decidir que casos son los
que finalmente se guardan en la base de casos.
Golding [37] presenta una arquitectura para mejorar la precisión de un sistema basado en reglas
a través de un sistema de razonamiento basado en casos. La idea central es usar las reglas para
generar respuestas aproximadas a los problemas, y usar los casos para controlar las excepciones
de las reglas. De esta forma, se proporciona de una manera de mejorar una colección de reglas
con poco conocimiento. La arquitectura en cuestión ha sido aplicada a una aplicación de
pronunciación de nombres y es estructurada como un método y una colección de módulos de
soporte. El método núcleo es la parte que resuelve problemas, y este, incorpora dos ideas clave:
indexamiento basado en predicción, siendo una manera de indexar los casos para hacerlos más
accesibles, y en segundo lugar es necesario un predicado, que combina el resultado de RBS y
CBR. El papel de los módulos es convertir el conocimiento de entrada en una manera de poder
ser usado directamente con el método núcleo. Existen tres módulos de soporte: rational
reconstruction, theory extension, y threshold setting. El primero de ellos infiere el camino de la
solución para cada caso de la librería de casos. Ttheory extension sugiere suplementos a la reglas
de estructura para cubrir los perceptibles huecos en las reglas. Y en último lugar threshold
setting usa un procedimiento de aprendizaje para escoger valores para una colección de puntos
de partida que serán usados por el método núcleo
El sistema de pronunciación de nombres llamado Anapron, compuesto de una librería de unos
cinco mil casos, resuelve notablemente tarea de pronunciación de nombres poco frecuentes
gracias al uso de ondas comunes.
4.2 CBR y MBR (Model-based Reasoning)
MBR (Model-based Reasoning), al igual que CBR son técnicas de razonamiento de
conocimiento de dominio general, contrario a RBS que es aplicado a un dominio en particular.
Los procesos de razonamiento basado en modelos pueden ser vistos como procesos simbólicos
de una representación explicita de la mecánica interna de un sistema, con el fin de predecir,
simular e interpretar el comportamiento/reacción del sistema. Como regla general, un sistema de
razonamiento basado en modelos concentra el razonamiento sobre el comportamiento/reacción
del sistema desde un modelo explicito del mecanismo por modelación de dicho
comportamiento/reacción.
28
Estudio para la implementación de un sistema de razonamiento basado en casos
MBR es una de las técnicas básicas de adquisición de conocimiento más usadas por los
humanos. El ser humano aprende progresivamente gracias a que aplica sus modelos sobre la
realidad, es decir memoriza e imagina un modelo aproximado sobre la realidad y gracias a sus
experiencias pasadas, pueden responder a nuevos problemas. Así pues podemos ver todo este
proceso como una técnica MBR mas CBR.
Las técnicas MBR pueden representar muy concisamente el conocimiento de manera mas
completa y a mejor nivel de detalle que las otras dos técnicas de retención del conocimiento
(CBR y RBS). A continuación se presentan artículos donde se ha hecho uso de estas dos técnicas
integradas, incrementando notablemente la calidad del conocimiento.
Mérida et. al [38] proponen la integración de las estrategias de razonamiento basado en casos y
razonamiento basado en modelos para el diseño y desarrollo de RIMSAT (Remote Intelligent
Management Support and Training). La Comisión Europea financió el diseño del proyecto para
proveer de conocimiento basado en soluciones con el objetivo de garantizar la calidad de las
decisiones críticas, garantizar la seguridad y mejorar las competencias y responsabilidades de los
individuos y complejas organizaciones, es decir con el objetivo de prevención de riesgos y
catástrofes.
Gracias al uso combinado de MBR con soporte de CBR, RIMSAT puede proveer de una guía al
usuario para la ayuda en la elección de la solución más rápida y de más bajo coste posible. La
guía muestra los riesgos, el tiempo requerido y el coste de las soluciones aplicadas, para lograr
un buen enfoque entendible para el usuario en cuestión. De igual modo el sistema con la ayuda
combinada de las dos técnicas es capaz de justificar los resultados anteriores, de esta forma se
garantiza la calidad del resultado en cuestión. Los casos extraídos (utilizando CBR) se pueden
adaptar gracias a la ayuda del MBR, consiguiendo de dicha forma un nuevo caso para su
integración en el sistema.
El uso combinado de las dos técnicas es bastante beneficioso, pero RIMSAT principalmente
utiliza MBR. MBR se utiliza en la manipulación de casos (corrección, clasificación, etc.), para la
predicción temporal de la situación actual, para la revisión de todas las soluciones alternativas y
para refinar la solución extraída.
29
Estudio para la implementación de un sistema de razonamiento basado en casos
Bruninghaus y Ashley [39] de la Universidad de Pittsburg, presentan un algoritmo llamado IBP
(Iterative Belief Propagation), el cual combina razonamiento basado en casos y razonamiento
basado en modelos para una aplicación que interpreta y predice casos legales.
IBP interpreta la situación del caso legal, para llevar a cabo dicha interpretación, el algoritmo
identifica problemas y cuestiones del caso a tratar, usando para ello un modelo de dominio y
conocimiento sobre estos problemas y cuestiones. Posteriormente para cada problema y cuestión
identificado IBP determina lo bueno y lo malo que se puede extraer, es decir, el conocimiento
sobre los dos aspectos. Para lograr esto dispone del razonamiento basado en casos, es decir CBR
resuelve el conflicto de los problemas y cuestiones que IBP identifica. En último lugar IPB
combina este análisis con modelos de dominio para así poder crear la predicción sobre el caso.
Branting et. al. [40] han creado una técnica basada en MBR llamada model-based adaptation,
para ser integrada en un sistema CBR capaz de predecir el comportamiento de un sistema
biológico. Esta propuesta ha sido implementada en CARMA, un sistema para el manejo y
monitorización del consumo de forraje en una pradera a causa de los saltamontes. Los expertos
humanos guardan las experiencias de campo en forma de casos para su posterior inserción en el
sistema y crean modelos de análisis y predicciones sobre sus observaciones para conseguir que
la fase de adaptación se vuelva más precisa.
Para la fase de adaptación, CARMA utiliza tres subfases de la técnica model-based adaptation.
Estas subfases son: temporal project, feature adaptation, and critical period adaptation. La
primera de ellas hace referencia a que los casos hacen referencia a un momento y lugar concreto,
los casos están muy limitados por falta de información. Por ello hace falta un planteamiento más
general para simular el comportamiento y entender la situación de la población. En la segunda
fase las características de conducta son adaptadas y aproximadas mediante funciones que tienen
en cuenta tanto el tiempo de vida como el total de área infectada. La última fase es sólo si la
consumición de forraje de la pradera se da en época de crecimiento.
Gracias a su entorno de ventanas para la comodidad del usuario, CARMA ofrece explicaciones
del comportamiento biológico de una zona, así como las estimaciones de perdida de forraje,
migraciones de saltamontes y factores perjudiciales al paso del tiempo.
30
Estudio para la implementación de un sistema de razonamiento basado en casos
4.3 CBR y Lógica Difusa (Fuzzy Logic)
Las lógicas difusas son esencialmente lógicas multivaluadas que extienden las lógicas clásicas.
Las lógicas difusas procuran crear aproximaciones matemáticas en la resolución de ciertos tipos
de problemas. Pretenden producir resultados exactos a partir de datos imprecisos. El adjetivo
“difuso” aplicado a ellas se debe a que los valores de verdad utilizados en ellas tienen, por lo
general, una connotación de incertidumbre. Lo difuso puede entenderse como la posibilidad de
asignar más valores a los enunciados que los clásicos “falso” o “verdadero”. Así pues las lógicas
difusas son tipos especiales de lógicas multivaluadas.
El objetivo de todo sistema manejador de una lógica difusa es describir los grados de los
enunciados de salida en términos de los de entrada. Más aún, algunos sistemas son capaces de
refinar los grados de veracidad de los enunciados de salida conforme se refinan los de los de
entrada.
Las lógicas difusas han dado origen a sistemas expertos de tipo difuso y a sistemas de control
automático. Entre ellos, son de nuestro interés los que integran CBR. A continuación se
presentan tres artículos en los se aplicó CBR y lógica difusa.
Hansen et al. [41] proponen una aplicación llamada WIND-1 que combina razonamiento basado
en casos y metodología de lógica difusa para la predicción meteorológica. En concreto la
metodología ha sido integrada en el algoritmo k nearest neighbors para la recuperación de los
casos más similares. Los autores llaman a este método fuzzy k-nn y según ellos el sistema es
capaz de predecir con bastante exactitud el tiempo en las seis horas siguientes a su puesta en
funcionamiento. Para ello el sistema cuenta con una base de casos compuesta de 300.000 horas
de observación de un aeropuerto, es decir unos 36 años de experiencia.
Fuzzy K-nn utiliza varias medidas de similitud para encontrar los grados de similitud (cercano,
muy cercano, un poco cercano, etc.) entre los casos de la librería. Si se produce contradicción
entre los casos, el sistema utilizara estadísticas meteorológicas para obtener su predicción. Una
vez recuperado los casos, se crea un esquema para mostrar una predicción lo más exacta posible
del tiempo en las próximas horas.
31
Estudio para la implementación de un sistema de razonamiento basado en casos
Corchado et al. [42] presentan un método combinado de lógica difusa y CBR para la predicción
biológica del agua. Mediante lógica difusa se automatiza la etapa de revisión del sistema de
razonamiento basado en casos; asimismo ayuda en el proceso de obtención de la solución más
precisa. El sistema en cuestión ayuda a medir los niveles de concentración de di-átomos y
microorganismos existentes en las diferentes masas de agua.
La metodología propuesta deriva de la extensión del modelo de Takagi Sugeno Kang (TSK
Fuzzy) [43], pero incrementa considerablemente la capacidad de respuesta del sistema antecesor.
El motivo principal de esta mejora es que el nuevo método generaliza diversas características de
comparación y elimina ambigüedades que el anterior sistema cometía. En el proceso de revisión,
el sistema de lógica difusa es capaz de calcular un porcentaje de error mediante la utilización de
un vector de atributos (temperatura, PH, oxigeno, y otras características de las masas de agua),
que se encuentra asociado a todos los casos. Gracias a dicho vector el método difuso identifica
errores y estados erróneos que serían difícilmente localizables por un experto humano. El
sistema queda automatizado y con ello gana eficacia y precisión tanto en sus soluciones como en
la incorporación de los casos nuevos a la librería.
Bandini et al. [44] presentan una propuesta de fusión entre las técnicas de fuzzy logic y CBR
para su integración en el proyecto P-RACE. Las técnicas ayudan al soporte técnico para la toma
de decisiones a la hora de escoger los componentes y el dibujo que ha de tener la goma de la
rueda del vehículo de carreras, pues las condiciones climatológicas, los componentes químicos,
el calor en el asfalto, estabilidad, resistencia y otros factores a tener en cuenta pueden determinar
la victoria durante una carrera.
La propuesta captura el episodio que más se ajusta a la situación actual. Para ello se dispone de
una base de casos de la experiencia recogida de las observaciones realizadas por expertos
técnicos durante los entrenamientos y las competiciones oficiales. La técnica fuzzy logic es
utilizada para dicha recuperación de los casos más similares de la base de casos del sistema
CBR. El concepto de difuso es especialmente importante en este dominio ya que se ha de tener
en cuenta a la hora de recuperar los casos el estado del circuito, si esta mojado (bajo, medio,
alto), si esta seco (bajo, medio, alto), incluso otros factores como son la dificultad de la pista, su
temperatura, el número de curvas y por supuesto las condiciones climatológicas. Con la
obtención de todos estos parámetros se obtiene los casos más similares de la base de casos. En
caso necesario el caso recuperado más parecido sería adaptado a la nueva situación e
incorporado la base de casos para su futura consulta.
32
Estudio para la implementación de un sistema de razonamiento basado en casos
El sistema P-RACE es utilizado por el departamento Motorsports de la compañía Pirelli para el
reuso de las experiencias adquiridas en las carreras. El sistema consta de otras partes como por
ejemplo una base de datos sobre las actividades de las competiciones (fecha, vehículo, tiempos
etc.). P-RACE incrementa la calidad de las decisiones y la precisión de la carrera gracias al
conocimiento adquirido durante las competiciones.
4.4 CBR y algoritmos genéticos
Los algoritmos genéticos son métodos sistemáticos para la resolución de problemas de búsqueda
y optimización que aplican a estos los mismos métodos de la evolución biológica: selección
basada en la población, reproducción sexual y mutación. El problema a resolver se parametriza
en una serie de variables y se codifican en un cromosoma, sobre los cuales actúa el algoritmo
genético mediante las operaciones crossover y mutation. En el algoritmo genético va implícito el
método para resolver el problema. Hay que tener en cuenta que un algoritmo genético es
independiente del problema, lo cual lo hace un algoritmo robusto, por ser útil para cualquier
problema, pero a la vez débil, pues no está especializado en ninguno. Un algoritmo genético
optimiza sólo una función, no diversas funciones relacionadas entre sí simultáneamente. Por lo
tanto, un algoritmo genético consiste en lo siguiente: hallar de qué parámetros depende el
problema, codificarlos en un cromosoma, y se aplican los métodos de la evolución: selección y
reproducción con intercambio de información (crossover) y alteraciones que generan diversidad
(mutation). La aplicación de la unión de estas dos técnicas y su beneficio en la adquisición del
conocimiento se puede ver a gracias a los artículos presentados a continuación:
Como se mencionó anteriormente en el apartado 3.2 Reuse, Maher y Gómez de Silva [27] de la
Universidad de Sydney presentan una propuesta para el empleo de algoritmos genéticos en
combinación con un sistema de razonamiento basado en casos concretamente se utilizan los
algoritmos genéticos para la adaptación de la solución al nuevo problema.
Como podemos ver en este sencillo esquema de la Figura 7, se comienza con la especificación
de un nuevo problema, este se compara con la base de casos para recuperar los casos que más se
le parezcan, y a la hora de adaptar la solución se utiliza un algoritmo genético. Para ello se
establecen tres nociones fundamentales que son el genotype, el cual es una manera de representar
o codificar la información la cual será utilizada para producir el phenotype, que será la solución,
y por último el concepto survival of the fittest, que determina que genotype sobrevive para
reproducirse.
33
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 7. Ciclo CBR empleado por Maher y Gómez de Silva [15]
Así pues abra selección y reproducción de genotypes con intercambio de información y
alteraciones que generan diversidad, es decir mutaciones que generan diversidad de la
información, sino siempre se utilizaría la misma información. Si después de aplicarse este ciclo
de vida no se encontrara la solución el algoritmo genético volverá a aplicar otro ciclo completo
de vida. Ya que el material genético (información) es entregado a la siguiente generación. Una
vez se ha dado con la solución correcta al problema, se representa la información de la solución
en forma de caso y este queda representado en la base de casos
Khoshgoftaar et al. [45] presentan una herramienta llamada CBR GA-Optimizer que combina
algoritmos genéticos y CBR para mejorar el orden de módulos de software según su calidad. La
calidad se mide según el número de fallos con base en un conjunto de métricas de procesos y
productos. El orden relativo de los módulos se predice mediante MOM(s) (Module-Order
Model).
El algoritmo genético comienza con una colección de soluciones en la cual mecanismos de
evolución para obtener la mejor solución. Dicha población inicial genera otra secuencia de
poblaciones usando tres tipos de operaciones, crossover, mutation, y reproduction. Los
elementos de la población son llamados cromosomas y cada cromosoma, consistente en una
colección de genes, es caracterizado y medido por una función de refinamiento. Para cada
generación el algoritmo utiliza las tres operaciones antes comentadas para llegar a la solución
más óptima y precisa. CBR GA-Optimizer consta de dos mecanismos esenciales para su
funcionamiento. El mecanismo de algoritmos genéticos crea la población de cromosomas, y
envía a cada cromosoma al solucionador CBR, el segundo mecanismo, el cual lo evalúa y
reenvía la solución al algoritmo genético para su tratamiento correspondiente.
34
Estudio para la implementación de un sistema de razonamiento basado en casos
Louis et al. [46] describen un sistema de dominio general para la explicación de soluciones
generadas a través de la utilización de algoritmos genéticos en hibridación con sistemas basados
en el razonamiento. Los autores aplican CBR con algoritmos genéticos para obtener un análisis
sobre el historial de la búsqueda que dio como resultado la solución final. En términos de
genética, el genotype será utilizado como individuo que transporta su información a otros
individuos por reproducción, causando con ello el intercambio y mutación de la información.
Los individuos mejor adaptados transmitirán su información a la siguiente generación.
El sistema CBR crea un caso para cada individuo que el algoritmo genético ha evaluado. Esos
casos son indexados dependiendo de su eficacia y similitud sintáctica. Para este fin, el sistema
utiliza la construcción de bloques de hipótesis (BBH – building block hypothesis), estos bloques
son sub-soluciones que utilizan las métricas generadas por el algoritmo genético para indexar el
caso. Una vez el caso está adecuadamente formado y analizado, este puede contribuir a la
comprensión de la solución. Al término de la ejecución del algoritmo genético, el caso base que
se ofrece como solución, permite su interpretación y también su posible adaptación si fuera
necesaria.
4.5 CBR y ANN (Artificial Neural Networks)
Las redes neurales artificiales (ANN), son algoritmos implementados en forma de programas o
modelos electrónicos influenciados por el funcionamiento del cerebro humano. Las redes
neuronales tratan de imitar el proceso de almacenar información en patrones y utilizarlos para
resolver problemas con ellos. Con ello intentan reproducir el comportamiento humano mediante
ordenadores.
Figura 8 : Estructura de una ANN
La Figura 8 muestra el esquema de una red neuronal. Una red neuronal puede verse como un
conjunto de neuronas interconectadas, de tal forma que la salida de una neurona cualquiera, sirve
generalmente como entrada de otras neuronas. En este diagrama se representan las neuronas
como círculos. Algunas de ellas interaccionan con el medio para recibir las entradas. Las
35
Estudio para la implementación de un sistema de razonamiento basado en casos
neuronas de la capa de salida generan los valores que la red cree que corresponden con los
valores de entrada a la red. El número de neuronas, la disposición de las mismas y las
conexiones entre ellas determinan su componente estructural (arquitectura o topología). Este
define las rutas a través de las cuales se propagan las señales cuando se procesa información. La
principal propiedad de una red neuronal es la capacidad de aprender del entorno en el que opera
y mejorar su funcionamiento. Así, los parámetros de una red neuronal se adaptan como
consecuencia del proceso de estimulación originado por el entorno en el que opera.
A continuación se presentan algunos trabajos en los que se integran CBR y redes neuronales,
potenciando con ello la forma de resolver problemas que hubieran sido problemáticos al aplicar
un único método de razonamiento.
Martin et al. [47]
trabajaron en el desarrollo de STOY (Sistema de información para la
planificación del impacto del ruido en el ambiente), que tiene como finalidad monitorizar,
controlar y planificar la polución acústica proveniente de una Escuela de Artillería en Noruega.
El sistema, que implementa un sistema de CBR, utiliza una red neuronal como procesador para
el reconocimiento de las diferentes fuentes de ruido (conducción de tanques, fuertes disparos,
etc.) generadas en el entorno, que son medidas cada segundo por ocho estaciones
meteorológicas, para su posterior inclusión en la base de casos del CBR (indexando los nuevos
casos). Los autores aseguran que el porcentaje correcto de reconocimiento de fuentes de ruido
supera el 90%, mientras que los casos restantes (en los que no se ha podido identificar el origen
del ruido), son grabados para ser identificados manualmente por los expertos.
Corchado et al. [48] han desarrollado sistemas híbridos CBR/redes neuronales capaces de
predecir temperaturas oceanográficas de forma más acertada de lo que lo harían cualquiera de
los sistemas de razonamiento utilizados en el híbrido por sí mismos. En este caso se describe una
aplicación de Inteligencia Artificial para predecir la estructura de la temperatura del agua que se
produce a causa del moviendo de un buque.
La temperatura oceanográfica puede variar considerablemente según el lugar en lugar en el que
el buque se encuentre, ya que existen áreas en donde convergen diferentes masas aguas. Para
mantener esta información se utiliza una base de casos, creada con la información recogida de
travesías de buques e imágenes vía satélite. Los casos contienen la situación oceanográfica mas
un vector de temperaturas. En la extracción se utilizan diferentes métricas para determinar la
similitud entre el nuevo problema planteado y la librería de casos. Una vez recuperado el caso se
36
Estudio para la implementación de un sistema de razonamiento basado en casos
utiliza la habilidad de las redes neuronales para guiar la adaptación de los casos. La aplicación de
los dos sistemas hace que sea posible predecir en tiempo real la situación de la temperatura del
agua. El sistema fue probado en el océano Atlántico, en diferentes regiones y a diferentes
kilómetros recorridos, consiguiendo buenos resultados, ya que el sistema producía errores del
orden de 0.02ºC.
Sovat et al. [49] Proponen un mecanismo basado en las redes neuronales para la recuperación y
adaptación de los casos de un sistema CBR. La propuesta es de dominio general y según sus
autores mejora notablemente estas del ciclo CBR y como consecuencia aumenta la calidad de la
solución, ya que la intervención del experto humano no sería necesaria en la fase de adaptación.
La idea principal en la recuperación de un caso es la implementación una plantilla mediante
redes neuronales para obtener un método que identifique similitudes correctamente entre el
nuevo problema y los demás casos. Para ello, esta plantilla utiliza vectores de atributos que
pueden ser numéricos (enteros y reales), enumerados, listas, cadenas y boleanos. Las cadenas se
utilizan para representar información auxiliar y las listas pueden contener cualquier otro tipo de
atributos. Posteriormente este vector es normalizado y empleado para buscar similitudes. Para la
fase de adaptación de los casos recuperados se aplican dos pasos. El primero será realizado
exclusivamente por la red neuronal, para ello se añadirán o extraerán los atributos
correspondientes del problema a fin de configurar la adaptación, y también se incluirá cualquier
clase del proceso a fin de facilitar la integración con los otros casos de la librería. El segundo
paso, como adaptación final del caso, éste se lleva a cabo mediante reglas. Posteriormente el
caso es indexado en la base de casos para ser utilizado en caso necesario.
4.6 CBR y Ontologías
Como se ha dicho en anteriores ocasiones, cuando se dispone de un gran volumen de
información, esta tiene que estar clasificada y categorizada para poder ser extraída
eficientemente. Sin embargo, estos datos por sí solos, sin tener una semántica asociada, no
resultan de utilidad, ya que resultan ambiguos. Es por ello que se tiene que documentar estos
datos, para dotarlos de un significado. Es decir, se deben usar datos para describir los propios
datos, o lo que es lo mismo, metadatos. Las ontologías proporcionan maneras de clasificación de
la información y de los conceptos que en ella residen, maneras de clasificación de los metadatos.
37
Estudio para la implementación de un sistema de razonamiento basado en casos
La ontología se refiere a un conjunto de conceptos organizados jerárquicamente, se define como
el resultado de seleccionar un dominio y aplicar sobre el mismo un método para obtener una
representación formal de los conceptos que contiene y las relaciones que existen entre los
mismos. Esta metodología de jerarquización de la información es clasificada como si se utilizara
una metodología orientada a objetos, la cual permite aplicar conceptos como la herencia (padrehijo) y hacer razonamiento de conceptos. Esto es un factor fundamental en la clasificación de la
información.
A continuación se presentan dos artículos en los que se aplicó la técnica comentada
anteriormente junto con un sistema de razonamiento basado en casos.
Diaz-Agudo y Gonzalez [50] describen una propuesta CBR para la construcción de un sistema
que combine casos específicos de conocimiento y modelos de dominio de conocimiento general.
Describen CBROnto como una Ontología CBR que especifica una estructura modelada para
describir la reusabilidad CBR, es decir para describir métodos de solución de problemas basados
en tareas CBR que ellos solucionan. El trabajo que se realizó es el desarrollo de COLIBRI
(Cases and Ontology Libraries Integration for BuildingReasoning Infrastructures), un entorno
de ayuda durante el diseño del conocimiento CBR. El núcleo de la arquitectura de COLIBRI es
CBROnto, una Ontología que incorpora un CBR común.
CBROnto resuelve dos grandes problemas comunes cuando se aplican métodos para la solución
de problemas. El primero de ellos es debido al hecho de que los métodos para la solución de
problemas pueden usar una diferente terminología de la que se usa en el dominio. Para ello
CBROnto une esta brecha usando un mecanismo basado en descripciones lógicas (Description
Logics – DL’s). Las DL’s son comúnmente utilizadas por las Ontologías para formalizar
aspectos de la representación y de razonamiento, es decir capturan el significado de los datos
concentrándose en las entidades (agrupadas en conceptos) vinculadas por relaciones. El segundo
problema que resuelve CBROnto son los requerimientos de conocimiento requeridos por los
métodos para la solución de problemas. De nuevo las DL’s es el método utilizado para chequear
si los requerimientos de los métodos son satisfechos por el contexto de la aplicación, el cual esta
compuesto del conocimiento del dominio y de los casos base.
Ceccaroni de Laboratorios Fujitsu en cooperación con Cortés y Sánchez-Marré de la
Universidad Politécnica de Catalunya [51], han diseñado una arquitectura llamada OntoWEDSS.
La arquitectura es un sistema de ayuda a la toma de decisiones en el tratamiento de aguas
residuales. OntoWEDSS integra rule-based reasoning (RBR) y CBR (case-based reasoning), los
cuales incrementan considerablemente su potencial gracias al uso combinado con la ontología
38
Estudio para la implementación de un sistema de razonamiento basado en casos
que ellos especifican. La arquitectura de OntoWEDSS integra varios tipos de datos y unas
cuantas técnicas de AI (Artificial Intelligence), pero su tratamiento es bastante flexible. El
dominio es representado en detalle y se obtiene una explicación de la evolución de las
comunidades de microorganismos que el sistema detecte en la planta de tratamiento de agua, es
decir, gracias a OntoWEDSS es posible capturar, entender y describir el conocimiento adquirido
del entonto físico, químico y microbiológico existente en la planta de tratamiento.
OntoWEDSS incorpora una base de conocimiento microbiológico para los procesos de
razonamiento y representa relaciones causa-efecto. También hace uso de una Ontología para el
modelado del dominio y así poder clarificar la confusión de términos que podría producirse entre
ellos. Además es capaz de descubrir estados problemáticos en la planta y hacer uso de 2 sistemas
de razonamiento que son el RBR y el CBR, ellos supervisan la gestión de los procesos en 3
capas: percepción, diagnostico y soporte a la toma de decisiones.
Así pues, OntoWEDSS es un sistema para la ayuda a la toma de decisiones gracias a que es capaz
de señalar los posibles problemas de microorganismos, capaz de mostrar la situación de la planta
de agua y capaz de sugerir las mejores prevenciones para el manejo de ella.
39
Estudio para la implementación de un sistema de razonamiento basado en casos
5. MOTORES DE CBR
Respecto a los posibles dominios de desarrollo o circunstancias idóneas para la aplicación de un
sistema CBR, se deben tener en cuenta dos fuentes distintas de información. Por una parte
aquellos ámbitos en los que se ha dado una aplicación comercial real de CBR a la industria, y
por otro lado la larga lista de aplicaciones desarrolladas en entornos académicos para demostrar
la funcionalidad de CBR en dominios concretos de aplicación.
A continuación se presenta una breve descripción de los principales motores académicos y
comerciales de CBR.
5.1 Motores académicos
El aprendizaje basado en problemas, que surgió como técnica novedosa en la enseñanza superior
desde mediados de la década de los sesenta, se ha vuelto con el transcurso de los años en una de
las más prometedoras formas de acercamiento a la enseñanza, básicamente por promover
aspectos fundamentales en la optimización de la educación, como por ejemplo proveer de un
entorno en donde el estudiante está inmerso en actividades de la práctica cotidiana y en una
constante retroalimentación con los demás estudiantes. Otro aspecto es que el aprendizaje es
funcional, es decir, basado en la solución de un problema real y por ello se asegura la calidad de
la enseñanza. Pero se comprendió que este sistema de aprendizaje tenía mucho potencial para
quedarse estancado en el ámbito académico así que su paradigma se trasladó también a las
empresas.
Como se ha mencionado inicialmente las investigaciones sobre CBR se han realizado en las
universidades. Es así, que existen diversos proyectos desarrollados que implementan las
características más actualizadas de los sistemas CBR. A continuación se presenta una breve
descripción de los proyectos académicos más relevantes, de los cuales se instaló y ejecutó los
motores de Caspian, IUCBRF, Cbr-Shell y Selection Engine, de esta forma se estudió su
instalación, configuración y tratamiento de los casos de una forma más exhaustiva.
5.1.1 Caspian
CASPIAN [52], desarrollado en la Universidad de Gales, es una herramienta CBR de dominio
público, escrito en el lenguaje C que funciona bajo los sistemas MS-DOS y Macintosh. La
40
Estudio para la implementación de un sistema de razonamiento basado en casos
herramienta es de ámbito general y la representación de los casos es muy simple, es decir se
almacenan en un archivo ASCII.
La recuperación de los casos más similares se hace a través de del algoritmo Nearest Neighbor y
la adaptación de los casos se realiza mediante un conjunto de Reglas definidas también en un
archivo ASCII. Su interfaz es sencilla puesto que se emplea desde la línea de comandos del
sistema MS-DOS o Macintosh.
CASPIAN puede crear una base de casos de un archivo de casos escrito en el lenguaje CASL,
este es un lenguaje usado para los sistemas basados en el conocimiento. Para que CASPIAN
genere una base de datos se realiza a través del contenido de un archivo creado en CASL
conocido como Case File, CASPIAN utiliza dicho archivo para la base de casos en la memoria
de la computadora. Cuando un nuevo caso es añadido a la base de casos, este también es añadido
al final del archivo Case File.
Una vez creado el archivo Case File, se le da un nombre para guardarlo. Imaginemos que hemos
guardado casos de recetas de cocina en un fichero llamado Chef.
Para poder invocar a CASPIAN desde la línea de comandos haremos lo siguiente:
Caspian <filename>
Donde <filename> será el nombre del archivo que hemos creado en CASL. Al momento
CASPIAN realizará lo necesario para la creación de la base de casos en memoria y veremos por
pantalla estos pasos:
Reading case file…ok
Type checking…ok
Checking for doubly defined fields…ok
Checking for multiple fields…ok
Checking for doubly defined case names…ok
Checking for non-unique enumeration symbols…ok
Checking index block…ok
Checking modification rules…ok
Checking repair rules…ok
Building index structure…ok
41
Estudio para la implementación de un sistema de razonamiento basado en casos
Estas líneas nos indican que el archivo ha sido leído y que ha pasado satisfactoriamente todas las
pruebas. Una vez esto a pasado el sistema está preparado para los problemas que se le planteen
al sistema. El orden de ejecución en CASPIAN será el siguente:
1. El usuario introduce un caso para la comparación (the user case)
2. El programa efectúa una búsqueda indexada y encuentra una lista de los mas
parecidos según las restricciones del caso del usuario.
3. Si no se encuentran casos con las restricciones del caso del usuario, el sistema realiza
una indexación diferente sobre los valores para encontrar algún caso.
4. Un caso es seleccionado
5. La solución se repara si es necesario o no y se ofrece como resultado al usuario
Todos los errores que ocurren cuando se lee y se chequea el archivo con los casos base son
fatales y causan la salida del programa con el error code 1.
5.1.2 Selection Engine
Selection Engine [53] es un proyecto de código abierto desarrollado por Baylor Wetzel en el
2001. Esta implementado en Java y utiliza el algoritmo k-Nearest Neighbor para calcular la
similitud con los casos buscados. Este conjunto de librerías no está documentada por el autor,
pero este ha incluido algunos ejemplos de código con la distribución. Sus principales
características son:
1. Filtrado estándar de datos.
2. Similitud de instancias.
3. Tipos de datos por similitud.
4. Pesos
5. Búsqueda de atributos.
6. Fácil integración con otras aplicaciones
Por defecto, Selection Engine (SE) lee datos y metadatos de ficheros de texto y envía la
respuesta a la salida estándar. La clase principal se llama SimilarityEngine, esta utiliza las clases
de SimilarityCriteria, SimilarityWeights e Items. SimilarityCriteria representa los criterios de
similitud elegidos por el usuario, SimilarityWeights representa los pesos asignados por el
42
Estudio para la implementación de un sistema de razonamiento basado en casos
usuario a cada uno de los criterios de SimilarityCriteria; Items representa los casos fuente
extraídos de la base de casos.
Los tipos de datos que Selection Engine reconoce son: integer, floats, strings y valores boleanos.
Para valores numéricos reconoce dos valores especiales [MAX_VAL] y [MIN_VAL], que son
determinados para usarlos en los atributos de objetos Item.
En Selection Engine para la comparación y búsqueda entre el caso nuevo y todos los de la base
de casos se emplean atributos, valores y operadores. existen de 3 tipos de operadores:
1. ~
Significa “alrededor” y solo es utilizado en números.
2. % Significa “preferencia” y solo es utilizado en strings y boleanos.
3. !% Significa “exclusión” y solo es utilizado en strings y boleanos
Por ejemplo: “Edad ~ 37” (búsquedas realizadas alrededor de 37 años)
“Nombre % Manuel (búsquedas donde el nombre sea Manuel)
“Nombre !% Manuel (búsquedas que excluyan el nombre Manuel)
Existen operaciones relacionales usadas por la clase FilterEngine (=, !=, <, >, <=, >=) que se
utilizan para maximizar el filtrado de atributos numéricos. Por ejemplo, “Edad <30”, este filtrado
buscaría casos en que la edad fuera menor que treinta. Por defecto el peso de todos los atributos
es de 1, y este solo afecta a los operadores de similitud (~, %, !%).
El procedimiento de cálculo de similitud es el siguiente:
•
Calcular la distancia máxima de los n atributos.
•
Calcula las distancia entre el caso base y los casos fuente mediante el algoritmo Nearest
Neighbour.
•
Divide las distancias entre la distancia máxima encontrada (mediante normalización el
proceso)
•
Se crean porcentajes de similitud entre la distancia del caso base y los k vecinos (casos
fuentes) más próximos - k-Nearest Neighbour -.
43
Estudio para la implementación de un sistema de razonamiento basado en casos
5.1.3 NaCoDAE
NaCoDAE [54], Navy Conversational Decision Aids Environment ha sido desarrollado en el
Centro Naval de la Armada de los EEUU y ha sido aplicado a la investigación en el campo de la
Inteligencia Artificial. NaCoDAE es un prototipo desarrollado bajo el proyecto Practical
Advances in Case Based Reasoning, el cual tiene tareas de asistencia naval, y otras como la
ayuda a la toma de decisiones, mantenimiento, formación operacional, respuesta de crisis,
planificación, logística, diagnósticos de fallos, etc.
NaCoDAE está implementado en Java por lo que puede ser usado en cualquier computadora que
contenga la maquina virtual de Java, por lo tanto puede ser usado tanto en PCs Windows
95/98/NT, Sun Solaris y Macintosh como en plataformas Unix. Según sus características, sus
capacidades son:
•
Case Libraries: Crear, editar, cargar y guardar.
•
Browsing: Casos, descripciones de problemas y soluciones.
•
Problem Solving: Conductas iterativas o simuladas.
•
Parameter Settings: Cargar, editar Parámetros.
•
History: Colecciones automáticas de resultados de las sesiones de resolución de
problemas.
•
Library Revision: Se revisan automáticamente las librerías de casos.
Al descomprimir NaCoDAE en el directorio deseado encontraremos lo siguiente:
•
Una colección de *.class conteniendo la plataforma ejecutable independiente de Java.
•
Un fichero de Parámetros, con parámetros por defecto.
•
Directorio de Librerías, conteniendo la librería de casos.
•
Directorio Outputs, el directorio por defecto en el cual el sistema escribe los archivos de
salida.
•
Directorio Images, contiene los archivos de imagen de la aplicación.
Un caso en NaCoDAE esta definido por un nombre, un título, una descripción y la solución del
caso, el nombre del caso solo identifica al caso. El problema del caso es descrito textualmente y
dispone de una colección de pares pregunta-respuesta. Las preguntas están es formato texto, en
cambio las respuestas son del tipo binario (yes/no) o numéricas. Las soluciones son secuencias
de acción, donde son representadas por texto.
44
Estudio para la implementación de un sistema de razonamiento basado en casos
La propuesta de NaCoDAE para solucionar los problemas que se le plantean, es un visor del
programa llamado converser. El programa conduce a una serie de conversaciones interactivas
con el usuario, las cuales consisten en los siguientes pasos:
1. Una descripción parcial del problema.
2. Selección de las preguntas a contestar.
3. Contestando las preguntas seleccionadas.
4. Repetir los pasos previos o terminar la conversación.
Después de la conversación NaCoDAE mostrará una lista con los resultados de los casos más
similares.
Los parámetros de configuración general del programa son diversos y variados:
•
Silent: Si esta activo el usuario No visualizará todos los pasos del conversador del
programa a la hora de solucionar problemas, en cambio si no esta activo se podrán
visualizar todos los pasos.
•
Interactive: Este modo es solo relevante si el modo Silent esta inactivo. Si el modo
interactivo esta activo el usuario podrá conducir la conversación por donde a él le
parezca más relevante. Por el contrario, si está el modo inactivo la conversación será
conducida automáticamente por un simulador humano.
•
Debug Level: Controles de nivel de la depuración de la información.
•
Query Seeds: Cuando se utiliza el simulador humano se determina cuantas cuestiones
son automáticamente contestadas.
•
Similarity Metric: Determina que tipo de métrica de similitud será utilizada.
•
Max Queries: Cuando el modo Silent esta activo el parámetro seré el numero de casos
que manejará el simulador humano. Si el parámetro esta a 0 se miraran todos los casos.
5.1.4 IUCBRF
IUCBRF [55] ha sido desarrollado en la Universidad de Indiana para facilitar el desarrollo de los
sistemas basados en conocimiento. Ya que esta creado con Java puede ser usado en cualquier
ordenador que contenga la máquina virtual de Java.
IUCBRF tiene dos propuestas primarias:
45
Estudio para la implementación de un sistema de razonamiento basado en casos
1. Facilitar la reutilización del código
2. Servir como una herramienta pedagógica
Para la facilitación de la reutilización del código se ha de decir que con IUCBRF el diseño de los
nuevos sistemas CBR requieren menos reescritura del código común y los componentes pueden
ser intercambiados dentro y fuera del sistema. A más las ventajas de la reutilización del código
es beneficiaria en el ámbito educacional. Por ejemplo un sistema puede ser un lugar en el que los
estudiantes puedan implementar técnicas para la búsqueda de documentos sin necesidad de
preocuparse mucho sobre los detalles de la codificación.
IUCBRF puede ser aplicado a muchos dominios distintos, es decir mantiene la independencia del
dominio y de otros componentes. Existen tres maneras de indexación que son implementados en
IUCBRF. El primero y el más simple de los tres es la creación de la base de casos de manera
horizontal en que todos los casos son almacenados en una lista desordenada. La segunda forma
es almacenada en un archivo B-tree-backed. Y la tercera y última es en forma de d-tree, en el
cual los casos son agrupados de acuerdo con características comunes
El algoritmo de recuperación de casos de la base de casos que utiliza IUCBRF es k-nearest
neighbor (kNN), es decir los k casos con la descripción de un problema más cercana al problema
planteado, de acuerdo con el criterio de similitud, son recuperados.
Las propuestas de adaptación de IUCBRF son:
•
No adaptación
•
Porcentaje de pesos
•
Pesos máximos
La primera y más simple tipo de adaptación es la no adaptación, se devuelve la solución del
primer caso recuperado sin adaptar. La adaptación porcentaje de pesos, se asume la posibilidad
de la conversión de una solución a un doble valor. Dada una lista ordenada de casos recuperados
se devuelve el promedio del valor de la solución. Por último la adaptación pesos máximos,
también asume la posibilidad de la conversión de una solución a un doble valor, pero dada una
lista ordenada de casos recuperados se devuelve la solución que ha obtenido más valor.
IUCBRF cumple con las metas de independencia del dominio e independencia de otros
componentes JAVA. Esto beneficia a diseñadores de sistemas CBR de muchas maneras, por
ejemplo reduce el código que debería escribir un diseñador a la hora de construir un sistema
46
Estudio para la implementación de un sistema de razonamiento basado en casos
CBR. Así mismo, IUCBRF es muy extensible, cada paquete de componentes contiene una clase
de componente base con la cual se resume en general la funcionalidad requerida por cada clase
del tipo.
5.1.5 Cbr-Shell
CBR-Shell [56] ha sido desarrollado en el Artificial Intelligence Applications Institute (AIAI) de
la Escuela de Informáticos de la Univerdad de Edinmburgo. AIAI CBR Shell es una herramienta
que emplea algoritmos genéticos para el desarrollo de sistemas basados en casos.
CBR Shell se ejecuta mediante un applet java. Ha sido probado en Mozilla 1.2, en Linux,
Explorer 6.0, Windows XP y en Mac OS, con mínimamente la máquina virtual Java versión 1.4.
El núcleo del sistema ha sido aplicado con éxito a dominios muy difíciles de representar, como
detección de fraudes, diagnóstico de fallos en motores de aviones, valoración de riesgos de
enfermedades etc.
Respecto a los procesos CBR ofrece algoritmos de matching basados en lógica difusa,
algoritmos genéticos para aprendizaje de pesos, recuperación basada en el algoritmo nearest
neighbor y k-nearest neighbor, medidas de confianza adaptativas y algoritmos de diagnóstico
múltiple.
La herramienta realiza clasificación basada en la comparación de casos. Los parámetros de los
algoritmos pueden variar, por ejemplo:
•
El número de vecinos más próximos considerados pueden especificarse.
•
Los pesos (importancia) pueden establecer valores manualmente
•
Los pesos pueden optimizarse mediante algoritmos genéticos. La importancia del
algoritmo se mide mediante evaluación discriminatoria (leave-one-out).
5.2 Motores Comerciales
Los avances académicos más “maduros” se han implementado en herramientas comerciales. La
mayoría de estas herramientas se enfoca en la recuperación y retención de casos. Permiten al
usuario personalizar sus características según sus necesidades. Existen infinidad de herramientas
en el mercado, algunas de las más importantes se mencionan a continuación.
47
Estudio para la implementación de un sistema de razonamiento basado en casos
5.2.1 Kate
KATE [57] ha sido desarrollada por la empresa AcknoSoft y puede funcionar en entornos
Windows y Unix. El dominio de aplicación de esta herramienta son los sistemas inteligentes
para el soporte de decisiones. La representación de la base de casos se realiza a través de casos
jerarquizados.
KATE está en una suite formada por una serie de productos (KATE-editor, KATE CBR, KATE
Datamining, KATE Runtime). El motor KATE–CBR recupera casos mediante el algoritmo
nearest neighbor en el que la medida de similitud y los pesos relativos de los descriptores
pueden personalizarse para ajustarse a las necesidades de cada aplicación especifica. KATE hace
uso combinado de nearest neighbor con un proceso de inducción dinámica, en el que para cada
consulta se generan preguntas que se plantean al usuario, que permiten discriminar entre los
casos de la base de casos. Además KATE-Dataminig extrae conocimiento que está oculto en los
casos, construyendo automáticamente árboles de decisión a partir de los casos. Los árboles se
pueden usar para recuperar casos de manera muy eficiente, analizando los datos para extraer
reglas de decisión o estrategias de resolución de problemas, hasta llegar a las conclusiones o
diagnóstico.
Las herramientas de KATE Suite se usan en áreas muy diversas tales como la aerospacial,
automovilística, biología, defensa legal de clientes, etc. El uso de KATE Suite es especialmente
adecuado en el desarrollo de sistemas inteligentes para soporte de decisiones entre los que se
encuentran sistemas de diagnóstico, soporte técnico, mantenimiento y atención al cliente,
análisis de riesgos, estimación de costes, soporte de ventas y comercio electrónico.
5.2.2 CBR- Works
CBR-Works [58] desarrollado y distribuido por la empresa TecInno GMBH se diseñó como un
entorno de desarrollo completo de aplicaciones CBR, aunque también puede actuar para
desarrollar servidores CBR para varios clientes, ofreciendo soluciones configurables para
intranet, extranet e Internet. Escrito en Smalltalk, funciona bajo entornos de MS-Windows, Mac,
OS/2, UNIX.
CBR-Works es capaz de reutilizar datos disponibles en soporte electrónico (vía ODBC) y facilita
la importación desde los sistemas de bases de datos comunes, Además es compatible con todos
48
Estudio para la implementación de un sistema de razonamiento basado en casos
los sistemas operativos comunes y es fácil de integrar en aplicaciones ya existentes. En relación
a la representación de los casos de CBR-Works, este permite representar casos complejos y, por
tanto, diseñar aplicaciones en dominios estructurados. También ofrece medidas de similitud
predefinidas e incluye editores que permiten definir de manera intuitiva, medidas de similitud
complejas sobre los modelos orientados a objetos de conocimiento general sobre el dominio.
En las consultas y recuperación de casos CBR-Works ofrece varias interfaces, tanto en modo
consola como para clientes que lo usen como servidor. Además cubre todo el ciclo CBR, no solo
proporcionando mecanismos de recuperación (nearest neighbor), sino también la posibilidad de
revisar y aprender casos (experiencias). Respecto a la adaptación, sólo se permite mediante la
definición de reglas de adaptación por parte del diseñador del sistema CBR.
CBR Works resulta adecuado para el desarrollo de distintos tipos de aplicaciones CBR,
principalmente de comercio electrónico, de diagnóstico complejo, data mining, descubrimiento
de problemas, selección de productos, etc. Da sopote principalmente al desarrollo de sistemas de
clasificación y permite bases de casos grandes que gestiona de manera eficiente.
5.2.3 Orenge
Orenge [59] (Open Retrieval engine) es un marco de trabajo (con arquitectura modular) que
ofrece servicios en forma de componentes de software para desarrollar sistemas inteligentes de
búsqueda de información. Orenge representa una solución completa, independiente de la
plataforma, basada en componentes, para una gestión de conocimiento efectiva en e-business y
e-services. Además facilita su integración gracias a interfaces estándares como XML, ASP,
CORBA o JAVA, y conexiones ODBC-DB.
Orenge es muy flexible, adaptable y fácilmente integrable en arquitecturas cliente-servidor
existentes. El uso de Orenge se basa en configurar sus componentes, para resolver la tarea de
recuperación inteligente de información en un dominio determinado, la cual es su único objetivo.
Para ello, la arquitectura de Orenge se centra en knowledgeServer, que gestiona el conocimiento
de la aplicación y permite que los datos y documentos sean recuperados convenientemente e
eficientemente. Esta función de recuperación del conociendo se extiende con componentes que
gestionan perfiles de usuario, conexión con documentos y datos.
Las operaciones que son posibles realizar son tres tipos búsquedas (1) exactas, (2) basadas en
similitud y (3) lógica difusa. Estos datos y documentos son recuperados de manera eficiente e
49
Estudio para la implementación de un sistema de razonamiento basado en casos
inteligentemente. Además se permite formular consultas en distintos formatos (incluyendo
lenguaje natural) que son transformados a datos.
5.2.4 ReMind
ReMind [60] es una herramienta de Cognitive Systems Inc de dominio general para desarrollo de
sistemas CBR. Existen versiones para plataformas Macintosh, MS Windows y UNIX. Está
disponible como un conjuntos de librerías C para ser incluida en otras aplicaciones, y como
entorno completo de desarrollo interactivo de sistemas expertos basados en casos. ReMind ha
sido una herramienta muy influyente en otras herramientas CBR y actualmente todavía es una de
las más utilizadas.
ReMind permite importar casos de algunas bases de datos y no soporta representación
estructurada de casos, ya que aunque permite estructuras complejas, ya que no las utiliza durante
los procesos CBR. Además el proceso de inducción no trabaja correctamente con casos que
tengan muchos valores nulos.
Una de las características importantes de ReMind es que ofrece métodos distintos para la
recuperación de casos, por ejemplo, algoritmos nearest neighbor, inducción que construye
árboles de decisión en dos modos: simple o guiada por conocimiento y recuperación basada en
plantillas (es decir consultas tradicionales a bases de datos). No es posible combinar estos
métodos.
ReMind soporta adaptación usando formulas y permite aprendizaje de casos. Una característica
clave que posee frente a otras herramientas es su capacidad para utilizar conocimiento general
adquirido de expertos, para mejorar los procesos de indexación, recuperación y valoración de la
similitud entre casos y la adaptación. Además, después del proceso de recuperación, es capaz de
explicar por qué los casos han sido recuperados, esta explicación también indica cómo se pueden
adaptar estos casos.
5.2.5 ReCall
ReCall [61]es una herramienta desarrollada por Isoft. Esta ha sido codificada en C++ que ofrece
una combinación de recuperación de casos mediante el algoritmo nearest neighbor e inducción.
Está diseñada como una arquitectura abierta que permite añadir funcionalidad CBR a otras
50
Estudio para la implementación de un sistema de razonamiento basado en casos
aplicaciones. ReCall utiliza representación de casos orientada a objetos aprovechando
taxonomías, herencia, y relaciones entre objetos que permiten la representación del conocimiento
estructurado, casos incompletos, y conocimiento incierto. Además permite intercambio de
información con aplicaciones externas, en particular con bases de datos.
ReCall proporciona mecanismos de indexación jerárquicos que son utilizados para organizar la
base de casos y para recuperar casos de manera eficiente. Incluye distintos métodos para
analizar, organizar y seleccionar índices en una base de casos de manera automática basándose
en técnicas inductivas. Para usuarios avanzados se ofrece la posibilidad de imponer una
estructura en la organización de la base de casos.
El software de ReCall incluye editores gráficos especializados para definir objetos, relaciones
entre ellos, taxonomías y reglas de adaptación. Además su editor de árboles permite que el
usuario interactúe, controle y modifique la estructura de clasificación de casos creada con el
algoritmo inductivo.
Respecto a la recuperación de casos, se utiliza una variante del algoritmo nearest neighbor
mejorando así la similitud que tiene en cuenta tanto las propiedades y valores, como las
diferencias estructurales entre los casos. ReCall soporta un mecanismo de adaptación basado en
votaciones y el uso de reglas de adaptación definidas por el usuario. Además se pueden usar
llamadas externas a funciones (C++) para obtener procesos de adaptación más complejos.
5.2.6 ESTEEM
ESTEEM [62] desarrollado por Esteem Software Inc y que en la actualidad se encuentra en la
versión 1.4, es una herramienta desarrollada mediante el lenguaje Kappa-PC (paquete de
desarrollo de sistemas basados en conocimiento orientados a objetos en Windows). Es una
herramienta permite implementar reglas de adaptación.
ESTEEM soporta aplicaciones que acceden a múltiples bases de casos y una representación
compleja de casos mediante estructuras de casos anidadas (un caso puede ser parte de otro caso),
así mismo permite asociar información multimedia a otros casos. Para la recuperación de los
casos ESTEEM soporta varios métodos estándar de valoración de similitud (usando pesos en los
atributos, generación de vectores de pesos usando ID3). Además los usuarios pueden añadir
funciones de similitud propias.
51
Estudio para la implementación de un sistema de razonamiento basado en casos
ESTEEM combina un amplio rango de técnicas CBR con un entorno fácilmente extensible, estas
propiedades y las ya comentadas la hacen una herramienta adecuada para la enseñanza de CBR y
para explotar el potencial de CBR en una organización. ESTEEM se ha utilizado en el desarrollo
de aplicaciones para atención al cliente y diagnostico entre otras.
5.2.7 ART*Enterprise
La herramienta ART*Enterprise (Automated Reasoning Tool) [63] pertenece actualmente a la
empresa Brightware Inc. Su entorno es muy variado como ordenadores de escritorio y estaciones
de trabajo. Para la recuperación de casos utiliza el algoritmo nearest neighbor. Para la
adaptación de casos utiliza funciones y reglas y alguna técnica basada en conocimiento.
Esta es una herramienta integrada y orientada a objetos para el desarrollo de aplicaciones que
ofrece una gran variedad de paradigmas de representación y programación incluyendo un
lenguaje de programación procedural, objetos con soporte para herencia múltiple, encapsulación
y polimorfismo, reglas y mecanismos CBR. Así mismo, ofrece una amplia gama de alternativas
en estilos de programación.
El software ART*Enterprise incluye un generador de interfaces de usuario y además, facilita la
creación de módulos reutilizables. Facilita el uso de distintas fuentes de datos y el intercambio
de información con la mayoría de los formatos de bases de datos para el desarrollo de
aplicaciones cliente-servidor.
ART*Enterprise es muy manejable ya que los desarrolladores tienen acceso a toda la
funcionalidad del CBR. ART*Enterprise es especialmente adecuada para incluir funcionalidad
CBR en sistemas de información corporativos.
52
Estudio para la implementación de un sistema de razonamiento basado en casos
6. IMPLEMENTACIÓN DE MÓDULO GENÉRICO DE RECUPERACIÓN
En este apartado se describe la implementación de un modulo genérico de recuperación de casos,
realizado para demostrar la utilidad de los sistemas CBR. Para esto en primer lugar se describen
los proyectos sobre los cuales se ha basado la aplicación. Posteriormente se explica el desarrollo
y creación de CBR Extracción Module, se explica su mecánica y su entorno de ventanas, así
como sus características más importantes.
6.1 Descripción de las herramientas de software empleadas
Una de las partes más importantes en todo sistema CBR es la recuperación de los casos más
relevantes. Para ello cada sistema utiliza diferentes técnicas y metodologías con el objetivo de
obtener los casos de la manera más eficaz y rápida posible. Para poder entender en profundidad
este módulo de los sistemas CBR se ha escogido el motor de Selection Engine [53], el cual será
explicado en profundidad en los siguientes apartados.
6.1.1 The Selection Engine Project
A grandes rasgos la descripción de Selection Engine [53] se ha explicado en la Sección 5.1.2.
Ahora, basados en este motor, se realizará en primer lugar un estudio exhaustivo de su
utilización en la implementación de un módulo genérico de recuperación de casos. La
implementación original del motor no está documentada y su utilización es difícil. Además, los
tipos de datos definidos son simples lo que obliga a emplear descripciones simples de casos.
En segundo lugar para ilustrar más fácilmente la estructura de clases y funcionamiento de
Selection Engine se describirá la parte básica del motor teniendo en cuenta su estructura de
clases. Y finalmente se describirá la estructura del gestor general del motor relacionado los
módulos más importantes. Puesto que la documentación de Selection engine no esta realizada se
ha decido documentar el proyecto. La documentación detallada de cada clase se ha introducido
en el código fuente de las mismas. Está ha sido la aportación realizada al motor de Selection
Engine.
53
Estudio para la implementación de un sistema de razonamiento basado en casos
6.1.1.1 Motor de recuperación de Selection Engine
El algoritmo utilizado por Selection Engine en la recuperación de los casos es el llamado knearest neighbor, el cual es uno de los más utilizados por la gran mayoría de productos CBR.
Para poder explicar su funcionamiento se considerará como ejemplo un caso de dos atributos
iniciales, el rendimiento (performance), el cual su valor máximo será de 10 y el mínimo de 1, y
el precio (price) de un producto, con la misma escala de valores que el anterior atributo. El
espacio de casos será representado en forma de gráfico de dos dimensiones (figura 9), puesto que
se dispone de dos atributos. En el gráfico se han introducido cuatro casos más el caso base.
•
Caso A: Precio 4, rendimiento 4
•
Caso B: Precio 7, rendimiento 7
•
Caso C: Precio 10, rendimiento 9
•
Caso D: Precio 1, rendimiento 6
Caso Objetivo (target) : Precio 1, rendimiento 10
10
Target
Performance
C
8
B
6
D
4
A
2
0
0
2
4
6
Price
8
10
Figura 9
Ahora que se ha definido el espacio de casos mas el caso objetivo, se han de calcular el % de
similitud de los casos A, B, C, D con el caso objetivo. Para este fin se hace uso del famoso
teorema de Pitágoras ( a² + b² = c² ), gracias a Pitágoras se puede calcular los lados de un
triangulo. Si se observa el caso objetivo con el caso A se puede apreciar que el único lado que no
se conoce es el lado c, pues a es 6 ( 10-4 ) y b es 3 ( 4-1 ). Aplicando Pitágoras:
a² + b² = c²
6² + 3² = c²
36 + 9 = c²
c² = 45
c = 6.71
De esta forma sencilla se acaba de obtener la distancia entre el caso objetivo y el caso A. De una
forma más rápida se puede omitir pasos en el cálculo. Caso objetivo (10,1) – caso A (4,4) darían
como resultado las siguientes operaciones:
54
Estudio para la implementación de un sistema de razonamiento basado en casos
a²= 10-4 = 6
b²= 1-4 = -3
a² + b² = c²
6² + -3² = c²
36 + 9 = c²
c² = 45
c = 6.71
Aplicando la misma metodología en los casos B, C, D se obtiene que la distancia de B es 6.71, la
de C es 9.06 y por último la distancia de D es 4. Por lo tanto el caso D es quien tiene la distancia
más cercana al caso objetivo. Ahora para saber el % de similitud se ha de observar los rangos
máximos y mínimos de los atributos. Para el rendimiento el rango es de 1-10 y para el precio
también corresponde de 1-10. Aplicando nuevamente el teorema de Pitágoras (10,10) – (1,1)
para los atributos se obtiene:
a²= 10-1 = 9
b²= 10-1 = 9
a² + b² = c²
9² + 9² = c²
81 + 81 = c²
c² = 162
c = 12.73
Ahora obteniendo el resultado de la distancia del caso D dividido por el resultado de los rangos
máximos y mínimos, obtenemos que 4/12.73 es igual a 0.31, ahora 1-0.31 es igual a 0.69, que
multiplicado por 100 es 69. Por lo tanto el caso D tiene un 69 % de similitud con el caso
objetivo. Las similitudes con el caso A es de 47%, B 47 % y finalmente C con 29 %.
El caso anterior era extremadamente sencillo puesto que solo se disponía de dos atributos, a
continuación se explicará otro ejemplo más complicado en el que los casos están compuestos de
4 atributos. Los atributos en este nuevo caso constarán a mas de los dos anteriores (rendimiento
y precio), de otros dos llamados fiabilidad y tamaño, con el mismo rango que los otros atributos,
es decir de 1-10. En el nuevo ejemplo se desea encontrar un caso objetivo que tenga por
características precio 1, rendimiento10, fiabilidad 10 y tamaño 1, es decir (1, 10, 10, 1), y los
casos de que se dispone son:
•
Caso A: Precio 4, rendimiento 4 , fiabilidad 4, tamaño 4, es decir (4, 4, 4, 4)
•
Caso B: Precio 7, rendimiento 7, fiabilidad 2, tamaño 8, es decir (7, 7, 2, 8)
•
Caso C: Precio 10, rendimiento 9, fiabilidad 6, tamaño 10, es decir (10, 9, 6, 10)
•
Caso D: Precio 1, rendimiento 6, fiabilidad 8, tamaño 3, es decir (1, 6, 8, 3)
55
Estudio para la implementación de un sistema de razonamiento basado en casos
Ahora la distancia entre el caso objetivo y el caso A, es de:
(1,10,10,1) - (4,4,4,4) = -3, 6, 6, -3
a² + b² + c² + d² = e²
-3² + 6² + 6² + -3²= e²
9 + 36 + 36 + 9 = e²
e² = 90
e = 9.49
Aplicando nuevamente el teorema de Pitágoras (10, 10, 10, 10) – (1, 1, 1, 1) para los atributos se
obtiene 18. Por lo tanto y aplicando los cálculos se obtiene que el caso A dispone de un 47 % de
similitud con el caso objetivo. Ahora bien, Selection Engine aplica si se desea, una escala de
importancia sobre los atributos. Esta escala ofrece los pesos (importancia) en valores numéricos,
peso=5 (muy alto), peso=4 (alto), peso= 3 (intermedio), peso=2 (bajo), peso=1 (muy bajo). Para
ejemplificar los cambios se supondrá que el usuario ha elegido un peso de 5 para el precio, un
peso de 4 para el rendimiento, 2 para la fiabilidad y para el último atributo, el tamaño un peso de
1, es decir, (5, 4, 2, 1). Los cálculos ahora se realizaran de la siguiente manera:
Caso objetivo = (1,10,10,1) * (5,4,2,1) = (5,40,20,1)
Caso A = (4,4,4,4) * (5,4,2,1) = (20,16,8,4)
(5,40,20,1) - (20,16,8,4) = -15, 24, 12, -3
a² + b² + c² + d² = e²
-15² + 24² + 12² + -²= e²
225 + 576 + 144 + 9 = e²
e² = 954
e = 30.89
Ahora se calcula la distancia de los atributos usando los pesos:
Valor máximo = (10, 10, 10, 10) * (5, 4, 2, 1) = (50, 40, 20, 10)
Valor mínimo = (1, 1, 1, 1) * (5, 4, 2, 1) = (5, 4, 2, 1)
(50, 40, 20, 10) - (5, 4, 2, 1) = 45, 36, 18, 9
a² + b²+ c² + d² = e²
45² + 36² + 18² + 9² = e²
2025 + 1296 + 324 + 81 = e²
e² = 3726
e = 61.04
Finalmente se obtiene que la similitud del caso A (1-(30.89/61.04)) es igual a 49%. El algoritmo
k-nearest neighbor encontrará los k casos más similares de una base de casos, la variable k es
especificada por el programador, aun que en otros programas podrá ser definida por el usuario.
Esta es una diferencia esencial entre el algoritmo nearest neighbor, el cual devolverá todos los
casos.
56
Estudio para la implementación de un sistema de razonamiento basado en casos
6.1.1.2 Clases empleadas para definir y extraer casos
La clase principal de Selection Engine es la llamada SimilarityEngine, dicha clase es el motor de
inferencia CBR en el cual se calcula la similitud de una colección de casos respecto a un objetivo
concreto, es decir, según las preferencias de búsqueda previamente introducidas, la similitud
variará para obtener el caso más parecido de entre todos los casos. La similitud es calculada en
tanto por ciento, cuanto mayor sea la similitud de un caso mayor será su tanto por ciento.
SimilarityEngine hace uso de una gran cantidad de objetos, tal y como se puede ver en la figura
10
Figura 10. Clases relacionadas para definir un caso
Ítems es el objeto que contiene una colección de objetos Item. El objeto Item, es lo que
comúnmente se llama un caso de la base de casos. La base de casos es el conjunto de casos. Por
lo tanto, el objeto Ítems contiene los casos extraídos de la base de casos. Cada objeto Item posee
una colección de objeto Traits. El objeto Traits contiene a su vez una colección de objetos Trait.
Un objeto Trait es un atributo con su correspondiente valor, por ejemplo, si se dispone de una
base de casos de ordenadores donde cada caso se compone de los atributos propios de un
ordenador. Un Trait correspondería por ejemplo al atributo RAM y su valor 128. El objeto Traits
es el que contendría la colección de atributo/valor de los ordenadores para un caso.
En Selection Engine un Item es genérico y representa cualquier cosa, producto, canción,
decisión, ordenador, etc. Siguiendo con el ejemplo expuesto un objeto Item sería un caso
ordenador con sus atributos/valores. Ítems, correspondería a los casos extraídos de la base de
casos de todos los ordenadores.
57
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 11. Correspondencia de atributo/tipo de dato.
Como se puede ver en la figura 11, el objeto Item hace uso de un objeto llamado
TraitDescriptors el cual juega el papel de meta-dato, este contiene a su vez una colección de
objetos TraitDescriptor. Un objeto TraitDescriptor contiene pares atributo/tipo de dato, donde el
atributo es el nombre del atributo y el valor_tipo es el tipo de dato de dicho atributo. Siguiendo
con el ejemplo de los ordenadores, un traitDescriptor contendría el atributo RAM y el valor
Integer. El objeto TraitDescriptors es el que contendría la colección atributo/valor de los
ordenadores. A simple vista los objetos TraitDescriptor y Trait pueden parecer muy parecidos,
pero como se ha explicado y como su mismo nombre indica en uno se guarda el nombre y su
tipo de dato, mientras que en el otro se guarda el nombre y su valor.
Los objetos descritos hasta ahora (Items, Item, Traits, Trait, TraitDescriptors, y TraitDescriptor)
que existen en Selection Engine ayudan al tratamiento genérico de extracción de cualquier
información.
Similarity Engine hace uso de dos objetos para el cálculo de similitudes con la base de casos,
estos objetos son llamados SimilarityCriteria y SimilariWeights, tal y como se puede ver en la
Figura 12. El primero de ellos contiene una colección de objetos SimilarityCriterion. Un objeto
SimilarityCriterion describe una relación simple entre un atributo, un operador y un valor.
Selection Engine reconoce tres tipos de operadores especiales a parte de los relacionales (=, !=,
>, <, >=,<=). El operador ‘~’ para aquellos c atributos numéricos en las que se desea estén
alrededor de un valor. El operador ‘%’, para aquellos atributos en las que se desea preferencia
respecto al valor. Y finalmente el operador ‘!%’ que significa exclusión, es decir el no deseo de
dicho valor para el atributo. Además Selección Engine reconoce dos tipos de valores especiales,
[MAX_VAL] y [MIN_VAL] que son utilizados para obtener los valores máximos y mínimos
posibles de valores numéricos.
En el ejemplo de los ordenadores, un objeto SimilarityCriterion por ejemplo sería el compuesto
por el atributo marca, el operador ‘!%’ y el valor “Intel”. Por lo tanto se está dando un criterio de
58
Estudio para la implementación de un sistema de razonamiento basado en casos
búsqueda que especifica que no se desea la marca “Intel”. El conjunto de dichos criterios estaría
contenido en el objeto SimilarityCriteria. El segundo objeto del que hace uso para cálculo de
similitudes, es el llamado SimilarityWeights. Este objeto contiene una colección de objetos
SimilarityWeigh, este objeto contiene pares atributo/valor, donde el atributo es el nombre del
atributo y el valor es el peso que tiene dicho atributos. El peso puede ser cualquier entero, pero
es suficiente introduciendo un valor de 1 a 5.
Figura 12.Clases relacionadas para el cálculo de similitudes
Hasta ahora se ha descrito todo lo que utiliza la clase principal de Selection Engine, pero para
que dicha clase calcule las similitudes entre los casos de una base de casos, previamente se han
de cargar los casos. La base de casos puede estar contenida en ficheros de texto o en una base de
datos (p.ej. Oracle, mySQL, etc.). El método más sencillo, y empleado originalmente por el
autor, es emplear ficheros de texto. En el siguiente ejemplo se empleará el fichero “Data.txt”
(Figura 13). Los criterios de búsqueda pueden definirse estáticamente mediante ficheros de texto
o dinámicamente mediante interficies de usuario. El Ejemplo que emplea Selection Engine es el
más sencillo, mediante el fichero de texto “Query.txt”.
Un caso se representa por un conjunto de atributos relacionados entre sí con sus
correspondientes valores. Al crear una base de casos de ordenadores por ejemplo, el formato del
archivo “Data.txt” podría ser el siguiente:
59
Estudio para la implementación de un sistema de razonamiento basado en casos
f=s:marca
d=Lotus
d=Casio
d=Casio
d=Swatch
d= Gucci
d= Gucci
|s:modelo|i:coste|
|rp-320
|500
|f-91w
|6
|f-245g
|100
|qwe-56
|50
| ee -123 |600
| et -54 |1000
b:sumergible
|
y
|
n
|
y
|
n
|
y
|
y
Figura 13: Data.txt
El carácter ‘f’ es indicativo de que en esa línea se definirán las características del caso. Los tipos
de datos anteceden al nombre del atributo, por ejemplo, “s:marca” define que el atributo marca
es de tipo string. Lo mismo sucede para definir integer (“i”), boleano (“b”) y float (“f”). El
carácter ‘d’ es indicativo de que esa línea representa los valores de los atributos de un caso. Una
vez cargado el fichero, cada característica/valor corresponderá a un objeto Trait, el conjunto de
características/valor estará contenido en el objeto Traits y un Objeto Item contendrá un objeto
Traits. De igual forma, también se han creado objetos traitDescriptor, que contienen
característica/valor_tipo. El conjunto de objetos traitDescriptor estará contenido en el objeto
TraitDescriptors.
El segundo de los archivos, “Query.txt” (figura 14) corresponderá a los criterios de búsqueda
definidos. Según los criterios de búsqueda el tanto por ciento de similitud aumentará o
disminuirá. El formato del archivo podría el siguiente:
c
c
w
c
c
w
|
|
|
|
|
|
marca
marca
marca
coste
coste
coste
|
|
|
|
|
|
!% | Casio
!= | Gucci
2
<= | 50
~
| 30
4
Figura 14 : Quero.txt
El carácter ‘c’ o ‘w’ indica si se trata de un criterio de similitud o un peso. Una vez cargado el
archivo, cada criterio de similitud corresponderá a un objeto SimilarityCriterion, la colección de
todas las similitudes estarán guardadas en el objeto SimilarityCriteria. Por el contrario la
colección de pesos residirá en el objeto SimilariWeights.
60
Estudio para la implementación de un sistema de razonamiento basado en casos
6.1.1.3 Gestor general de clases
A continuación se explicará en funcionamiento del gestor general de los módulos de Selection
Engine y su interrelación con las diferentes clases para su correcto funcionamiento. Como se
puede ver en la Figura 15 la clase que gestiona todo el sistema Selection Engine es la llamada
MachingItemsManager. Esta clase hace uso del objeto ItemManager, el cual es el encargado de
leer el fichero Data.txt y así obtener los traitDescrptors y los Ítems.
Figura 15. Gestor de clases
MachingItemsManager utiliza el objeto QueryManager para la creación de filtros y similitudes.
Este crea a su vez un objeto QueryReader, el cual es el encargado directo de la creación de los
objetos FilterCriteria, SimilarityWeights y SimilarityCriteria. QueryReader leerá el fichero
Query.txt y clasificará su información según los operadores que lea, si lee los operadores
especiales "~", "%" y "!%" su información será clasificada en el objeto SimilarityCriteria. En
cambio los operadores relacionales (=, !=, >, <, >=,<=) son clasificados en el objeto
61
Estudio para la implementación de un sistema de razonamiento basado en casos
FilterCriteria. Y Por último aquellas características con peso serán clasificadas en
SimilarityWeights. Estos tres Objetos como se ha dicho anteriormente serán utilizados por el
motor para dar como solución los porcentajes de similitudes con el caso buscado.
El objeto FilterEngine es el encargado de filtrar aquellos casos que violen los criterios de
búsqueda definidos en el objeto FilterCriteria. Para ello se comprueba cada Item contenido en el
objeto Ítems y se devuelve una colección filtrada Ítems a la clase MachingItemsManager. Esta
nueva colección filtrada será utilizada por el motor, es decir por la clase SimilarityEngine.
Figura 16. Relaciones en el filtrado de casos
En la llamada al método principal de la clase SimilarityEngine, ComputesSimilarity(), se utilizan
los objetos Ítems (casos filtrados), SimilarityCriteria y SimilarityWeights, tal y como se puede
ver en la Figura 16. En dicho método es creado el objeto DataSetStatistics, el cual a su vez
contiene una colección de objetos TraitStatistics (Figura 17), Un objeto TraitStatistics guarda los
valores mínimos y máximos de las características de los Ítems. Para las características que no
sean ni enteras ni reales se introduce un valor máximo de 1 y mínimo de 0, en cambio para las
enteras y reales los valores máximos y mínimos corresponderán a los valores más elevados y
bajos de las características de entre todos los Ítems.
62
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 17. Clases involucradas en el filtrado de casos
En la llamada al método ComputesSimilarity() se construye también un objeto llamado
SimilarityCriterionScores, al cual es el encargado de guardar una colección de de objetos
SimilarityCriterionScore. En este último Objeto se guarda el valor normalizado, es decir, de cada
atributo se normaliza su valor para que disponga de un rango comprendido entre 0 y 1, donde 1
significaría que es el máximo valor en la colección y 0 significaría el mínimo. (Figura 17). Esta
es la arquitectura de clases que hace uso Selection Engine para gestionar y ofrecer a un usuario
los casos más similares de una base de casos.
6.1.2 Ozone DataBase
La base de datos utilizada en CBR Extracción Module para leer y almacenar los casos ha sido
Ozone [64]. Ozone es una base de datos orientada a Java y distribuida bajo licencia de código
abierto. El proyecto Ozone permite a los desarrolladores construir estructuras orientadas a
objetos para su integración en la base de datos. Ozone incluye un completo soporte para el
código XML (W3C-compliant), de esta manera un programador puede utilizar cualquier
herramienta XML para poder acceder a los datos almacenados.
Ozone esta basado en una arquitectura de activación general. Los objetos nunca se pierden del
servidor por ninguna razón, pues las aplicaciones cliente controlan sus objetos en la base de
datos mediante objetos Proxy. Ozone es más rentable en donde los datos son frecuentemente
modificados por los clientes. Ozone también dispone de soporte incluido para clases para
Apache Xerces-J y para Xalan-J. Existe la versión 1.2 de Ozone pero aun es una versión
experimental. La versión 1.1 incluye
•
Multi Usuario y soporte multi-thread
•
Acceso rápido a Objetos
•
Soporte JTA/XA
•
Reconociendo de deadlock
•
Soporte BLOB (para escribir datos de objeto binario grande)
63
Estudio para la implementación de un sistema de razonamiento basado en casos
•
Soporte XML (DOM)
•
Soporte ODMG 3.0
•
Reutilización de memoria no usada
Ozone guarda el administrador que accede a la base de datos, esta asociación la realiza
directamente desde el ordenador en que la base de datos es creada, y al cerrarla guarda el usuario
administrador para que nadie más pueda abrirla. Pero mediante configuración es posible declarar
que otros usuarios tengan acceso a ella. Para ello el usuario administrador debe ejecutarla
previamente y dar de alta a aquellos usuarios que el desee dispongan de acceso para manejar los
objetos creados en la base de datos.
La arquitectura de Ozone se puede ver a grades rasgos en la Figura 18, en la cual se puede
apreciar 4 capas :
Figura 18. Las cuatro capas de ozone
Client: Esta es el área de aplicación del cliente, el cliente obtiene una conexión al Servidor de
ozone, la conexión puede estar compartida por muchos threads. La aplicación del cliente
interactúa con la base de Datos API para crearla, borrarla y modificar objetos persistentes.
Network: La capa Network es donde el protocolo de ozone juega un papel similar a RMI
(Invocación Remota de Métodos), es decir, el sistema RMI de Java permite a un objeto que se
está ejecutando en una Máquina Virtual Java (VM) llamar a métodos de otro objeto que está en
otra VM diferente.
64
Estudio para la implementación de un sistema de razonamiento basado en casos
Server: El servidor gestiona las conexiones de clientes, la seguridad, transacciones y llegada de
invocaciones de métodos de clientes. El servidor mantiene una buena transaccionalidad para
múltiples clientes que deseen tener acceso.
Storage: la base de datos es siempre accesible en Ozone Server
Crear y/o abrir la base de datos se realizará mediante comandos de MS-DOS.
6.2 Desarrollo de la aplicación
En este último punto del proyecto se describirá el uso de la aplicación desarrollada en JAVA.
CBR Extraction Module, es un entorno gráfico genérico para la creación de un sistema de
razonamiento basado en casos, así como su propia utilización para la búsqueda de los casos más
similares. Gracias a las restricciones y preferencias que los usuarios deseen aplicar, el programa
utilizará el motor de Selection Engine para el filtrado de criterios. El sistema es totalmente
genérico, la única diferencia residirá en la base de casos. En la cual se almacenaran los casos del
entorno deseado por el usuario. Por lo tanto, el entorno dependerá de las necesidades del usuario
y una vez creado el entorno con los atributos necesarios para definirlo, se podrán introducir los
casos basados en experiencias. Dichos casos no solo podrían acaparar entornos tan importantes
como la predicción de tiempo, o la predicción médica de las enfermedades o dolencias de un
paciente, sino también es posible darle un enfoque para ayudar al cliente a la elección del
producto a su gusto. Es decir, ayudar en la compra-venta de ordenadores, juegos, móviles, e
incluso productos de alimentación u otros entornos en los que sea posible aplicar la mecánica de
un sistema basado en el razonamiento.
6.2.1 Creación de la Base de Casos
En el proyecto se ha decidido crear un entorno de fácil comprensión, en el cual un usuario pueda
crear y abrir una base de datos más cómodamente (Figura 19). La base de datos en Ozone puede
ser remota o local. Se ha decidido su conexión de forma local por la flexibilidad en la utilización
de recursos y para evitar problemas de conexión inesperados al servidor. El método de
recuperación de objetos en Ozone reconoce objetos definidos bajo una sola referencia, los
guarda y los recupera. En la implementación realizada en este proyecto este método ha sido
sobrecargado para recuperar colecciones de objetos, lo cual agiliza la recuperación.
Concretamente en la implementación del módulo de extracción se ha decidido introducir todos
los casos en una estructura ArrayList, y dicha estructura guardarla en Ozone bajo la referencia de
65
Estudio para la implementación de un sistema de razonamiento basado en casos
“Collection”, de igual modo también existe una estructura ArrayList que guarda todas las
definiciones de atributos. Esta estructura residirá en Ozone con la referencia de
“MetaCollection”
Figura 19: Ventana para crear y Abrir una base de Datos
Al crear la base de datos, el usuario podrá elegir su ubicación dentro del disco duro. Una vez se
le de un nombre y se guarde, la base de datos se lanzará automáticamente y se quedará en modo
espera. Si por el contrario, se desea abrir una base de datos, el usuario tendrá que abrir un
fichero.bat llamado de la misma manera que cuado creo la base de datos. De igual forma la base
de datos será lanzada y se quedará en modo espera.
6.2.2 El entorno de CBR Extraction Module
La aplicación CBR Extraction Module es el entorno con el que el usuario realizará la conexión a
la base de casos de Ozone. Un entorno sencillo para que el usuario pueda gestionar la base de
casos fácilmente y cómodamente.
66
Estudio para la implementación de un sistema de razonamiento basado en casos
6.2.2.1 Conexión a la Base de Casos
Gracias a la aplicación CBR (Figura 20) conectaremos con la base de casos Ozone. Si en ella
residen casos, estos se cargaran automáticamente, visualizándose una barra de progresión y el
número de casos insertados en la aplicación. Si por el contrario la base de datos se encuentra
vacía será preciso definir los metacasos (definir atributo y tipo) que el usuario considere
pertinentes para definir el entorno en el que desea aplicar un sistema de razonamiento basado en
casos. El usuario no podrá realizar ninguna otra operación hasta que no haya definido los
metacasos del entorno. Una vez definidos el programa ofrecerá la oportunidad de insertar, editar,
borrar y visualizar los casos.
Figura 20 : Entorno CBR Extraction Module
Para definir metacasos la aplicación dispone en el menú “edit” de una opción llamada “Metadata
case”, está opción definirá los atributos que se han de hallar en el entorno deseado. Se podrán
crear tantos atributos como el usuario desee, el tipo de atributo (String, Integer, Float y Boolean)
y un campo especial para indicar verdadero o falso. Este campo indica si el usuario desea que
dicho atributo sea visible a la hora de aplicar criterios de búsqueda. El campo visible es de suma
importancia pues no todos los atributos de un caso han de ser utilizados para realizar una
67
Estudio para la implementación de un sistema de razonamiento basado en casos
búsqueda, ya que existen atributos que interesaran que sean solución del caso, y otros que aun
considerando que no deben ser visibles son importantes en la definición de los casos.
Si existen datos, como se ha dicho anteriormente, se cargaran automáticamente en la aplicación.
La estructura de los metacasos (MetaCollection) será recuperada y la colección de metacasos
(colección de atributos y su tipo) en forma de estructura ArrayList se le será devuelta al
programa principal. De igual forma se efectuará el tratamiento para la colección de casos
(Collection). Para su mejor tratamiento en opciones de edición, borrado e inserción que más
adelante serán explicadas se decidió crear una tabla de hash para el rápido acceso a los datos.
Dicha estructura es creada y generada con todos los casos mientras se visualiza la barra de
progresión anteriormente mencionada en el primer párrafo de este punto.
6.2.2.2 Definición de atributos
Como se muestra en la Figura 21, a la hora de definir atributos del entorno existe un atributo
inicial inamovible que todo caso tendrá insertado. Dicho atributo es una referencia, necesaria
para las operaciones de búsqueda, edición y borrado de un caso en la base de datos. El tipo de
dato es String y por supuesto no es visible a la hora de realizar búsquedas de similitudes, ya que
es un identificador único para cada caso nuevo insertado en el CBR. (Figura 21).
Figura 21. Definición de Metacasos
68
Estudio para la implementación de un sistema de razonamiento basado en casos
Para ilustrar el funcionamiento de la aplicación a lo largo del documento se empleará el ejemplo
de una base de casos de DVD’s. Para ello se podría emplear los siguientes atributos (Figura 22):
•
Name Dvd: Titulo de la película
•
Composer: El Compositor de la banda sonora
•
Director : Director de la película
•
Year: Año de Salida de la película
•
Price: precio del Dvd
•
Especial edition: Dvd Edición especial remasterizada y extras
Figura 22. Ventana metacasos con atributos definidos
Cada vez que se desee añadir un atributo se ha de presionar el botón “Add Attribute”, si por el
contrario se desea eliminar algún atributo tan solo se ha de marcar el numero correspondiente en
la casilla y presionar el botón “Delete Attribute”.
6.2.2.3 Manipulación de casos
El principal activo de todo sistema CBR es la base de casos para ello una vez el usuario haya
introducido todos los atributos deseados (metadata), la aplicación ofrecerá la opción de añadir
casos en la base de datos. Para este fin se dispone de la opción de menú “Insert Case”, la cual
69
Estudio para la implementación de un sistema de razonamiento basado en casos
sabiendo los atributos deseados tan solo pedirá que sean rellenados los campos (Figura 23). Cada
vez que se utilice esta opción se estará dotando al sistema de un caso. Cuantos más casos
basados en experiencia se introduzcan mejores búsquedas realizará el sistema dando el caso mas
parecido de entre sus criterios de búsqueda. Como se puede apreciar en la Figura 23 al lado de
cada atributo existe un campo vacío para introducir el valor del atributo, y en la tercera columna
se indica el valor esperado. Si el usuario se equivoca al introducir un parámetro se le avisará
inmediatamente del error cometido. Una vez salvado el caso este será indexado de forma
secuencial en la estructura ArrayList de casos, insertado también en la tabla de hash para su
rápido acceso. Y finalmente insertada en la base de casos de Ozone.
Figura 23. Ventana insertar nuevo caso
Para mantener los casos correctos en una aplicación CBR se ha añadido el poder editarlos y
borrarlos en el momento que el usuario desee. Si se desea editar o borrar un caso de la base de
casos aparecerá en la aplicación una ventana como la siguiente (Figura 24):
Figura 24. Solicitud de referencia del caso edición/borrado
70
Estudio para la implementación de un sistema de razonamiento basado en casos
Si la referencia introducida existe mostrará el caso al que pertenece, mostrará todos sus atributos
y valores que contiene el caso ya sean visibles o no visibles. Esto se realiza de esta manera para
que el usuario pueda ver todos los atributos y sus valores antes de decidir si esta seguro de
querer eliminar el caso. Si el usuario ha decidido borrar un caso de la base de datos le aparecerá
en pantalla la siguiente captura (Figura 25).
Figura 25. Borrar un caso de la base de casos
Si se desea borrar el caso en cuestión, se pedirá confirmación para comprobar que realmente el
usuario este seguro de quererlo eliminar. De igual forma se procederá si el usuario desea editar
un caso, la única diferencia es que al borrar un caso sus atributos no se pueden modificar, solo es
posible ver la información del caso. Por el contrario si se desea editar un caso todos los atributos
podrán ser modificados a excepción de la referencia, la cual será inmutable desde la creación del
caso hasta su eliminación.
Cada vez que el caso sea editado será indexado en la estructura ArrayList de casos, en el mismo
lugar que ocupaba antes de la edición. Insertado en el mismo lugar en la tabla de hash para su
rápido acceso. Y finalmente insertado en el mismo lugar de la base de casos de Ozone. La
eliminación del caso borrara el caso en los mismos lugares antes mencionados.
71
Estudio para la implementación de un sistema de razonamiento basado en casos
6.2.2.4 Visualización de casos
El usuario dispone de una opción en la cual puede visualizar todos los casos existentes en la base
de casos. La visualización mostrará todos los campos existentes en un caso, hayan sido
declarados visibles o no visibles. Esta opción, “show all cases” permite la visualización del
código de referencia de los casos. De esta y otras formas que más adelante se comentaran, un
usuario podría saber la referencia de un caso (Figura 26).
Figura 26. Visualización de todos los casos de la base de casos con todos sus atributos
6.2.2.5 Definición del caso base
Hasta aquí se ha explicado todo lo referente a la gestión de casos en un CBR, es decir su
inserción, borrado y edición de casos. Estas operaciones son necesarias para mantener una buena
base de casos correcta. Pero la importancia más grande de un CBR es su motor de similitudes
que opera sobre los casos.
En este subapartado se explicará la conexión realizada con Selection Engine y se darán cuatro
ejemplos de cómo definir casos base. En el primero, se dará un caso base muy sencillo en el que
solo se aplicará un criterio de búsqueda. En el segundo Se especificará un caso más complicado
utilizando bastantes criterios. En el tercero se aplicará otras selecciones importantes. Y
finalmente se mostrará un caso con búsquedas de exclusión.
Como el entorno pensado para la base de datos ha sido la compra-venta de DVD’s. Un usuario
podrá adquirir aquellos DVD’s que según sus criterios de búsqueda han dado como resultado los
72
Estudio para la implementación de un sistema de razonamiento basado en casos
tantos por ciertos más elevados. En la figura anterior (Figura 26) se puede ver una lista de 1000
casos insertados de DVD’s para testear el buen funcionamiento de la aplicación. Ahora que la
aplicación dispone de una buena base de casos, se mostrará la ventana para la selección de los
criterios, es decir lo que comúnmente se llama caso base deseado. Para ello la aplicación dispone
opción “New Search Similarity”. Una vez se ha elegido esta opción el programa realiza la
conversión de los datos a las estructuras necesarias requeridas por Selección Engine a la hora de
buscar las similitudes. Para este fin, se han modificado las clases para que en vez de cargar datos
desde un fichero de texto como originalmente realizaba, se carguen datos desde las estructuras
ArrayList de casos (collection) y de metacasos (Metacollection) definidas en la aplicación.
Estas estructuras serán enviadas a la clase ItemManager, previamente modificada para que lea
las estructuras y genere una colección de Ítems, estructura que reconoce Selection Engine. Para
este fin de han modificado las clases Items, Item, Trait, Traits, Traitdescriptors y
Traitdescriptor. Una vez generadas las estructuras, el sistema ofrece de forma visual todos los
atributos visibles y sus valores con opciones de búsqueda, es decir, la elección de caso base
(Figura 27).
Como se puede observar en la Figura 27 se muestran 7 grupos en la aplicación:
GRUPO “ATTRIBUTE”: Es el grupo que donde estarán los atributos que el usuario ha
utilizado para definir el entorno en el cual desea aplicar el CBR. Aquellos atributos en los cuales
el usuario definió su visibilidad a “false” no serán visibles en esta ventana ya que consideró que
el atributo no debía ser utilizado a la hora de realizar búsquedas.
GRUPO “PREFER”: Es el grupo en el que se encuentra un checkBox. El usuario podrá elegir
sobre el atributo en cuestión, si desea realizar una búsqueda por preferencia o no. Si el checkbox
está activado se aplicaran los grupos “prefer value” y “importance” para encontrar las similitudes
con los casos y el nivel de importancia.
GRUPO “PREFER VALUE”: Es el grupo formado por todas las variaciones de casos
introducidos referentes al Atributo en cuestión. Se presenta en forma de combobox ordenado y
sin repetición de valores. Los combobox que se pueden encontrarse en este grupo dependen del
tipo de atributo definido, así pues existirán combobox para datos string, para datos de tipo
integer, para datos float y para datos Boolean, aunque en este último solo existirán 2 valores,
true o false
GRUPO “IMPORTANCE”: Es el grupo en el que se puede elegir la importancia que se desea
al valor seleccionado del grupo “prefer value”. Existen 5 niveles de importancia comprendidos
desde el 1 al 5, donde el grado 1 indica la menor importancia posible y el grado 5 la mayor.
73
Estudio para la implementación de un sistema de razonamiento basado en casos
GRUPO “REQUIRE”: Es el grupo en el que se encuentra un checkBox. El usuario podrá cosas
muy concretas, valores concretos y rangos que desea. Todo lo que no cumpla estos valores o
rangos serán casos descartados ya de por si. Si el checkbox está activado se aplicaran los grupos
“operator” y “require value”.
GRUPO “OPERATOR”: Es el grupo formado por un combobox en el que se puede elegir las
operaciones que el usuario desea sobre el grupo “require value”. Las operaciones que se pueden
realizar dependerán del tipo de atributo. Para valores de tipo string ( =, /=), para operaciones de
tipo integer y float (=, /=, >, >=, <, <=) y finalmente para operaciones de tipo bolean ( = ). Esta
último tipo de dato solo requiere de la operación igual, ya que tan solo serán dos valores (true,
false).
GRUPO “REQUIRE VALUE”: Es el grupo formado por todas las variaciones de casos
introducidos referentes al Atributo en cuestión. Se presenta en forma de combobox ordenado y
sin repetición de valores. Es decir presenta las mismas características que el grupo “prefer
value”, la diferencia es que el grupo “require value” esta asociado a la activación del checkBox
del grupo “require”.
Figura 27. Especificación de los criterios de búsqueda (el caso base)
74
Estudio para la implementación de un sistema de razonamiento basado en casos
Una vez definido el caso base el usuario dispone del botón “Get Similar Cases” con el cual podrá
encontrar los casos más parecidos con el buscado. Para ello se recuperan los componentes de la
ventana que tienen que ver con los criterios del usuario. Los criterios son obtenidos y
clasificados según son de requerimiento o de similitud. Los criterios de similitud serán
clasificados en las clases similarityCriteria y similarityWeights, mientras que los criterios de
requerimiento estarán contenidos en filterCriteria. Ninguna de estas tres clases y subclases
creadas por ellas han sido modificadas, y los métodos en ellas se utilizan directamente.
Originalmente Selection Engine hacia uso de la clase QueryReader, clase que leía desde un
fichero los criterios de búsqueda. Obviamente esta clase ya no es utilizada.
Para los siguientes ejemplos más complejos en los cuales se marque la casilla “prefer” se dará a
entender que el usuario prefiere el valor del atributo seleccionado respecto a los otros existentes.
En el momento que sea marcada la casilla “require” se dará a entender que el usuario condiciona
de alguna forma el valor del atributo.
Se ha de recordar que:
1.- Al marcar la casilla “prefer” en atributos de tipo Integer o Floats internamente se está
utilizado el operador “~” que significa “alrededor”.
2.- Al marcar la casilla “prefer” en atributos de tipo String o Boolean internamente se está
utilizando el operador “%” que significa “preferencia”.
3.- Al marcar la casilla “require” en atributos de tipo Integer o Float las operaciones serán
de (=, /=, >, >=, <, <=). En atributos de tipo String las operaciones serán de (=, !=),
marcar la operación de != se esta utilizando el operador “!%” que significa “exclusión”.
Para valores boleanos solo existirá el operador “=” ya que tan solo existen dos valores
en los boleanos “true” o “false” y seleccionar a uno, es excluir al otro.
Ejemplo 1
Si tan solo se utiliza el atributo “Director”, y como valor preferido “Steven Spielberg”(Figura
28), al obtener los casos similares mostraría los 30 primeros casos en los que se ha encontrado
dicho valor con un 100 % de similitud (Figura 29). Esto es así puesto que existen una gran
variedad de casos en los que el atributo “Director” corresponde a “Steven Spielberg”. En todos
los demás casos en los que este atributo no correspondiera, no se habría obtenido ningún tanto
por ciento de similitud. Así pues se puede comprobar que el sistema CBR se vuelve más
eficiente cuantos más criterios de búsqueda son utilizados.
75
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 28. Ejemplo 1
Figura 29. 100 % de similitud al aplicar una búsqueda sencilla
76
Estudio para la implementación de un sistema de razonamiento basado en casos
Ejemplo 2
Por el contrario si se aplica correctamente el potencial de búsqueda (Figura30) que ofrece el
disponer de varios atributos a elegir, devolverá los casos más parecidos al gusto del usuario
(Figura 31).
Por ejemplo:
•
Atributo director corresponda a “Steven Spielberg” con una importancia de 5
•
Atributo compositor corresponda a “john williams” con una importancia de 4
•
Atributo categoría sea “acción” con una importancia de 3 y que además se requiera que sea
igual a “acción”.
•
Atributo año de la película este alrededor de 1995 con una importancia de 3 y al mismo
tiempo se requiera que solo muestre aquellas películas que estén por debajo del año 2000.
•
Atributo evaluación corresponda a 7 con una importancia de 4 y al mismo tiempo se
requiera que sea mayor de 5.
•
Atributo precio corresponda a 10.50 € con una importancia de 4 y que al mismo tiempo
requiera que el dvd sea mas barato o igual a 15.00 €
•
Atributo edición especial corresponda a true con una importancia de 4
Figura 30. Ejemplo 2
77
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 31. Resultado de definir más criterios de búsqueda
Como se muestra en la captura anterior, el programa ordenará como primer caso aquel que tiene
la similitud más alta respecto a los otros. Como se puede apreciar, en esta ventana (Figura 31)
solo se muestran los atributos que se definieron visibles.
Ejemplo 3
La especificación de los criterios de búsqueda puede verse en la Figura 32, y sus resultados en la
Figura 33.
•
Atributo director corresponda a “Robert Zemeckis” con una importancia de 4.
•
Atributo compositor corresponda a “Alan Silvestri” con una importancia de 5 y al mismo
tiempo se requiere que el compositor sea igual a “Alan Silvestri”.
•
Atributo categoría sea “Ciencia-ficción” con una importancia de 4.
•
Atributo productora sea “universal pictures” con una importancia de 2
•
Atributo año de la película este alrededor del 2003 con una importancia de 4.
•
Atributo evaluación corresponda a 9 con una importancia de 4.
•
Atributo precio corresponda a 20.10 € con una importancia de 4 y que al mismo tiempo
requiera que el dvd sea mas caro o igual a 15.00 €
•
Atributo edición especial corresponda a true con una importancia de 5 y al mismo tiempo
requiera que sea igual a true.
78
Estudio para la implementación de un sistema de razonamiento basado en casos
•
Atributo dolby corresponda a true con una importancia de 5 y al mismo tiempo requiera que
sea igual a true.
Figura 32: Ejemplo 3
Figura 33: Búsqueda más exhaustiva
79
Estudio para la implementación de un sistema de razonamiento basado en casos
Ejemplo 4
Finalmente el último ejemplo de criterios de búsqueda se puede ver en la Figura 34, y su
resultado en la Figura 35.
•
Atributo director corresponda a “John Woo” con una importancia de 4 y sea excluido el
director “Steven Spielberg”.
•
Atributo compositor corresponda a “Trevor jones” con una importancia de 5 y que sea
excluido el compositor “John Williams”.
•
Atributo categoría sea “fantástico” con una importancia de 4 y que sea excluido “cienciaficción”.
•
Atributo duración 120 minutos con una importancia de 1 y mayor o igual a 100 minutos.
•
Atributo evaluación corresponda a 9 con una importancia de 5 y que sean mayores o igual a
6.
•
Atributo edición especial corresponda a true con una importancia de 3.
•
Atributo dolby corresponda a true con una importancia de 3.
Figura 34: Ejemplo 4
80
Estudio para la implementación de un sistema de razonamiento basado en casos
Figura 35: ejemplo con exclusión
6.2.2.6 Presentación extendida de resultados
Como puede verse en los ejemplos citados anteriormente, los resultados corresponden a los
atributos visibles que de hayan definido (6.2.2.1 Definición de atributos). Pero si el usuario
desea ver todos los atributos de algún resultado, solo ha de realizar doble click encima del
resultado que desee para que aparezca una ventana complementaria de información (figura 36)
Figura 36. Muestra todos los atributos
81
Estudio para la implementación de un sistema de razonamiento basado en casos
Una vez generados los 30 mejores casos correspondientes a los criterios de búsqueda, el sistema
ofrece la oportunidad de salvar los resultados en formato html, para poder consultar los
resultados en el momento que se desee. El usuario ha de elegir el nombre y la ubicación donde
guardará el archivo.html. El formato será tal y como se puede apreciar en la siguiente Figura 37.
Una vez los datos estén en html el usuario podrá imprimirlos desde su propio navegador, e
incluso con las herramientas necesarias poner en Internet la página con los resultados de la
búsqueda para que sea accesible a todo el que quiera verla. Los atributos mostrados serán los
mismos fueron definidos como visibles y el máximo número a mostrar será de 30 casos, los 30
casos si existen con más porcentaje de similitud hallado.
Figura 37. Resultados en formato html
Hasta aquí se ha explicado la utilización y uso de la aplicación, así como sus partes graficas más
relevantes a la hora de hacer funcionar una aplicación CBR. Gracias al aspecto genérico del
entorno, el usuario puede desarrollar sus propios sistemas, crear los datos, insertar casos,
82
Estudio para la implementación de un sistema de razonamiento basado en casos
editarlos y borrarlos de manera sencilla. Así como guardar los casos más similares en formato
html para su posterior revisión.
6.2.2.7 Definición del número máximo de casos Similares
Al presentar los casos más similares respecto a los criterios de búsqueda, sólo son mostrados por
defecto los primeros 30 casos con los porcentajes más elevados obtenidos. Si el usuario lo desea
este número puede ser definido por el en cualquier momento. Para ello dispone de una opción
llamada “view max similar cases” en que se muestra el número actual de casos similares, pero si
es deseo del usuario puede modificarlo en la misma ventana (Figura 38)
Figura 38. Muestra y edita el número máximo de casos similares que se desean mostrar
Una vez finalizada la aplicación y cerrada, al volverla a ejecutar el número por defecto será de
30 casos similares. Así pues si es deseo del usuario otro valor tendrá que volverlo a modificar.
83
Estudio para la implementación de un sistema de razonamiento basado en casos
7. CONCLUSIONES
Este proyecto, me ha ayudado a comprender un concepto totalmente nuevo para mí, los sistemas
CBR me eran totalmente desconocidos hasta que acepte el proyecto de estudio y revisión
biográfica de los sistemas basados en el razonamiento. Ahora comprendo el potencial que son
capaces de manejar y la inmensidad de dominios en los que se podría aplicar su utilización. Pues
las necesidades de información pueden ser definidas modeladas e insertadas como base a futuras
preguntas.
Es la experiencia lo que hace a un hombre madurar, encapsular la experiencia vivida para
obtener la mejor respuesta a un problema es de algún modo hacer que un programa “madure”,
crezca en información, conozca aquellos casos en que fallo, para intentar, para definir de alguna
forma que en un dominio concreto “no se caiga dos veces en la misma piedra”.
Uno de los puntos más importantes para mi ha sido la hibridación de CBR con otros sistemas
inteligentes y como dicha fusión ha mejorado considerablemente la respuesta del sistema. Los
métodos de recuperación y adaptación de los casos han sido para los más interesantes. Pues
gracias a que curse Inteligencia Artificial como asignatura optativa me ha ayudado a comprender
en gran medida los algoritmos utilizados en la recuperación de casos , así como las reglas que se
suelen aplicar a la hora de adaptar los casos. Pero todo y que considero que la idea de aplicar un
sistema basado en reglas para la adaptación de casos es bastante buena, he de decir que
considero que ofrece más fiabilidad que la adaptación se realice mediante un usuario, pues
existen multitud de situaciones no programables que requieren de un trato directo del usuario
con el software.
El proyecto en si ha tenido una gran parte dedicada a la revisión bibliográfica de los apartados
del ciclo CBR y a la fusión de sistemas híbridos con otras áreas. Esta revisión me ha ayudado
mucho a comprender los diferentes dominios de aplicación, pues cada autor ofrecía una idea
novedosa o informativa al tratamiento de los sistemas CBR, y después de realizar la revisión he
podido comprobar que el algoritmo más utilizado en el cálculo de la similitud de casos por casi
todos los autores es el nearest neighbor. Un algoritmo fácil de comprender y que ofrece grandes
resultados en la búsqueda de similitudes. Pero hay que decir que existen dominios en los que se
requiere quizás unos tiempos de respuesta mayores, es por ello que los autores no se estancan en
un solo método y buscan la eficiencia, la eficacia y la rapidez cada vez mayores en un sistema de
razonamiento basado en casos.
He de decir que fue complicada la integración de Selection Engine, puesto que todas las clases
no estaban documentadas, y tuve que hacer su seguimiento paso a paso para comprobar como
84
Estudio para la implementación de un sistema de razonamiento basado en casos
realizaba la gestión de los casos, como definía los atributos y como calculaba las similitudes
entre los casos. Por el contrario me ha gustado mucho trabajar con la base de datos Ozone, que
aunque parezca sencilla de usar, encierra una gran metodología y complejidad de
funcionamiento que creo mejorará con las nuevas versiones que sean implementadas.
En resumen este proyecto me ha proporcionado conocer los Sistemas CBR su uso y aplicación
en los diferentes entornos, así como su gran potencial en el presente y en el futuro. Por último
me gustaría dar las gracias al grupo BANZAI por haberme brindado la oportunidad de haber
realizado este proyecto.
85
Estudio para la implementación de un sistema de razonamiento basado en casos
REFERENCIAS
[1] Schank, R.C. and Abelson, R.P. Scripts,Plans, Goals and Understading. Erlbaum, HillsDale,
New Jersey, 1977.
[2] Schank, R.C. Dynamic Memory: A Theory of Learning in Computers and people. Cambridge
University Press. New York, 1982.
[3] Kolodner, J. L.. Maintaining Organization in a Dynamic Long-Term Memory. Cognitive
Science, 7(iv): pp.243-80. 1983
[4] Kolodner, J. L. . Reconstructive Memory: A Computer Model. Cognitive Science, 7(iv):
pp.281-28. 1983
[5] Kolodner, J.L. Retrieval and Organization Strategies in conceptual Memory. Lawrence.
Erlbaum, Hillsdale, New jersey, 1984.
[6] Simpson, R. L. A Computer Model of Case-Based Reasoning in Problem Solving: An
Investigation in the Domain of Dispute Mediation. Technical Report GIT-ICS-85/18, Georgia
Institute of Technology, School of Information and Computer Science, Atlanta ,US.1985
[7] Bain, W.M. Case-Based Reasoning: A Computer Model of Subjective Assessment. Ph.D.
Thesis, Yale University, Yale, CT, US. 1986
[8] Hammond, K.J. CHEF: A Model of Case-Based Planning. In Proc. American Association for
Artificial Intelligence, AAAI-86, August 1986. Philadelphia, PA, US. 1986.
[9] Sycara, E. P. Resolving adversial conflicts: An approach to Integrating Case-Based and
Analytic Methods. Technical Report GIT-ICS-87/26, Georgia Institute of Technology, School of
Information and Computer Science, Atlanta GA. 1987.
[10] Koton. P. Using experience in learning and problem solving. Massachusetts Institute of
Technology, Laboratory of Computer Science, Ph.D. Thesis MIT/LCS/TR-441. 1989.
[11] Hinrichs, T.R. Problem solving in open worlds. Lawrence Erlbaum Associates. 1992.
86
Estudio para la implementación de un sistema de razonamiento basado en casos
[12] Porter, B.W. & Bareiss, E.R. PROTOS: An experiment in knowledge acquisition for
heuristic classification tasks. In Proceedings of the First International Meeting on Advnces in
Learning (IMAL), Les Arcs, France, pp.159-74. 1986.
[13] Ashley, K. D., and Rissland, E.L. , “ACase-Based Approach to Modelling Expertise”, in
IEEE Expert, Fall, pp 70-77. 1988
[14]. By David Hinkle and Christopher Toomey. Applying Case-Based Reasoning to
Manufacturing AI Magazine 16(1): 65-73 (Spring 1995).
[15]
Ralph Bergmann, Sean Breen, Mehmet Göker, Michel Manago, Jürgen Schumacher,
Armin Stahl, Emmanuelle Tartarin, Stefan Wess, Wolfgang Wilke. The INRECA-II Methodology
for Building and Maintaining CBR Applications. 1998
[16] Smyth, B. and Keane, M.T. “Remembering to forget”. In Proceedings of the 16th
International Conference on Artificial Intelligence. IJCAI-95, 1995.
[17] Watson,I. and Gardigen, D. “ A Distributed Case-Based Reasoning. Application for
engineering Sales Support. In Proceedings of the 16th International Conference on Artificial
Intelligence. IJCAI-99, 1999.
[18] Kolodner, J.L. Case-Based Reasoning. Morgan Kaufmann Publishers. San Mateo,
California. 1993
[19] Aamodt,A.and Plaza, E. “Case-based Reasoning: Foundational Issues, Methodological
variations, and System approaches” Artificial Intelligence communication vol 7 pp 39-59. 1994
[20] Min Soo Suh, Won Chul Jhee, Young Kwan Ko and Albert Lee. A case-based expert
system approach for quality design. Department of industrial enginnering university of Toronto,
and Korea. Pp 1-10. 1998
[21] David B. Leake, Larry Birnbaum, Kristian Hammond, Cameron Marlow and Hao Yang.
Integrating Information Resources: A Case Study of Engineering Design Support. Pp1-3, 6-7.
1999
[22] Katy Börner. Efficient case-base esrtucture generation for design support, Kluwer
academic publishers. Pp 1-5 . 2001.
87
Estudio para la implementación de un sistema de razonamiento basado en casos
[23] Andrés Gómez de Silva Garza y Mary Lou Maher. Design by interactive exploration Using
Memory based techniques. Revista Tal, Vol Y, Num 12. 1998. pp. 200-210.
[24] Stephanie E. August and Lawrence P. McNamee. Integrating Analogical Reasoning in a
Natural Language Understander. Computer Science Department, University of California
Los Angeles, California. Pp 3-8. 1990
[25] Daniel Macaya, Joaquim Meléndez y Joan Colomer. Supervisión basada en casos de
controladores PID. Departament d’Electrònica Informàtica i Automàtica (E.I.A.) – Universitat
de Girona. Pp 1-7. 1997
[26] Andrés Gómez de Silva Garza and Mary Lou Maher Developing Case-Based Reasoning for
Structural Design,. IEEE Expert. Volume 11, Number 3. June 1996
[27] Andrés Gómez de Silva Garza y Mary Lou Maher . The Adaptation of Structural System
Designs Using Genetic Algorithms,. Department of Architectural and Design Science
University of Sydney, Australia. Pp 1-9, 1996
[28] Goldberg, “Genetic algorithms in search, optimization and machine learning”, AddisonWesley publishing company, Inc , 1989.
[29] Pierre-Antoine Champán. A model to represent design episodes for reuse assistance with
interactive case-based reasoning. Cognition & Experience team LISI, Universit Claude Bernard
Lyon1. Pp 1-5. June 2001
[30] David B. Leake, Andrew Kinley, and David Wilson. Case-Based Similarity Assessment:
Estimating Adaptability from Experience. Computer Science DepartmentLindley Hall 215,
Indiana University. Pp 1-6. 1997.
[31] Berger, J.. ROENTGEN: A Case-based Radiation Therapy Planner. Ph.D. Dissertation, The
University of Chicago. Computer Science Department. 1995.
[32] Sycara, K. Using case-based reasoning for plan adaptation and repair. In Kolodner, J., ed.,
Proceedings of the DARPA Case-Based Reasoning Workshop,425-434. San Mateo, CA:
Morgan Kaufmann. 1988.
88
Estudio para la implementación de un sistema de razonamiento basado en casos
[33] Costas Tsatsoulis Case-Based Design And Learning In Telecommunications, Department of
Electrical and Computer Engineering. The University of Kansas. Pp 1-10 1989
[34] W. Ahn and D. L. Medin. A two-stage model of category construction. Cognitive
Science, (16):81-121, 1992
[35] Stefania Montani, Riccardo Bellazzi. Integrating Case Based and Rule Based Reasoning in
a Decision Support. Dipartimento di Informatica e Sistemistica, Università di Pavia pp 1-5. 1999
[36] A.Gómez, R. Pavón, R. Laza, J.M. Corchado. Integrating rule based Systems which Change
along Time in a CBR Environment. Departamento de informática de la Universidad de Vigo y
departamento de informática y automática de la universidad de Salamanca. Pp 1-3. 2002
[37] Golding, A. R. Pronouncing Names by a Combination of Rule-Based and Case-Based
Reasoning. Knowledge Systems Laboratory, October, 1991.
[38] Mérida-Campos, Cortés, Ulises; Roda, Ignasi R, Carlos; Rollón, Emma. "Deliverable 4.1.
Report on current reasoning engine practice and integration strategies", RIMSAT, University
of Girona: 2003.
[39] Stefanie Brüninghaus and Kevin D. Ashley. Reasoning for Predicting the Outcome of Legal
Cases . Learning Research and Development Center and School of Law University of
Pittsburgh. Pp 1-5, 10-15. 2003
[40] L. Karl Branting, John D. Hastings and Jeffrey A. Lockwood. Integrating Cases and
Models for Prediction in Biological Systems. Department of Computer Science, Department of
Plant, Soil, and Insect Sciences of University of Wyoming. Pp1-5, pp 10-15. 1997
[41] Bjarne K. Hansen and Denis Riordan. Weather Prediction Using Case-Based Reasoning
and Fuzzy Set Theory. New Brunswick Weather Centre Meteorological Service of Canada and
Faculty of Computer Science Dalhousie University. Pp1-4. 2000
[42] F. Fdez-Riverola 1, and J. M. Corchado. Employing TSK Fuzzy models to automate the
revision stage of a CBR system. Dept. Informática. University of Vigo, Dept. de Informática y
Automática, University of Salamanca. PP 1-10 2003
89
Estudio para la implementación de un sistema de razonamiento basado en casos
[43] T. Takagi and M. Sugeno. Fuzzy identification of systems and its application to modeling
and control. IEEE Trans. Systems, Man, and Cybernetics, 15:116- 132, 1985.
[44] Stefania Bandini, Sara Manzoni Knowledge Management Applications at Pirelli Tires: the
P-Race and P-Truck projects Dipartimento di Informatica Sistemistica e Comunicazione.
Università di Milano. Pp4 -15. 2000
[45] Taghi M. Khoshgoftaar, Yudong Xiao, and Kehan Gao. Multi-Objective Optimization by
CBR GA-Optimizer for Module-Order Modeling. Florida Atlantic University, Boca Raton,
Florida USA. Pp 1-6 2004
[46] Sushil Louis, Gary MacGraw y Richard O. Wyckoff. CBR Assisted Explanation of GA
Results. Department of Computer Science & Center for Research on Concepts and Cognition
Indiana University. August 1, 1992. Pp
[47] Martin O., Inge H., y Brede N. (1999). Applying CBR and Neural Networks to Noise
Planning. IJCAI ’99. WorkShop ML-5. Automating the Construction of Case Based Reasoners.
Stockholm, Sweden. 1999. Pag. 50-55.
[48] Juan M. Corchado and Brian Lees. A Hybrid case-based model for forecasting. Department
of Languages and Computing Systems University of Vigo, Department of Computing and
Information Systems University of Paisley, pp 1-8, 11- 20. 2002
[49] Ricardo B. Sovat y André C. P. L. F. de Carvalho .Retrieval and adaptation of cases using
an Artificial neural network. Instituto de Ciências Matemáticas e de Computação, Universidade
de São Paulo, São Carlos, SP, Brazil. Pp 1-5. 2001
[50] Belén Díaz-Agudo and Pedro A. González-Calero. CBROnto: A Task/Method Ontology For
CBR. Dep. Sistemas Informáticos y Programación Universidad Complutense de Madrid. Año
2002. pp 1 – 5.
[51] Luigi Ceccaroni, Ulises Cortés and Miquel Sánchez-Marré. OntoWEDSS: augmenting
environmental decision-support systems with ontologies. Fujitsu Laboratories of America and
Departamento de lenguajes i Sistemas Informáticos, Universidad Politécnica de Catalunya. pp 14, 12-13. Octover 2002
90
Estudio para la implementación de un sistema de razonamiento basado en casos
[52] Caspian. University of Wales.
http://www.aber.ac.uk/compsci/Research/mbsg/cbrprojects/getting_caspian.html
[53] Selection Engine. http://selectionengine.sourceforge.net
[54] NCARAI IDA Group. Nacodae. http://home.earthlink.net/~dwaha/software/nacodae/
[55] Indiana University. IUCBRF . http://www.cs.indiana.edu/~sbogaert/CBR/
[56] Artificial Intelligence Applications Institute AIAI. CBR-Shell.
http://www.aiai.ed.ac.uk/project/cbr/CBRDistrib/
[57] Acknosoft. Kate. http://www.acknosoft.com/
[58] TECINNO. CBR-Works http://www.tecinno.com
[59] Empolis. Orenge. http://www.searchtools.com/tools/orenge.html
[60] Cognitive Systems. Remind. http://www.ai-cbr.org/tools/remind.html
[61] ISoft. Recall. http://www.alice-soft.com/html/prod_recall.htm
[62] Esteem Software Inc. ESTEEM. http://www.ai-cbr.org/tools/esteem.html
[63] Brightware. ART* Enterprise. www.brightware.com
[64] The Ozone Proyect. Ozone. http://www.ozone-db.org
91
Estudio para la implementación de un sistema de razonamiento basado en casos
APÉNDICES
92
Estudio para la implementación de un sistema de razonamiento basado en casos
Apéndice A. Resumen de herramientas CBR
Herramientas académicas
Herramienta
Entorno
Dominio
Representación
Recuperación
Adaptación
Interfaz
Simple, se almacena
Nearest Neighbor
Mediante Reglas Línea de comandos
Aplicación
CASPIAN
MS-DOS
General
MAC
en un archivo ASCII
SELECTION
Cualquier computadora que contenga General
Simple, se almacena en Nearest Neighbor
ENGINE
la maquina virtual de Java, PCs
un fichero
No dispone
Entorno gráfico
No dispone
Entorno gráfico
Windows 95/98/NT, Sun Solaris y
Macintosh, plataformas Unix
NaCoDAE
IUCBRF
Cualquier computadora que contenga Tareas
de Estructurada,
K-nearest
la maquina virtual de Java, PCs asistencia naval
representación orientada neighbour
Windows 95/98/NT, Sun Solaris y
a objetos
Macintosh, plataformas Unix
Librería de casos
Cualquier computadora que contenga General
En tres tipos:
la maquina virtual de Java, PCs
1.-Almacenados en una neighbour
Windows 95/98/NT, Sun Solaris y
lista desordenada
Macintosh, plataformas Unix
2.- Archivo
K-nearest
Tres propuestas: No aplicable
1.- No
Adaptation
2.- Weighted
Average
B-tree-bached
3.- D-tree
3.- Weighted
Majority
CBR-Shell
Mozilla 1.2, Linux, Explorer 6.0, General
Simple, se almacena
nearest neighbor y
Medidas de
Windows XP y Mac OS
en un archivo ASCII
k-nearest neighbor
confianza
adaptativas
93
Applet java
Estudio para la implementación de un sistema de razonamiento basado en casos
Herramientas comerciales
Herramienta
Entorno
Dominio
Representación
Recuperación
Adaptación
Interfaz
Aplicación
KATE
Pc Windows, UNIX Sistemas inteligentes de Casos jerarquicos
Nearest neighbor e inducción, No dispone
soporte de decisiones
Intefaz personalizable
tecnicas de data mining, medidas
de similitud y pesos
CBR-Works
MS
Windows, Sistemas
de Modelos de dominio y nearest neighbor e inducción
Usando reglas
MAC, OS/2, UNIX clasificación, comercio casos con representación
electrónico,
mining,
selección
Entorno gráfico sencillo
de
data orientada a objetos
usar.
aplicaciones
de
Genera
CBR
con
interfaz o servidores
productos
Orenge
Independiente de la Sistemas Inteligentes de Flexible
Flexible y extensible.Busquedas Reglas
Plataforma
exactas, basadas en similitud y simples
búsqueda
de
información
ReMind
Pc
Windows, General
MAC, UNIX
muy No aplicable
difusas
Casos planos anidados y nearest neighbor, inducción y Mediante
Interfaz de desarrollo que
jerarquías ordenadas de plantillas (para consultas a bases formulas
se puede personalizar
símbolos
de datos)
94
Estudio para la implementación de un sistema de razonamiento basado en casos
Herramienta
Entorno
Dominio
Representación
Recuperación
Adaptación
Interfaz
Aplicación
ReCall
Pc
Windows, General
UNIX
Estructurada. Casos jerárquicos nearest neighbor e inducción
Reglas definidas por Entorno gráfico de
con relaciones. Representación
expertos y funciones
desarrollo
orientada a objetos. Herencia.
ESTEEM
Pc Windows
General.
Estructurada.
Orientada
Diagnostico
objetos. Casos anidados.
a nearest
neighbor
con Usando
funciones
generación inductiva de pesos. reglas
Atención al cliente.
y GUI Builder basado
en formularios
Se pueden añadir funciones de
similitud propias.
ART*Enterprise
Gran variedad General
Atributo-valor
con
muchos nearest neighbor
Funciones,
reglas
y Incluye
de entornos
tipos predefinidos. Orientada a
técnicas basadas en el constructor
objetos
conocimiento
interfaces
para usuario
95
un
de
gráficas
Estudio para la implementación de un sistema de razonamiento basado en casos
Apéndice B. Application Program Interface
All Classes
Cases
CasesGroup
CasesGroupImpl
CasesImpl
CBRProgram
CBRWindow
DataSetStatistics
ExampleFileFilter
FilterCriteria
FilterCriterion
FilterEngine
GetInfo
Item
ItemManager
Items
MetaInfo
MetaInfoGroup
MetaInfoGroupImpl
MetaInfoImpl
OrdenacionFloat
OrdenacionInteger
OrdenacionNombre
OzoneProgram
OzoneWindow
RepositoryOzone
ResultsWindow
SimilarItems
SimilarityCriteria
SimilarityCriterion
SimilarityCriterionScore
SimilarityCriterionScores
SimilarityDescription
SimilarityEngine
SimilarityWeight
SimilarityWeights
Trait
TraitDescriptor
TraitDescriptors
TraitPanel
Traits
TraitStatistics
TraitValue
WindowCaseDelete
WindowCaseEdit
WindowCaseNew
WindowCasesInfo
WindowCaseView
96
Estudio para la implementación de un sistema de razonamiento basado en casos
WindowMetaDataCase
WindowProgressBarReload
Cases.java
cbr
Interface Cases
All Known Implementing Classes:
CasesImpl, CasesImpl_Proxy
Method Summary
java.util.ArrayList list()
void setList(java.util.ArrayList list)
CasesGroup.java
cbr
Interface CasesGroup
All Known Implementing Classes:
CasesGroupImpl, CasesGroupImpl_Proxy
Method Summary
void addCases(CasesImpl cases)
java.util.ArrayList getCases()
CasesImpl getCases(int key)
void insertCase(int key, CasesImpl cases)
void removeCases(int key)
CasesGroupImpl.java
cbr
Class CasesGroupImpl
cbr.CasesGroupImpl
All Implemented Interfaces:
CasesGroup
97
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
CasesGroupImpl()
CasesGroupImpl
Method Summary
void addCases(CasesImpl cases)
Add cases to ArrayList of Cases
java.util.ArrayList getCases()
Rutun Cases
CasesImpl getCases(int key)
Return a Case of Cases
void insertCase(int key, CasesImpl cases)
Insert Case in list
void removeCases(int key)
Return Cases without case
CasesImpl.java
cbr
Class CasesImpl
cbr.CasesImpl
All Implemented Interfaces:
Cases
Constructor Summary
CasesImpl()
CasesImpl
Method Summary
java.util.ArrayList list()
Return a list of Attributes of case
void setList(java.util.ArrayList list)
Set List
CBRProgram.java
cbr
Class CBRProgram
java.lang.Object
|
+--cbr.CBRProgram
98
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
CBRProgram()
Method Summary
static void main(java.lang.String[] args)
Main of Program
(package run()
private)
Metod
void
run for create Desktop Environment of Aplication
CBRWindow.java
cbr
Class CBRWindow
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--java.awt.Window
|
+--java.awt.Frame
|
+--javax.swing.JFrame
|
+--cbr.CBRWindow
Constructor Summary
CBRWindow()
CBRWindow Inciate Window, build MenuBar, options & images
Method Summary
protected
void addBooleanFilterOperators(javax.swing.JComboBox list)
Add to combobox Bolean values
protected
void addNonNumericFilterOperators
(javax.swing.JComboBox list)
Add to combobox Not Numeric values
protected
void addNumericFilterOperators(javax.swing.JComboBox list)
Add to combobox Numeric values
(package private) cancelButton_actionPerformed()
void
Action button Cancel in Similarity Search
(package private) deleteCase_actionPerformed
void (java.awt.event.ActionEvent e)
Action button delete Case
99
Estudio para la implementación de un sistema de razonamiento basado en casos
(package private) disConnectionOzone_actionPerformed
void (java.awt.event.ActionEvent e)
Action button Disconnect Ozone
(package private) editCase_actionPerformed
void (java.awt.event.ActionEvent e)
Action Button Edit case
(package private) exit_actionPerformed(java.awt.event.ActionEvent e)
void
Action button Exit Program
(package private) exitWindow(java.awt.event.WindowEvent e)
void
Action button Exit Program window
(package private) help_actionPerformed(java.awt.event.ActionEvent e)
void
Action button Help
void iniciateQuery()
Iniciate new search similar attributes
private
void init()
Iniciate Window query with attributes
CaseBase and criterion search
(package private) insertCase_actionPerformed
void (java.awt.event.ActionEvent e)
Action button Insert new Case
java.util.ArrayList ItemsCombobox(int index)
Create list of non repeat values
protected
void loadItems()
Load Items for Similarity motor Cbr Similarity Engine
(package private) maxCasesView_actionPerformed
void (java.awt.event.ActionEvent e)
Action button View max cases and define number max
(package private) metaDataOpCase_actionPerformed
void (java.awt.event.ActionEvent e)
Action Button MetaDAtaCase insert, Show Window Insert
Metadata
void montar_Menubar()
Iniciate MenuBar of Aplication & Submenus
(package private) newfind_actionPerformed(java.awt.event.ActionEvent e)
void
Action button New Find Similarity
(package private) openDb_actionPerformed(java.awt.event.ActionEvent e)
void Action button open CaseBase
java.util.ArrayList Ordenacion(java.util.ArrayList lista,
java.lang.String typeAttribute)
Order alphabetically of Attributes & Order of smaller to bigger
(package private) submitButton_actionPerformed
void (java.awt.event.ActionEvent e)
Action button Similarity Cases, find similar cases
(package private) viewList_actionPerformed
void (java.awt.event.ActionEvent e)
Action button View List of cases, Show Window all cases
100
Estudio para la implementación de un sistema de razonamiento basado en casos
DataSetStatistics.java
net.sourceforge.selectionengine
Class DataSetStatistics
java.lang.Object
|
+--net.sourceforge.selectionengine.DataSetStatistics
Constructor Summary
DataSetStatistics(Items items)
Method Summary
private
void add(TraitStatistics traitStatistics)
add TraitStatistics to hashmap
private
void buildStatistics(Items items)
build Statistics
private
void createCollection(TraitDescriptors descriptors)
Create collection TraitStatistics
TraitStatistics get(java.lang.String traitName)
get traitStatistics
private
void measureItemTraits(Item item)
measureItemTraits
FileFilter.java
cbr
Class ExampleFileFilter
java.lang.Object
|
+--javax.swing.filechooser.FileFilter
|
+--cbr.FileFilter
Constructor Summary
ExampleFileFilter()
Creates a file filter.
ExampleFileFilter(java.lang.String extension)
Creates a file filter that accepts files with the given extension.
ExampleFileFilter(java.lang.String[] filters)
Creates a file filter from the given string array.
ExampleFileFilter(java.lang.String[] filters,
java.lang.String description)
Creates a file filter from the given string array and description.
101
Estudio para la implementación de un sistema de razonamiento basado en casos
ExampleFileFilter(java.lang.String extension,
java.lang.String description)
Creates a file filter that accepts the given file type.
Method Summary
boolean accept(java.io.File f)
Return true if this file should be shown in the directory pane,
false if it shouldn't.
void addExtension(java.lang.String extension)
Adds a filetype "dot" extension to filter against.
java.lang.String getDescription()
Returns the human readable description of this filter.
java.lang.String getExtension(java.io.File f)
Return the extension portion of the file's name .
boolean isExtensionListInDescription()
Returns whether the extension list (.jpg, .gif, etc) should show
up in the human readable description.
void setDescription(java.lang.String description)
Sets the human readable description of this filter.
void setExtensionListInDescription(boolean b)
Determines whether the extension list (.jpg, .gif, etc) should
show up in the human readable description.
FilterCriteria.java
net.sourceforge.selectionengine
Class FilterCriteria
java.lang.Object
|
+--net.sourceforge.selectionengine.FilterCriteria
Constructor Summary
FilterCriteria()
Method Summary
void add(java.lang.String field,
java.lang.String operator, java.lang.String value)
Add collection of filterCriterion
java.lang.Object clone()
This has to return Object because that's how it's defined in
the super class
102
Estudio para la implementación de un sistema de razonamiento basado en casos
java.util.Iterator iterator()
Iterator
private
void setValues(java.util.ArrayList newValues)
Set values
int size()
get int Size
FilterCriterion.java
net.sourceforge.selectionengine
Class FilterCriterion
java.lang.Object
|
+--net.sourceforge.selectionengine.FilterCriterion
Constructor Summary
protected FilterCriterion(java.lang.String fieldName,
java.lang.String operator, java.lang.String value)
Method Summary
java.lang.String getFieldName()
Return String Attribute
int getOperator()
Return integer Operator
java.lang.String getOperatorAsString()
Return String Opertor
TraitValue getValue()
Return Value
boolean itemViolates(Item item)
Return if Item violates criterion
private operatorToString(int operator)
java.lang.String
Return String Opertor
private
int stringToOperator(java.lang.String operator)
Return intOpertor
FilterEngine.java
net.sourceforge.selectionengine
Class FilterEngine
java.lang.Object
|
+--net.sourceforge.selectionengine.FilterEngine
103
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
FilterEngine()
Method Summary
Items filterItems(Items items, FilterCriteria filterCriteria)
Return Items filtered
private violatesCriteria(Item item, FilterCriteria criteria)
boolean
Return if violated criteria user
GetInfo.java
cbr
Class GetInfo
java.lang.Object
|
+--cbr.GetInfo
Constructor Summary
GetInfo(java.lang.String file, cbr.ExternalDatabase db)
GetInfo
Item.java
net.sourceforge.selectionengine
Class Item
java.lang.Object
|
+--net.sourceforge.selectionengine.Item
Constructor Summary
protected Item(TraitDescriptors traitDescriptors)
Method Summary
int getTraitDataType(java.lang.String traitName)
104
Estudio para la implementación de un sistema de razonamiento basado en casos
return datatype of Attribute
TraitValue getTraitValue(java.lang.String traitName)
return Value of Attribute
java.util.Iterator iterator()
Iterator
protected
void loadFromDelimitedCase(TraitDescriptors traitDescriptors,
java.util.ArrayList caseItem)
Assumption: good data is passed in.
ItemManager.java
net.sourceforge.selectionengine
Class ItemManager
java.lang.Object
|
+--net.sourceforge.selectionengine.ItemManager
Constructor Summary
ItemManager(java.util.ArrayList listMeta,
java.util.ArrayList listCases)
Add Cases to collection Items
Method Summary
Items getItems()
getItems
TraitDescriptors getTraitDescriptors()
get TraitDescriptors
Items.java
net.sourceforge.selectionengine
Class Items
java.lang.Object
|
+--net.sourceforge.selectionengine.Items
Constructor Summary
protected Items(TraitDescriptors traitDescriptors)
This is the only constructor and it requires TraitDescriptors Technically,
Items doesn't need to know anything about TraitDescriptors, but a lot of the
people who use Items (actually, Item) do.
Method Summary
protected
void add(Item item)
105
Estudio para la implementación de un sistema de razonamiento basado en casos
void add(TraitDescriptors traitDescriptors,
java.util.ArrayList caseItem)
protected
This method create Item and asociate your traitDescriptors
and arraylist of collection attribute - value.
java.lang.Object clone()
clone Items and return
TraitDescriptors getTraitDescriptors()
return traitDescriptors, Attributes of case
java.util.Iterator iterator()
Iterator for collection
void setValues(java.util.ArrayList newValues)
private
Asociate new collection
int size()
Number of items in the collection
Metainfo.java
cbr
Interface MetaInfo
All Known Implementing Classes:
MetaInfoImpl, MetaInfoImpl_Proxy
Method Summary
boolean included()
java.lang.String name_attribute()
void setIncluded(boolean included)
void setName_attribute(java.lang.String name)
void setTypeName_attribute(java.lang.String name)
java.lang.String typeName_attribute()
MetaInfoGroup.java
cbr
Interface MetaInfoGroup
All Known Implementing Classes:
MetaInfoGroupImpl, MetaInfoGroupImpl_Proxy
106
Estudio para la implementación de un sistema de razonamiento basado en casos
Method Summary
void addMeta(MetaInfoImpl meta)
java.util.ArrayList getMeta()
MetaInfoImpl getMeta(int key)
MetaInfoImpl removeMeta(int key)
MetaInfoGroupImpl.java
cbr
Class MetaInfoGroupImpl
cbr.MetaInfoGroupImpl
All Implemented Interfaces:
MetaInfoGroup
Constructor Summary
MetaInfoGroupImpl()
MetaINfoGroupImpl
Method Summary
void addMeta(MetaInfoImpl meta)
Add metacase at list of MetaCases collection
java.util.ArrayList getMeta()
Add metacase at list of MetaCases collection
MetaInfoImpl getMeta(int key)
Get one metaCase of ArrayList
MetaInfoImpl removeMeta(int key)
Remove metacase of list
MetaInfoImpl.java
cbr
Class MetaInfoImpl
cbr.MetaInfoImpl
All Implemented Interfaces:
MetaInfo
107
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
MetaInfoImpl()
MetaInfoImpl
Method Summary
boolean included()
Return included, if is visible or not
java.lang.String name_attribute()
Return name of attribute MetaCase
void setIncluded(boolean included)
Set included
void setName_attribute(java.lang.String name)
Set name of Attribute
void setTypeName_attribute(java.lang.String name)
Set Type of Attribute
java.lang.String typeName_attribute()
Return name of attribute MetaCase
OrdenacionFloat.java
cbr
Class OrdenacionFloat
java.lang.Object
|
+--cbr.OrdenacionFloat
All Implemented Interfaces:
java.util.Comparator
Constructor Summary
OrdenacionFloat()
Method Summary
int compare(java.lang.Object obj1, java.lang.Object obj2)
Compare two objects type Float
OrdenacionInteger.java
cbr
Class OrdenacionInteger
java.lang.Object
|
108
Estudio para la implementación de un sistema de razonamiento basado en casos
+--cbr.OrdenacionInteger
All Implemented Interfaces:
java.util.Comparator
Constructor Summary
OrdenacionInteger()
Method Summary
int compare(java.lang.Object obj1, java.lang.Object obj2)
Compare two objects type Integer
Ordenacion Nombre.java
cbr
Class OrdenacionNombre
java.lang.Object
|
+--cbr.OrdenacionNombre
All Implemented Interfaces:
java.util.Comparator
Constructor Summary
OrdenacionNombre()
Method Summary
int compare(java.lang.Object obj1, java.lang.Object obj2)
Compare two objects type String
OzoneProgram.java
cbr
Class OzoneProgram
java.lang.Object
|
+--cbr.OzoneProgram
109
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
OzoneProgram()
Method Summary
static void main(java.lang.String[] args)
main
(package run()
private)
Run,
void
Create main Window
OzoneWindow.java
cbr
Class OzoneWindow
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--java.awt.Window
|
+--java.awt.Frame
|
+--javax.swing.JFrame
|
+--cbr.OzoneWindow
Constructor Summary
OzoneWindow()
OzoneWindow
Method Summary
void CmdExec(java.lang.String cmdline)
Execute .bat, Code for execute file.bat
(package connectionOzone_actionPerformed(java.awt.event.ActionEvent e)
private)
Connection Database of Ozone
void
(package exit_actionPerformed(java.awt.event.ActionEvent e)
private)
Exit program
void
(package exitWindow(java.awt.event.WindowEvent e)
private)
Exit window
void
(package help_actionPerformed(java.awt.event.ActionEvent e)
110
Estudio para la implementación de un sistema de razonamiento basado en casos
private)
void
help of Aplication
void montar_Menubar()
Create the menubar of ozone Window
(package newCreateDb_actionPerformed(java.awt.event.ActionEvent e)
private)
Create a new Database of Ozone
void
RepositoryOzone.java
cbr
Class RepositoryOzone
java.lang.Object
|
+--cbr.RepositoryOzone
Constructor Summary
RepositoryOzone()
RepositoryOzone
Method Summary
void close()
Close DataBase
void create()
Create Cases from File.dat
void deleteCase(int index)
delete Case in database Ozone
void EditCase(int index, CasesImpl caseObtain)
Edit Case in database Ozone
java.util.ArrayList getCases(javax.swing.JFrame frame)
Get Cases of DataBase
java.util.ArrayList getMeta(javax.swing.JFrame frame)
Get metacases of database
void open()
open dataBase
void saveCaseObtain(CasesImpl caseObtain)
Save Case obtain in database Ozone
void saveDataBase(javax.swing.JFrame frame,
java.util.ArrayList listMeta)
Save metadata case en data base
111
Estudio para la implementación de un sistema de razonamiento basado en casos
ResultsWindow.java
cbr
Class ResultsWindow
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.ResultsWindow
Constructor Summary
ResultsWindow(javax.swing.JFrame frameOriginal,
java.util.ArrayList listView, SimilarItems similarItems,
TraitDescriptors traitDescriptors, int maxCases, boolean similarity)
ResultsWindow
Method Summary
void infoTable_action(int row)
Window iformation of one case, Show one case with all Attributes and values
int print(java.awt.Graphics g, java.awt.print.PageFormat pf, int pi)
metod aux
void PrintButton_actionPerformed(java.awt.event.ActionEvent evnt)
Print
void SaveButton_actionPerformed(java.awt.event.ActionEvent e)
Save Cases in file.html
SimilarItems.java
net.sourceforge.selectionengine
Class SimilarItems
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarItems
Constructor Summary
SimilarItems()
112
Estudio para la implementación de un sistema de razonamiento basado en casos
Method Summary
protected
void add(SimilarityDescription descriptor)
add collection similar items
SimilarityDescription getBestMatch()
return SimilarityDescription, get bestmatch
SimilarItems getBestMatches(int numberOfMatches)
return SimilarItems bestmatches
SimilarItems getByPercentSimilarity(float percentSimilar)
return SimilarItems ByPercentSimilarity
SimilarItems getByRank(int rank)
return SimilarItems ByRank
SimilarityDescription getByRelativeRank(int rank)
return ByRelativeRank
SimilarItems getByThreshold(float minimumPercentSimilar)
return SimilarItems ByThreshold
boolean isEmpty()
return isEmpty
java.util.Iterator iterator()
return iterator
void rankItems()
put rank Items
int size()
return size collection
SimilarityCriteria.java
net.sourceforge.selectionengine
Class SimilarityCriteria
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityCriteria
Constructor Summary
SimilarityCriteria()
Method Summary
void add(SimilarityCriterion criterion)
add to collection SimilarCriterion
void add(java.lang.String fieldName,
java.lang.String operator, java.lang.String value)
add to collection SimilarCriterion
java.lang.Object clone()
113
Estudio para la implementación de un sistema de razonamiento basado en casos
Clone object
java.util.Iterator iterator()
Return iterator
protected
void setValues(java.util.ArrayList newValues)
Set values new
int size()
Set integer size of array list
SimilarityCriterion.java
net.sourceforge.selectionengine
Class SimilarityCriterion
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityCriterion
Constructor Summary
protected SimilarityCriterion(java.lang.String fieldName,
java.lang.String operator, java.lang.String value)
Method Summary
java.lang.String getFieldName()
Get String Attribute
java.lang.String getID()
Get ID
int getOperator()
Get Operator
java.lang.String getOperatorAsString()
Transform operator As String
TraitValue getValue()
Get trait Value
private operatorToString(int operator)
java.lang.String
Get Special Operator
private
int stringToOperator(java.lang.String operator)
Get Special Operator
SimilarityCriterionScore.java
net.sourceforge.selectionengine
Class SimilarityCriterionScore
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityCriterionScore
114
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
protected SimilarityCriterionScore(java.lang.String criterionID)
Method Summary
java.lang.String getID()
Get ID "[" + fieldName + "|" + getOperatorAsString() + "|" +
value + "]"
float getNormalizedValue()
Get Normalized value
float getWeightedValue()
Get weight
protected
void setID(java.lang.String criterionID)
Set ID
protected
void setNormalizedValue(float value)
Set Normalized value
protected
void setWeightedValue(float value)
Set Weight
SimilarityCriterionScores.java
net.sourceforge.selectionengine
Class SimilarityCriterionScores
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityCriterionScores
Constructor Summary
SimilarityCriterionScores()
Method Summary
void add(SimilarityCriterionScore score)
Add SimilarityCriterionScore at HashMap
SimilarityCriterionScore get(java.lang.String ID)
get SimilarityCriterionScore
java.util.Iterator iterator()
115
Estudio para la implementación de un sistema de razonamiento basado en casos
return Iterator
int size()
return Int
SimilarityDescription.java
net.sourceforge.selectionengine
Class SimilarityDescription
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityDescription
Constructor Summary
SimilarityDescription()
Method Summary
int compareTo(java.lang.Object o)
Implements the compareTo method required by the Comparable
interface We're gonna compare items based on their percent similarity Used by
SimilarItems.rankItems() The stupid argument name (o) is Sun's fault, not
mine Return codes: me > arg = -1 (better % match means we go first) me = arg
= 0 me < arg = +1 (it's a better match, it goes first)
Item getItem()
Retun item
float getPercentSimilarity()
Retun PercentSimilarity
int getRank()
Return Integer rank
protected setItem(Item newItem)
void
Set Item
protected setPercentSimilarity(float newPercentMatch)
void
Set percent Similaruty
protected setRank(int newRank)
void
Set Rank
SimilarityEngine.java
net.sourceforge.selectionengine
Class SimilarityEngine
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityEngine
116
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
SimilarityEngine()
Method Summary
private
float computeDistance(SimilarityCriterionScores
targetValues,
SimilarityCriterionScores itemValues)
Get compute Distance between Target values and Item
values
SimilarItems computeSimilarity(Items items,
SimilarityCriteria criteria,
SimilarityWeights weights)
compute similarity and return the similar items
SimilarItems computeSimilarity(Items items,
SimilarityCriteria criteria,
SimilarityWeights weights,
DataSetStatistics statistics)
compute similarity and return the similar items
private
float getMaxDistance(SimilarityCriteria criteria,
SimilarityWeights weights)
To compute how similar two items are,
we first create a single-dimensional range from 0
to some max distance number.
private getTargetValues
SimilarityCriterionScores (TraitDescriptors traitDescriptors,
SimilarityCriteria criteria,
SimilarityWeights weights,
DataSetStatistics statistics)
Get values of the case target
private normalizeValues(Item item,
SimilarityCriterionScores SimilarityCriteria criteria,
SimilarityWeights weights,
DataSetStatistics statistics)
Nomralized values of item
SimilarityWeight.java
net.sourceforge.selectionengine
Class SimilarityWeight
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityWeight
117
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
SimilarityWeight(java.lang.String fieldName, java.lang.Integer weight)
set Attribute and Weigth
Method Summary
java.lang.String getFieldName()
Return Attribute
java.lang.Integer getWeight()
Return Weight
SimilarityWeights.java
net.sourceforge.selectionengine
Class SimilarityWeights
java.lang.Object
|
+--net.sourceforge.selectionengine.SimilarityWeights
Constructor Summary
SimilarityWeights()
Method Summary
void add(java.lang.String fieldName, int weight)
Add HashMap Weights
java.lang.Object clone()
Clone Object
int get(java.lang.String traitName)
return Integer Value Weight from attribute
java.util.Iterator iterator()
Return iterator
java.util.Iterator mapIterator()
Return Iterator
private
void setValues(java.util.HashMap newValues)
setValues hashmap
int size()
return Size of Weights
118
Estudio para la implementación de un sistema de razonamiento basado en casos
Trait.java
net.sourceforge.selectionengine
Class Trait
java.lang.Object
|
+--net.sourceforge.selectionengine.Trait
Constructor Summary
protected Trait(java.lang.String name, java.lang.String value)
Set Name attribute & value
Method Summary
java.lang.String getName()
Return Name of Attribute
TraitValue getValue()
Return Value of Attribute
protected
void setName(java.lang.String newName)
Set Name attribute
protected
void setValue(java.lang.String newValue)
Set value of attribute
TraitDescriptor.java
net.sourceforge.selectionengine
Class TraitDescriptor
java.lang.Object
|
+--net.sourceforge.selectionengine.TraitDescriptor
Constructor Summary
(package TraitDescriptor(java.lang.String name, java.lang.String type,
private) boolean included)
Construct traitDescriptor
Method Summary
int getDataType()
Return DataType
boolean getIncluded()
Return is visible?
119
Estudio para la implementación de un sistema de razonamiento basado en casos
java.lang.String getName()
Return Name Attribute
int obtainDataType(java.lang.String dataType)
private
Return Numeric value
int stringToDataType(java.lang.String dataType)
private
Return Numeric value
java.lang.String toString()
TraitDescriptors.java
net.sourceforge.selectionengine
Class TraitDescriptors
java.lang.Object
|
+--net.sourceforge.selectionengine.TraitDescriptors
Constructor Summary
TraitDescriptors()
Method Summary
private
void add(int index, TraitDescriptor descriptor)
add traitDescriptor to collection
TraitDescriptor get(int index)
TraitDescriptor get(java.lang.String traitName)
int getDataType(java.lang.String traitName)
boolean isEmpty()
is empty collection?
java.util.Iterator iterator()
protected
void loadTraitDescriptorOfCase(java.util.ArrayList listMeta)
int size()
TraitPanel.java
cbr
Class TraitPanel
java.lang.Object
120
Estudio para la implementación de un sistema de razonamiento basado en casos
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.TraitPanel
Constructor Summary
TraitPanel()
Method Summary
javax.swing.JCheckBox getFilterCheckBox()
Return filterCheckBox
java.lang.String getFilterOperator()
get FilterOperator
javax.swing.JComboBox getFilterOperatorComboBox()
get JcomboBox
java.lang.String getFilterValue()
return String Valuefilter
javax.swing.JComboBox getFilterValueComboBox()
getFilterValueComboBox
java.lang.String getPreferenceValue()
getPreferenceValue
javax.swing.JComboBox getPreferenceValueComboBox()
getPreferenceValueComboBox
javax.swing.JCheckBox getSimilarityCheckBox()
Return JCheckBox of Similarity
int getTraitDataType()
get Datatype of attribute
java.lang.String getTraitName()
Return name Attribute
javax.swing.ButtonGroup getValueButtonGroup()
getValueButtonGroup
int getWeight()
getWeight
javax.swing.ButtonGroup getWeightButtonGroup()
getWeightButtonGroup
boolean hasFilterCriteria()
return hasFilterCriteria
boolean hasSimilarityCriteria()
return hasSimilarityCriteria
121
Estudio para la implementación de un sistema de razonamiento basado en casos
void setFilterCheckBox
(javax.swing.JCheckBox filterCheckBox)
set filterCheckBox asign JCheckBox
void setFilterOperatorComboBox
(javax.swing.JComboBox list)
set FilterOperatorComboBox
void setFilterValueComboBox
(javax.swing.JComboBox list)
getFilterValueComboBox
void setPreferenceValueComboBox
(javax.swing.JComboBox list)
setPreferenceValueComboBox
void setSimilarityCheckBox
(javax.swing.JCheckBox preferCheckBox)
Set Similarity CheckBox
void setTraitDataType(int dataType)
set TraitDataType
void setTraitName(java.lang.String name)
Set traitName os attribute
void setValueButtonGroup
(javax.swing.ButtonGroup group)
setValueButtonGroup
void setWeightButtonGroup
(javax.swing.ButtonGroup group)
setWeightButtonGroup
Traits.java
net.sourceforge.selectionengine
Class Traits
java.lang.Object
|
+--net.sourceforge.selectionengine.Traits
Method Summary
protected
void add(Trait newTrait)
Insert objects Trait in hasMap for rapid accesvkey for insert is
name Attribute
Trait get(java.lang.String traitName)
return object trait
boolean isEmpty()
Return boolean if Traits is Empty
java.util.Iterator iterator()
Return iterator of values Traits
protected
void loadFromDelimitedCase(TraitDescriptors traitDescriptors,
java.util.ArrayList caseItem)
Load data from a string The string will have the data fields in
122
Estudio para la implementación de un sistema de razonamiento basado en casos
the same order as the array of field definitions The string is |
delimited
TraitStatistics.java
net.sourceforge.selectionengine
Class TraitStatistics
java.lang.Object
|
+--net.sourceforge.selectionengine.TraitStatistics
Constructor Summary
TraitStatistics(java.lang.String traitName)
Method Summary
void addExample(float value)
Put minimum value and maximun value
float getMaximumValue()
return Maximun value
float getMinimumValue()
return minimum
float getRange()
return get range (maxvalue - minvalue)
java.lang.String getTraitName()
return name trait
protected
void setMaximumValue(float value)
set max value
protected
void setMinimumValue(float value)
set min value
protected
void setTraitName(java.lang.String name)
set traitname
TraitValue.java
net.sourceforge.selectionengine
Class TraitValue
java.lang.Object
|
+--net.sourceforge.selectionengine.TraitValue
123
Estudio para la implementación de un sistema de razonamiento basado en casos
Constructor Summary
TraitValue(java.lang.String value)
Method Summary
boolean toBoolean()
return Boolean value
float toFloat()
return Float value
int toInteger()
return integer value
java.lang.String toString()
return String value
java.lang.String value()
return String value
WindowCaseDelete.java
cbr
Class WindowCaseDelete
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowCaseDelete
Constructor Summary
WindowCaseDelete(javax.swing.JFrame frameOriginal,
java.util.ArrayList listMeta, java.util.Hashtable casesAcces,
java.util.ArrayList list, java.lang.String code, CasesImpl caseObtain,
RepositoryOzone ozoneRepository)
WindowCaseDelete
Method Summary
void deleteButton_actionPerformed(java.awt.event.ActionEvent e,
RepositoryOzone ozoneRepository, javax.swing.JDialog dialog)
Action boton Delete case, delete case from database
124
Estudio para la implementación de un sistema de razonamiento basado en casos
WindowCaseEdit.java
cbr
Class WindowCaseEdit
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowCaseEdit
Constructor Summary
WindowCaseEdit(javax.swing.JFrame frameOriginal,
java.util.ArrayList listMeta, java.util.Hashtable casesAcces,
java.util.ArrayList listCases, java.lang.String code,
CasesImpl caseObtain, RepositoryOzone ozoneRepository)
WindowCaseEdit
Method Summary
void SaveButton_actionPerformed(java.awt.event.ActionEvent e,
java.util.Vector data, RepositoryOzone ozoneRepository,
javax.swing.JDialog dialog)
Action boton Save case
WindowCaseNew.java
cbr
Class WindowCaseNew
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowCaseNew
Constructor Summary
WindowCaseNew(javax.swing.JFrame frameOriginal,
java.util.ArrayList listMeta, java.util.Hashtable casesAcces,
java.util.ArrayList listCases, RepositoryOzone ozoneRepository)
WindowCaseNew
125
Estudio para la implementación de un sistema de razonamiento basado en casos
Method Summary
void SaveButton_actionPerformed(java.awt.event.ActionEvent e,
java.util.Vector data, RepositoryOzone ozoneRepository,
javax.swing.JDialog dialog)
Action boton Save case
WindowCasesInfo.java
cbr
Class WindowCasesInfo
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowCasesInfo
Constructor Summary
WindowCasesInfo(int rank, SimilarItems similarItems,
TraitDescriptors traitDescriptors)
WindowCasesInfo
WindowCaseView.java
cbr
Class WindowCaseView
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowCaseView
Constructor Summary
WindowCaseView(javax.swing.JFrame frameOriginal,
java.util.ArrayList listMeta, java.util.ArrayList list)
WindowCaseView
126
Estudio para la implementación de un sistema de razonamiento basado en casos
WindowMetaDataCase.java
cbr
Class WindowMetaDataCase
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowMetaDataCase
Constructor Summary
WindowMetaDataCase(javax.swing.JFrame frameOriginal,
java.util.ArrayList listMeta, java.util.ArrayList list,
javax.swing.JMenuItem newFind, javax.swing.JMenuItem viewList,
javax.swing.JMenuItem insertCase, javax.swing.JMenuItem editCase,
javax.swing.JMenuItem deleteCase, javax.swing.JMenuItem metaDataOpCase,
javax.swing.JMenuItem maxCasesView)
WindowMetadataCase, Create window for insert metadata
Method Summary
void addButton_actionPerformed(java.awt.event.ActionEvent e)
Action Buton add Attribute defined
void deleteAttribute_actionPerformed(java.awt.event.ActionEvent e)
Action Buton detele meta Attribute
void okButton_actionPerformed(java.awt.event.ActionEvent e,
java.util.ArrayList listMeta, java.util.ArrayList list,
javax.swing.JDialog dialog)
Action Buton save metadata, list of metadata complete
127
Estudio para la implementación de un sistema de razonamiento basado en casos
WindowProgressBarReload.java
cbr
Class WindowProgressBarReload
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
|
+--cbr.WindowProgressBarReload
Constructor Summary
WindowProgressBarReload(javax.swing.JFrame frameOriginal,
java.util.Hashtable casesAcces, java.util.ArrayList list)
WindowprogressbarReload
128
Estudio para la implementación de un sistema de razonamiento basado en casos
Apéndice C. Código CBR Extraction Module
*******************************************************************************************
Cases.java
*******************************************************************************************
/**
Interface used by ozone casebase for define the methods for Cases objects,
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneRemote;
import java.util.*;
import java.io.*;
public interface Cases extends OzoneRemote {
public ArrayList list();
public void setList( ArrayList list ); /*update*/
}
*******************************************************************************************
CasesGroup.java
*******************************************************************************************
/**
Interface used by ozone casebase for define the methods for CasesGoup objects,
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneRemote;
import java.util.*;
public interface CasesGroup extends OzoneRemote {
public void addCases (CasesImpl cases) throws Exception; /*update*/
public ArrayList getCases();
public CasesImpl getCases( int key );
public void removeCases( int key ); /*update*/
public void insertCase( int key, CasesImpl cases ) ; /*update*/
}
*******************************************************************************************
129
Estudio para la implementación de un sistema de razonamiento basado en casos
CasesGroupImpl.java
*******************************************************************************************
/**
Class implements CasesGroup. This class saves a collection of cases object
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneObject;
import java.util.*;
public class CasesGroupImpl extends OzoneObject implements CasesGroup {
final static long serialVersionUID = 1L;
private ArrayList cases;// = new Hashtable();
private int numCases = 0;
/**CasesGroupImpl
* @param Not param
* @exception Not Exceptions
*/
public CasesGroupImpl() {
//units es la Coleccion de units de la funcion
cases = new ArrayList();
}
/**Add cases to ArrayList of Cases
* @param CasesImpl Cases, Case for add
* @exception Error
*/
public void addCases(CasesImpl cases) throws Exception {
try{
this.cases.add(numCases,cases);
numCases = numCases + 1;
} catch(Exception e){
System.out.println("Error at CasesGroupImpl::addCases() "+e);
}
}
/**Rutun Cases
* @return Return ArrayList of Cases
* @exception Not Exceptions
*/
public ArrayList getCases() {
return this.cases;
}
/**Return a Case of Cases
* @param int Key, Integer of position Case
* @return CasesImpl
* @exception Not Exceptions
*/
public CasesImpl getCases( int key ) {
return (CasesImpl)this.cases.get( key );
}
130
Estudio para la implementación de un sistema de razonamiento basado en casos
/**Return Cases without case
* @param int Key, Integer of position Case
* @return CasesImpl
* @exception Not Exceptions
*/
public void removeCases( int key ) {
numCases = numCases - 1;
this.cases.remove( key );
}
/**Insert Case in list
* @param int Key, Integer of position Case
* @param CasesImpl cases, Case insert
* @exception Not Exceptions
*/
public void insertCase( int key, CasesImpl cases ) {
this.cases.remove(key);
this.cases.add(key,cases);
}
}
*******************************************************************************************
CasesImpl.java
*******************************************************************************************
/**
Class implements Cases. This class asociate Array list with all values
of a case
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneObject;
import java.util.*;
import java.io.*;
public class CasesImpl extends OzoneObject implements Cases {
final static long serialVersionUID = 1L;
ArrayList list = new ArrayList();
/**CasesImpl
* @param Not Param
* @return CasesImpl
* @exception Not Exceptions
*/
public CasesImpl() {
}
/**Return a list of Attributes of case
* @param Not Param
* @return ArrayList list of attributes
* @exception Not Exceptions
*/
public ArrayList list() {
return list;
}
131
Estudio para la implementación de un sistema de razonamiento basado en casos
/**Set List
* @param ArrayList list, list
* @return ArrayList list of attributes
* @exception Not Exceptions
*/
public void setList( ArrayList list ) {
this.list = list;
}
}
*******************************************************************************************
CBRProgram.java
*******************************************************************************************
/**
Class Implement main, Class for launch aplication CBR EXTRACCION MODULE
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
public class CBRProgram {
/** Main of Program
*/
public static void main(String[] args) {
CBRProgram application = new CBRProgram();
application.run();
}
/** Metod run for create Desktop Environment of Aplication
* @param Not param
* @exception Not exceptions
*/
void run() {
int width=1003, height=670; //dimension window
CBRWindow mainWindow = new CBRWindow();
Dimension sizePant=Toolkit.getDefaultToolkit().getScreenSize();
mainWindow.setLocation( (sizePant.width - width) / 2,
(sizePant.height - height) / 2);
mainWindow.setTitle("Extraction Module CBR");
mainWindow.setResizable(false);
mainWindow.setSize(width,height);
mainWindow.show();
}
}
*******************************************************************************************
CBRProgram.java
*******************************************************************************************
132
Estudio para la implementación de un sistema de razonamiento basado en casos
/**
Class CBRWindow, Class principal window of de CRB Extraction module,
This class
management Data base options , insert new case, edit case, delete
case, show all cases
metadatacase insert and find similar cases thanks to the module of
selection Engine proyect,
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.io.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.border.*;
import net.sourceforge.selectionengine.SimilarityCriteria;
import net.sourceforge.selectionengine.SimilarityWeights;
import net.sourceforge.selectionengine.FilterCriteria;
import net.sourceforge.selectionengine.FilterEngine;
import net.sourceforge.selectionengine.Items;
import net.sourceforge.selectionengine.ItemManager;
import net.sourceforge.selectionengine.DataSetStatistics;
import net.sourceforge.selectionengine.SimilarItems;
import net.sourceforge.selectionengine.SimilarityEngine;
public class CBRWindow extends JFrame{
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
TYPE_BOOLEAN
TYPE_FLOAT
TYPE_INTEGER
TYPE_STRING
=
=
=
=
1;
2;
3;
4;
RepositoryOzone ozoneRepository; // repository Ozone CaseBase
Conection
int maxCases = 30; // max show similarity cases
Items items = null;
MetaInfoImpl metaInfoNew;
CasesImpl casesNew;
boolean SearchSimil = false;
boolean listener = false;
Hashtable casesAcces = new Hashtable();
ArrayList list = new ArrayList(); // list of cases
ArrayList listMeta = new ArrayList(); // list of metacases
// JPanels for window query
JPanel titlePanel;
JPanel panelMain;
JPanel headerLinePanel;
JPanel panel1, panel2, panel3, panel4, panel5, panel6, panel7;
JPanel buttonPanel = new JPanel();
JPanel imagePanel = new JPanel();
// JRadioButtons for window query
JRadioButton jRadioButton1, jRadioButton2, jRadioButton3,
jRadioButton4, jRadioButton5;
JRadioButton jRadioButton6, jRadioButton7, jRadioButton8,
jRadioButton9, jRadioButton10;
133
Estudio para la implementación de un sistema de razonamiento basado en casos
TraitPanel commonPanel;
ButtonGroup ImportanceGroup;
// Jcombobox for window query
JComboBox FilterComboBox;
JComboBox OperatorComboBox;
JComboBox SimilarityComboBox;
// Jlavels for window query
JLabel jLabel1, jLabel2, jLabel3, jLabel4, jLabel5, fillLabel = new
JLabel("");
// JCheckBox for window query
JCheckBox PreferCheckBox;
JCheckBox FilterCheckBox;
// JScrollPane for window query
JScrollPane queryScrollPane;
JButton submitButton = new JButton();
JButton cancelButton = new JButton();
// JMenuBar & JMenu for Aplication
JMenuBar menuOp = new JMenuBar();
JMenu menuFile = new JMenu ("File");
JMenu menuEdit = new JMenu ("Edit");
JMenu menuSearch = new JMenu ("Search");
JMenu menuView = new JMenu ("View"); // resice
JMenu menuHelp = new JMenu ("Help");
// JMenuItem for JMenubar
JMenuItem openDb = new JMenuItem("Connect DB Ozone");
JMenuItem disConnectionOzone = new JMenuItem("Close DB
Ozone");
JMenuItem metaDataOpCase = new JMenuItem("Metadata Case");
JMenuItem insertCase = new JMenuItem("Insert Case");
JMenuItem editCase = new JMenuItem("Edit Case");
JMenuItem deleteCase = new JMenuItem("Delete Case");
JMenuItem maxCasesView = new JMenuItem("View Max similar Cases
");
JMenuItem newFind = new JMenuItem("New Search Similarity");
JMenuItem viewList = new JMenuItem("Show all Cases");
JMenuItem help = new JMenuItem("Help");
JMenuItem exit = new JMenuItem("Exit Program");
/** CBRWindow Inciate Window, build MenuBar, options & images
* @param Not param
* @exception printStackTrace e, RuntimeException
*/
public CBRWindow() {
try {
montar_Menubar(); // buid Menubar of aplication
ImageIcon imagen= new ImageIcon ("images/Dibujo.jpg");
JLabel label = new JLabel(imagen);
this.getContentPane().add(label);
}
catch(Exception e) {
e.printStackTrace();
}
}
/** Iniciate new search similar attributes
* @param Not param
* @exception printStackTrace e, RuntimeException
*/
public void iniciateQuery() {
try {
loadItems(); // load items in Selection Engine
init(); // Iniciate window query
}
134
Estudio para la implementación de un sistema de razonamiento basado en casos
catch(Exception e) {
e.printStackTrace();
}
}
/** Iniciate Window query with attributes CaseBase and criterion search
* @param Not param
* @exception Not Exception
*/
private void init() {
int indexAttribute = 0;
Iterator itOrd;
ArrayList listOrd;
SearchSimil = true; // window query activate
//Serial Components Window
titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoNewSearch.jpg");
// optional image
JLabel labelTitle = new JLabel(imagen);
// Gruup panel with panels
// ATTIBUTE,PREFER, PREFER VALUE, IMPORTANCE, REQUIRE,
OPERATOR,REQUIRE VALUE
headerLinePanel = new JPanel();
headerLinePanel.setLayout(new GridLayout(0,7));
headerLinePanel.setPreferredSize(new Dimension(345,30)); //945
headerLinePanel.setBorder(BorderFactory.createEtchedBorder());
// JPanels
panel1 = new JPanel();
panel2 = new JPanel();
JPanel();
panel4 = new JPanel();
panel5 = new JPanel();
JPanel(); panel7 = new JPanel();
panel3 = new
panel6 = new
panel1.setBorder(BorderFactory.createEtchedBorder());
panel2.setBorder(BorderFactory.createEtchedBorder());
panel3.setBorder(BorderFactory.createEtchedBorder());
panel4.setBorder(BorderFactory.createEtchedBorder());
panel5.setBorder(BorderFactory.createEtchedBorder());
panel6.setBorder(BorderFactory.createEtchedBorder());
panel7.setBorder(BorderFactory.createEtchedBorder());
panel1.add( new JLabel("ATTRIBUTE") );
panel2.add( new
JLabel("PREFER") );
panel3.add( new JLabel("PREFER VALUE") ); panel4.add( new
JLabel("IMPORTANCE") );
panel5.add( new JLabel("REQUIRE") );
panel6.add( new
JLabel("OPERATOR") );
panel7.add( new JLabel("REQUIRE VALUE") );
headerLinePanel.add(
headerLinePanel.add(
headerLinePanel.add(
headerLinePanel.add(
panel1
panel3
panel5
panel7
);
);
);
);
headerLinePanel.add( panel2 );
headerLinePanel.add( panel4 );
headerLinePanel.add( panel6 );
panelMain = new JPanel();
panelMain.add(headerLinePanel);
//end main components Window
Iterator it = this.listMeta.iterator();
Iterator itCases = this.list.iterator();
//Components Window attributes visibles
while (it.hasNext()) { // while exist Attributes defined
metaInfoNew = (MetaInfoImpl)it.next();
if (metaInfoNew.included() == true){ // Attribute is
visible?
135
Estudio para la implementación de un sistema de razonamiento basado en casos
commonPanel = new TraitPanel();
jLabel1 = new JLabel();
jLabel1.setPreferredSize(new Dimension(100, 17));
jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
jLabel1.setText(metaInfoNew.name_attribute());
PreferCheckBox = new JCheckBox();
//importance
jRadioButton1 = new JRadioButton();
jRadioButton1.setActionCommand("1");
jRadioButton1.setHorizontalAlignment(SwingConstants.CENTER);
jRadioButton1.setText("-");
jRadioButton1.setHorizontalTextPosition(SwingConstants.CENTER);
jRadioButton1.setVerticalTextPosition(SwingConstants.BOTTOM);
jRadioButton2 = new JRadioButton();
jRadioButton2.setActionCommand(" 2");
jRadioButton2.setVerticalTextPosition(SwingConstants.BOTTOM);
jRadioButton2.setText(" ");
jRadioButton2.setHorizontalTextPosition(SwingConstants.CENTER);
jRadioButton2.setHorizontalAlignment(SwingConstants.CENTER);
jRadioButton3 = new JRadioButton();
jRadioButton3.setActionCommand(" 3");
jRadioButton3.setHorizontalAlignment(SwingConstants.CENTER);
jRadioButton3.setText(" ");
jRadioButton3.setSelected(true);
jRadioButton3.setHorizontalTextPosition(SwingConstants.CENTER);
jRadioButton3.setVerticalTextPosition(SwingConstants.BOTTOM);
jRadioButton4 = new JRadioButton();
jRadioButton4.setActionCommand(" 4");
jRadioButton4.setHorizontalAlignment(SwingConstants.CENTER);
jRadioButton4.setText(" ");
jRadioButton4.setHorizontalTextPosition(SwingConstants.CENTER);
jRadioButton4.setVerticalTextPosition(SwingConstants.BOTTOM);
jRadioButton5 = new JRadioButton();
jRadioButton5.setActionCommand("5");
jRadioButton5.setHorizontalAlignment(SwingConstants.CENTER);
jRadioButton5.setText("+");
jRadioButton5.setHorizontalTextPosition(SwingConstants.CENTER);
jRadioButton5.setVerticalTextPosition(SwingConstants.BOTTOM);
ImportanceGroup = new ButtonGroup();
ImportanceGroup.add(jRadioButton1);
ImportanceGroup.add(jRadioButton2);
ImportanceGroup.add(jRadioButton3);
ImportanceGroup.add(jRadioButton4);
ImportanceGroup.add(jRadioButton5);
//combobox
FilterComboBox = new JComboBox();
OperatorComboBox = new JComboBox();
SimilarityComboBox = new JComboBox();
OperatorComboBox.setPreferredSize(new Dimension(70, 20));
SimilarityComboBox.setPreferredSize(new Dimension(120, 20));
FilterComboBox.setPreferredSize(new Dimension(120, 20));
commonPanel.setLayout(new GridLayout(0,7));
commonPanel.setBorder(BorderFactory.createEtchedBorder());
FilterCheckBox = new JCheckBox();
commonPanel.setTraitName(metaInfoNew.name_attribute());
String typeAttribute = metaInfoNew.typeName_attribute(); // Type of data
//Type of attibute in commonPanel
if (typeAttribute.equals("String")){
commonPanel.setTraitDataType(TYPE_STRING);
}else if(typeAttribute.equals("Boolean")){
commonPanel.setTraitDataType(TYPE_BOOLEAN);
}else if(typeAttribute.equals("Float")){
commonPanel.setTraitDataType(TYPE_FLOAT);
136
Estudio para la implementación de un sistema de razonamiento basado en casos
}else if(typeAttribute.equals("Integer")){
commonPanel.setTraitDataType(TYPE_INTEGER);
}
commonPanel.setFilterOperatorComboBox(OperatorComboBox);
commonPanel.setFilterValueComboBox(FilterComboBox);
commonPanel.setPreferenceValueComboBox(SimilarityComboBox);
commonPanel.setWeightButtonGroup(ImportanceGroup);
commonPanel.setFilterCheckBox(FilterCheckBox);
commonPanel.setSimilarityCheckBox(PreferCheckBox);
// JPanels For objects
panel1 = new JPanel();
panel4 = new JPanel();
panel7 = new JPanel();
panel2 = new JPanel();
panel5 = new JPanel();
panel3 = new JPanel();
panel6 = new JPanel();
panel1.add(jLabel1);
panel2.add(PreferCheckBox);
panel3.add(SimilarityComboBox);
panel4.add(jRadioButton1); panel4.add(jRadioButton2);
panel4.add(jRadioButton3);
panel4.add(jRadioButton4); panel4.add(jRadioButton5);
panel5.add(FilterCheckBox);
panel6.add(OperatorComboBox);
panel7.add(FilterComboBox);
panel1.setBorder(BorderFactory.createEtchedBorder());
panel2.setBorder(BorderFactory.createEtchedBorder());
panel3.setBorder(BorderFactory.createEtchedBorder());
panel4.setBorder(BorderFactory.createEtchedBorder());
panel5.setBorder(BorderFactory.createEtchedBorder());
panel6.setBorder(BorderFactory.createEtchedBorder());
panel7.setBorder(BorderFactory.createEtchedBorder());
commonPanel.add(panel1);
commonPanel.add(panel2);
commonPanel.add(panel3);
commonPanel.add(panel4);
commonPanel.add(panel5);
commonPanel.add(panel6);
commonPanel.add(panel7);
// Main Panel
panelMain.add(commonPanel);
//Combobox list arranged according type Data
listOrd = Ordenacion(ItemsCombobox(indexAttribute),
typeAttribute);
itOrd = listOrd.iterator();
while( itOrd.hasNext() ){ // while exist information add to
if (typeAttribute.equals("String")){
String attribute = (String)itOrd.next();
SimilarityComboBox.addItem(attribute);
FilterComboBox.addItem(attribute);
}else if (typeAttribute.equals("Integer")){
Integer attributeInt = (Integer)itOrd.next();
SimilarityComboBox.addItem(attributeInt);
FilterComboBox.addItem(attributeInt);
}else if (typeAttribute.equals("Float")){
Float attributeFloat = (Float)itOrd.next();
SimilarityComboBox.addItem(attributeFloat);
FilterComboBox.addItem(attributeFloat);
}else{
String attribute = (String)itOrd.next();
SimilarityComboBox.addItem(attribute);
FilterComboBox.addItem(attribute);
}
}
// Operators Combobox according Type Data(numeric,Not Numeric, boolean)
if (typeAttribute.equals("String")){
addNonNumericFilterOperators(OperatorComboBox);
137
Estudio para la implementación de un sistema de razonamiento basado en casos
}else if(typeAttribute.equals("Boolean")){
addBooleanFilterOperators(OperatorComboBox);
}else{
addNumericFilterOperators(OperatorComboBox);
}
}
indexAttribute++; // increment index of Attribute
}
panelMain.setLayout(new GridLayout(0,1));
queryScrollPane = new JScrollPane();
queryScrollPane.setBorder(BorderFactory.createLoweredBevelBorder());
queryScrollPane.getViewport().add(panelMain, null);
// buttons Window (cancel and show similar cases)
submitButton.setText("Get similar cases");
cancelButton.setText("Cancel");
submitButton.setBounds(100,20,100,20);
cancelButton.setBounds(100,20,100,20);
buttonPanel.add(cancelButton, null);
buttonPanel.add(submitButton, null);
this.getContentPane().setVisible(false);
this.getContentPane().removeAll();
this.getContentPane().add(labelTitle,BorderLayout.NORTH);
this.getContentPane().add(queryScrollPane, BorderLayout.CENTER);
this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
this.getContentPane().setVisible(true);
// ActionListeners for buttons
if (listener == false){
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e)
{
cancelButton_actionPerformed();
} });
submitButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e)
{
submitButton_actionPerformed(e);
} });
listener = true;
}
}
/** Iniciate MenuBar of Aplication & Submenus
* @param Not param
* @exception Not Exception
*/
public void montar_Menubar (){
// GROUPS
// Group Menubar menuFile
menuFile.setMnemonic(KeyEvent.VK_F);
openDb.setMnemonic(KeyEvent.VK_C);
menuFile.add(openDb);
138
Estudio para la implementación de un sistema de razonamiento basado en casos
disConnectionOzone.setMnemonic(KeyEvent.VK_S);
menuFile.add(disConnectionOzone);
disConnectionOzone.setEnabled(false);
exit.setMnemonic(KeyEvent.VK_X);
menuFile.add(new JSeparator());
menuFile.add(exit);
// Group Edit
menuEdit.setMnemonic(KeyEvent.VK_E);
metaDataOpCase.setMnemonic(KeyEvent.VK_M);
metaDataOpCase.setEnabled(false); menuEdit.add(metaDataOpCase);
insertCase.setMnemonic(KeyEvent.VK_I);
insertCase.setEnabled(false);
menuEdit.add(insertCase);
editCase.setMnemonic(KeyEvent.VK_T);
editCase.setEnabled(false);
menuEdit.add(editCase);
deleteCase.setMnemonic(KeyEvent.VK_L);
deleteCase.setEnabled(false);
menuEdit.add(deleteCase);
// Group Search
menuSearch.setMnemonic(KeyEvent.VK_M);
newFind.setMnemonic(KeyEvent.VK_N);
newFind.setEnabled(false);
menuSearch.add(newFind);
// Group ViewList
menuView.setMnemonic(KeyEvent.VK_V);
viewList.setMnemonic(KeyEvent.VK_S);
maxCasesView.setMnemonic(KeyEvent.VK_A);
maxCasesView.setEnabled(false);
viewList.setEnabled(false);
menuView.add(viewList);
menuView.add(maxCasesView);
// Group Help
menuHelp.add(help);
// All Groups
menuOp.add(menuFile);
menuOp.add(menuEdit);
menuOp.add(menuSearch);
menuOp.add(menuView);
menuOp.add(menuHelp);
// LISTENERS
// Event Help
help.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
help_actionPerformed(e);
}});
// Event metaDataCase
metaDataOpCase.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
metaDataOpCase_actionPerformed(e);
}});
// Event New Find
newFind.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
newfind_actionPerformed(e);
}});
// Insert Case
insertCase.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
insertCase_actionPerformed(e);
}});
// Edit Case
editCase.addActionListener(new java.awt.event.ActionListener() {
139
Estudio para la implementación de un sistema de razonamiento basado en casos
public void actionPerformed(ActionEvent e) {
editCase_actionPerformed(e);
}});
// Delete Case
deleteCase.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
deleteCase_actionPerformed(e);
}});
// View Case
viewList.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
viewList_actionPerformed(e);
}});
// view max similar cases
maxCasesView.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
maxCasesView_actionPerformed(e);
}});
// Event Exit
exit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
exit_actionPerformed(e);
}});
//Event Close
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
exitWindow(e);
}});
//Event Close
disConnectionOzone.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
disConnectionOzone_actionPerformed(e);
}});
//Event Create new DBozone
openDb.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
openDb_actionPerformed(e);
}});
this.setJMenuBar(menuOp);
}
/** Order alphabetically of Attributes & Order of smaller to bigger
* @param Arraylist Lista, contain list non repeat values
* @param String typeAttribute, contain data type of list
* @exception Not Exception
*/
public ArrayList Ordenacion (ArrayList lista, String typeAttribute){
Collection c = new ArrayList();
ArrayList listaReturn = new ArrayList(); // List Value by type value
String key;
Iterator it = lista.iterator();
while (it.hasNext()){
key = (String) it.next();
if (typeAttribute.equals("String")){
listaReturn.add(key);
}else if (typeAttribute.equals("Integer")){
listaReturn.add(new Integer (key) );
}else if (typeAttribute.equals("Float")){
listaReturn.add(new Float (key));
}else{
listaReturn.add(key);
}
140
Estudio para la implementación de un sistema de razonamiento basado en casos
}
// Arranged values of Attributes by Type date
if (typeAttribute.equals("String")){
OrdenacionNombre ord = new OrdenacionNombre();
Collections.sort(listaReturn,ord);
}else if (typeAttribute.equals("Integer")){
OrdenacionInteger ordInt = new OrdenacionInteger();
Collections.sort(listaReturn,ordInt);
}else if (typeAttribute.equals("Float")){
OrdenacionFloat ordFloat = new OrdenacionFloat();
Collections.sort(listaReturn,ordFloat);
}else{
OrdenacionNombre ordBool = new OrdenacionNombre();
Collections.sort(listaReturn,ordBool);
}
return listaReturn;
}
/**Create list of non repeat values
* @param int index, contain index of Attribute in case
* @return retun list of not repeat values
* @exception Not Exceptions
*/
public ArrayList ItemsCombobox(int index) {
ArrayList listReturn = new ArrayList();
ArrayList listTemp = new ArrayList();
String attribute;
int attributeInt;
Iterator itCases = this.list.iterator();
while (itCases.hasNext()) { // While exist Cases
casesNew = (CasesImpl)itCases.next();
listTemp = casesNew.list();
attribute = (String)listTemp.get(index);
if (!listReturn.contains(attribute)){ // Value Attrinute is repeat at list?
listReturn.add(attribute);
}
}
return listReturn;
}
/**Add to combobox Not Numeric values
* @param JComboBox list, Combobox null
* @exception Not Exceptions
*/
protected void addNonNumericFilterOperators(JComboBox list) {
list.addItem("=");
list.addItem("!=");
list.setSelectedIndex(0);
}
/**Add to combobox Numeric values
* @param JComboBox list, Combobox null
* @exception Not Exceptions
*/
protected void addNumericFilterOperators(JComboBox list) {
list.addItem("=");
list.addItem("!=");
list.addItem(">");
list.addItem(">=");
list.addItem("<");
list.addItem("<=");
141
Estudio para la implementación de un sistema de razonamiento basado en casos
list.setSelectedIndex(0);
}
/**Add to combobox Bolean values
* @param JComboBox list, Combobox null
* @exception Not Exceptions
*/
protected void addBooleanFilterOperators(JComboBox list) {
list.addItem("=");
list.setSelectedIndex(0);
}
/**Action button Cancel in Similarity Search
* @param Not params
* @exception Not Exceptions
*/
void cancelButton_actionPerformed() {
this.getContentPane().setVisible(false);
this.getContentPane().removeAll();
ImageIcon imagen= new ImageIcon ("images/Dibujo.jpg"); // reload image
JLabel label = new JLabel(imagen);
this.getContentPane().add(label);
this.getContentPane().setVisible(true);
SearchSimil = false; // window Similarity is false
}
/**Load Items for Similarity motor Cbr Similarity Engine
* @param Not params
* @exception Not Exceptions
*/
protected void loadItems() {
try{
this.items = null;
ItemManager mainItemManager = new ItemManager( listMeta, list );
this.items = mainItemManager.getItems(); // return Items
DataSetStatistics stats = new DataSetStatistics( this.items );
// generate Stats of Items
} catch(Exception e){
JOptionPane.showMessageDialog( this, "Error in load items",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/**Action button Similarity Cases, find similar cases
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void submitButton_actionPerformed(ActionEvent e) {
TraitPanel panel;
String traitName, operator, value;
int traitDataType, weight;
boolean similarity = false;
Items matchedItems;
DataSetStatistics stats;
FilterEngine filterEngine;
SimilarItems similarItems = null;
SimilarityEngine similarityEngine = new SimilarityEngine();
FilterCriteria filterCriteria = new FilterCriteria();
SimilarityCriteria similarityCriteria = new SimilarityCriteria();
SimilarityWeights similarityWeights = new SimilarityWeights();
ResultsWindow resultsWindow;
Component component;
Component[] components;
142
Estudio para la implementación de un sistema de razonamiento basado en casos
try {
components = panelMain.getComponents(); // get all components in window
for (int i=0; i < components.length; i++) {
component = panelMain.getComponent(i);
if ( component.getClass() == TraitPanel.class ) {
panel = (TraitPanel) component;
// Similarity Criteria
if (panel.hasSimilarityCriteria()) { // is activate
// checkbox for similarCriteria
similarity = true;
traitName = panel.getTraitName(); // name
//Attribute
traitDataType = panel.getTraitDataType();
operator = "%";
switch (traitDataType) { // operators
//Selection Engine
case TYPE_INTEGER:
case TYPE_FLOAT:
operator = "~";
break;
case TYPE_STRING:
case TYPE_BOOLEAN:
operator = "%";
break;
}
value = panel.getPreferenceValue(); // prefer value of Attribute
weight = panel.getWeight();
// weigth value of Attribute
similarityCriteria.add( traitName, operator, value );
similarityWeights.add( traitName, weight );
}
// Operator Criteria
if (panel.hasFilterCriteria()) { // Require Checkbox
traitName = panel.getTraitName(); // name of attribute
operator = panel.getFilterOperator(); // operator
value = panel.getFilterValue(); // value attribute
filterCriteria.add( traitName, operator, value );
}
//--- hasFilterCriteria*/
}
}
}catch (Exception ex) {
JOptionPane.showMessageDialog( this, "Error Submit button Similarity Cases",
"Error", JOptionPane.ERROR_MESSAGE );
}
try {
// Cbr Motor
filterEngine = new FilterEngine();
matchedItems = filterEngine.filterItems( items, filterCriteria ); // return
//one object Items
// where eliminate items with filterCriteria
stats = new DataSetStatistics( items );
similarItems = similarityEngine.computeSimilarity(
matchedItems,
similarityCriteria,
similarityWeights,
143
Estudio para la implementación de un sistema de razonamiento basado en casos
stats );
// window results of similar cases
resultsWindow = new ResultsWindow(this, this.listMeta, similarItems,
items.getTraitDescriptors(), maxCases,similarity);
}catch (Exception excep) {
JOptionPane.showMessageDialog( this, "Error:"+ excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
// Null Attributes for future consults
traitDataType = 0;
weight = 0;
traitName = null;
operator = null;
component = null;
components = null;
stats = null;
filterEngine = null;
similarItems = null;
filterCriteria = null; similarityEngine = null;
similarityWeights = null;
similarity = false;
value = null;
matchedItems = null; panel = null;
resultsWindow = null;
similarityCriteria = null;
}
/**Action button Help
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void help_actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(this,
"CBR MODULE EXTRACTION\n" +
"*******************************\n" +
"PROGRAMMER:\n" +
"
Manuel Miguel Gimenez Arjona\n" +
"
[email protected]\n\n" +
"DIRECTORS:\n" +
"
Ivan Lopez Arevalo / Aïda Valls Mateu\n" +
"
[email protected] / [email protected]\n\n" +
"LINKS:\n" +
"
[BANZAI Research Group]
http://www.etse.urv.es/recerca/banzai\n" +
"
[Dept. Enginyeria Informatica i Matematiques]
http://www.etse.urv.es/DEIM\n" +
"
[Universitat Rovira i Virgili]
http://www.urv.net\n" +
"
[Java]
http://www.java.sun.com\n" +
"
[Selection Engine]
http://selectionengine.sourceforge.net\n"
+
"
[Ozone Project]
http://www.ozone-db.org\n\n\n\n" +
"FOR TOPIC QUESTIONS:\n" +
"
[email protected]\n" +
"
[email protected]\n",
"ABOUT CBR..", JOptionPane.PLAIN_MESSAGE);
}
/**Action button New Find Similarity
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void newfind_actionPerformed(ActionEvent e) {
iniciateQuery();
}
/**Action Button MetaDAtaCase insert, Show Window Insert Metadata
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void metaDataOpCase_actionPerformed(ActionEvent e) {
WindowMetaDataCase metaDataCase = new WindowMetaDataCase (this, listMeta,
list, newFind, viewList, insertCase, editCase, deleteCase,
metaDataOpCase,maxCasesView);
144
Estudio para la implementación de un sistema de razonamiento basado en casos
}
/**Action button View List of cases, Show Window all cases
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void viewList_actionPerformed(ActionEvent e) {
WindowCaseView viewCase = new WindowCaseView (this, this.listMeta, this.list);
}
/**Action button View max cases and define number max
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void maxCasesView_actionPerformed(ActionEvent e) {
if (SearchSimil == true){ // if query window is activate
cancelButton_actionPerformed();
}
// new max show similar cases
String code = JOptionPane.showInputDialog(this,"Max Cases is " + maxCases +
" , put new max similar cases");
if (code != null) { // is null?
try{
int var = Integer.parseInt(code);
maxCases = var;
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog( this, "Error: Require
Integer", "Error", JOptionPane.ERROR_MESSAGE );
}
}
}
/**Action button Insert new Case
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void insertCase_actionPerformed(ActionEvent e) {
if (SearchSimil == true){ // if query window is activate
cancelButton_actionPerformed();
}
WindowCaseNew newCase = new WindowCaseNew(this, listMeta, casesAcces,
this.list, ozoneRepository);
}
/**Action button Disconnect Ozone
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void disConnectionOzone_actionPerformed(ActionEvent e) {
try {
ozoneRepository.saveDataBase(this, listMeta); // save metacases
ozoneRepository.close(); // close CaseBase conexion with aplication
newFind.setEnabled(false);
viewList.setEnabled(false);
maxCasesView.setEnabled(false);
insertCase.setEnabled(false);
editCase.setEnabled(false);
deleteCase.setEnabled(false);
metaDataOpCase.setEnabled(false);
145
Estudio para la implementación de un sistema de razonamiento basado en casos
disConnectionOzone.setEnabled(false);
openDb.setEnabled(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( this, "Error: Disconnect Ozone",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/**Action Button Edit case
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void editCase_actionPerformed(ActionEvent e) {
if (SearchSimil == true){ // if query window is activate
cancelButton_actionPerformed();
}
CasesImpl caseCode; // Case
// code reference of case
String code = JOptionPane.showInputDialog(this,"Code Reference");
if (code != null) {
if(casesAcces.containsKey(code)){ // this reference exist in hashTable
// of cases?
CasesImpl caseObtain = (CasesImpl)casesAcces.get(code); //
recuperate Case
//Show window edit
WindowCaseEdit newCase = new WindowCaseEdit(this, this.listMeta, //
casesAcces,
this.list,
code,
caseObtain,
ozoneRepository);
}else{
JOptionPane.showMessageDialog( this, "Error: Code Reference not exist",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
}
/**Action button delete Case
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void deleteCase_actionPerformed(ActionEvent e) {
if (SearchSimil == true){ // if query window is activate
cancelButton_actionPerformed();
}
CasesImpl caseCode; // Case
// code reference of case
String code = JOptionPane.showInputDialog(this,"Code Reference");
if (code != null) {
if(casesAcces.containsKey(code)){ // this reference exist in
//hashTable of cases?
CasesImpl caseObtain = (CasesImpl)casesAcces.get(code); //
//recuperate Case
//Show window delete case
WindowCaseDelete newCase = new WindowCaseDelete(this, this.listMeta,
146
Estudio para la implementación de un sistema de razonamiento basado en casos
casesAcces,
this.list,
code,
caseObtain,
ozoneRepository);
}else{
JOptionPane.showMessageDialog( this, "Error: Code Reference not exist",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
}
/**Action button open CaseBase
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void openDb_actionPerformed(ActionEvent e) {
try {
ozoneRepository = new RepositoryOzone(); // repository Ozone
ozoneRepository.open();
// conect aplication to Ozone
disConnectionOzone.setEnabled(true);
openDb.setEnabled(false);
//ozoneRepository.create(); // create in file.dat
list = ozoneRepository.getCases(this);
listMeta = ozoneRepository.getMeta(this);
if ( listMeta.size() != 0 ){ // if have metacases
if (list.size() != 0){ // if have cases
loadItems(); // Load items for selection engine
// load Cases in the estructures Hash & array list
WindowProgressBarReload progressBar = new WindowProgressBarReload(this,
casesAcces,list);
}
newFind.setEnabled(true);
viewList.setEnabled(true);
maxCasesView.setEnabled(true);
insertCase.setEnabled(true);
editCase.setEnabled(true);
deleteCase.setEnabled(true);
}else{
metaDataOpCase.setEnabled(true);
}
}catch (Exception excep) {
JOptionPane.showMessageDialog( this, "Error: open CaseBase",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/**Action button Exit Program
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void exit_actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(this,"Are you sure to Exit?",
"Exit Program",JOptionPane.YES_NO_OPTION)
==JOptionPane.YES_OPTION){
try {
147
Estudio para la implementación de un sistema de razonamiento basado en casos
ozoneRepository.saveDataBase(this, listMeta); // save
//metacases
ozoneRepository.close();
//
//ozone close conection
System.exit(0);
}catch (Exception excep) {
System.exit(0);
}
}
}
/**Action button Exit Program window
* @param ActionEvent e, ActionEvent
* @exception Not Exceptions
*/
void exitWindow(WindowEvent e){
if(JOptionPane.showConfirmDialog(this,"Are you sure to Exit?",
"Exit Program",JOptionPane.YES_NO_OPTION)
==JOptionPane.YES_OPTION){
try {
ozoneRepository.saveDataBase(this, listMeta); // save
//metacases
ozoneRepository.close();
//
//ozone close conection
System.exit(0);
}catch (Exception excep) {
System.exit(0);
}
}
}
//end
}
*******************************************************************************************
DataSetStatistics.java
*******************************************************************************************
/**
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
* This is a collection of TraitStatistics objects
* There is one TraitStatistics object per Trait
*
(the name is plural because each trait has multiple stats)
*
* DataSetStatistics builds the collection of TraitStatistics
*
and is responsible for converting everything to floating
*
points, which is what TraitStatistics wants
* Strings and booleans aren't really processed. Just set
*
the max and min to 1 and 0
*
* @author <small>baylor</small>
*
*/
public class DataSetStatistics {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------HashMap dataSetStatistics;
//--- collection of TraitStatistics
148
Estudio para la implementación de un sistema de razonamiento basado en casos
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------public DataSetStatistics( Items items ) {
createCollection( items.getTraitDescriptors() );
buildStatistics( items );
} //--- constructor
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** add TraitStatistics to hashmap
* @param TraitStatistics traitStatistics
* @exception Not Exceptions
*/
private void add( TraitStatistics traitStatistics ) {
String key = traitStatistics.getTraitName();
dataSetStatistics.put( key, traitStatistics );
} //--- add
/** build Statistics
* @param Items items, collection of item
* @exception Not Exceptions
*/
private void buildStatistics( Items items ) {
Iterator itemList = items.iterator();
while (itemList.hasNext()) {
Item item = (Item) itemList.next();
}
measureItemTraits( item );
} //--- hasNext
//--- buildStatistics
/** Create collection TraitStatistics
* @param TraitDescriptors descriptors
* @exception Not Exceptions
*/
private void createCollection( TraitDescriptors descriptors ) {
this.dataSetStatistics = new HashMap();
Iterator cursor = descriptors.iterator();
while (cursor.hasNext()) {
TraitDescriptor descriptor = (TraitDescriptor) cursor.next();
String traitName = descriptor.getName();
TraitStatistics traitStats = new TraitStatistics( traitName );
//--- We can pretty much skip any traits that aren't numeric
//--- We'll create a stats object but make it binary //--min=0, max=1, a value either matches exactly or it don't
if ( (descriptor.getDataType() !=
TraitDescriptor.TYPE_FLOAT ) &&
(descriptor.getDataType() !=
TraitDescriptor.TYPE_INTEGER) ) {
traitStats.setMinimumValue( 0 );
traitStats.setMaximumValue( 1 );
}
}
this.add( traitStats );
} //--- while hasNext
//--- createCollection
/** measureItemTraits
* @param Item item,item case
* @exception Not Exceptions
*/
private void measureItemTraits( Item item ) {
Iterator traitList = item.iterator();
while (traitList.hasNext()) {
Trait trait = (Trait) traitList.next();
String traitName = trait.getName();
int dataType = item.getTraitDataType( traitName );
//--- We're only going to measure stats for numbers
149
Estudio para la implementación de un sistema de razonamiento basado en casos
//--- When we initialized the data set statistics collection,
//--we set the stats for all strings and booleans to
//--min=0 max=1, which is the only values we'd ever
//--recognize, so we can just ignore strings and bools here
if ( (dataType == TraitDescriptor.TYPE_FLOAT ) ||
(dataType == TraitDescriptor.TYPE_INTEGER) ) {
}
TraitStatistics traitStats = this.get( traitName );
float value = trait.getValue().toFloat();
traitStats.addExample( value );
}
} //--- hasNext
//--- measureItemTraits
//----------------------------------------------------------------------------// Accessors
//----------------------------------------------------------------------------/** get traitStatistics
* @param String traitName, name of Attribute
* @return TraitStatistics
* @exception Not Exceptions
*/
public TraitStatistics get( String traitName ) {
return (TraitStatistics) dataSetStatistics.get( traitName );
} //--- get
}
//--- DataSetStatistics
*******************************************************************************************
ExampleFileFilter.java
*******************************************************************************************
/*
* @(#)ExampleFileFilter.java
1.8 98/08/26
*
* Copyright 1998 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
package cbr;
import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.filechooser.*;
/**
* A convenience implementation of FileFilter that filters out
* all files except for those type extensions that it knows about.
*
* Extensions are of the type ".foo", which is typically found on
* Windows and Unix boxes, but not on Macinthosh. Case is ignored.
*
* Example - create a new filter that filerts out all files
* but gif and jpg image files:
*
*
JFileChooser chooser = new JFileChooser();
*
ExampleFileFilter filter = new ExampleFileFilter(
*
new String{"gif", "jpg"}, "JPEG & GIF Images")
*
chooser.addChoosableFileFilter(filter);
*
chooser.showOpenDialog(this);
*
* @version 1.8 08/26/98
* @author Jeff Dinkins
*/
150
Estudio para la implementación de un sistema de razonamiento basado en casos
public class ExampleFileFilter extends FileFilter {
private static String TYPE_UNKNOWN = "Type Unknown";
private static String HIDDEN_FILE = "Hidden File";
private
private
private
private
Hashtable filters = null;
String description = null;
String fullDescription = null;
boolean useExtensionsInDescription = true;
/**
* Creates a file filter. If no filters are added, then all
* files are accepted.
*
* @see #addExtension
*/
public ExampleFileFilter() {
this.filters = new Hashtable();
}
/**
* Creates a file filter that accepts files with the given extension.
* Example: new ExampleFileFilter("jpg");
*
* @see #addExtension
*/
public ExampleFileFilter(String extension) {
this(extension,null);
}
/**
* Creates a file filter that accepts the given file type.
* Example: new ExampleFileFilter("jpg", "JPEG Image Images");
*
* Note that the "." before the extension is not needed. If
* provided, it will be ignored.
*
* @see #addExtension
*/
public ExampleFileFilter(String extension, String description) {
this();
if(extension!=null) addExtension(extension);
if(description!=null) setDescription(description);
}
/**
* Creates a file filter from the given string array.
* Example: new ExampleFileFilter(String {"gif", "jpg"});
*
* Note that the "." before the extension is not needed adn
* will be ignored.
*
* @see #addExtension
*/
public ExampleFileFilter(String[] filters) {
this(filters, null);
}
/**
* Creates a file filter from the given string array and description.
* Example: new ExampleFileFilter(String {"gif", "jpg"}, "Gif and JPG Images");
*
* Note that the "." before the extension is not needed and will be ignored.
*
* @see #addExtension
*/
public ExampleFileFilter(String[] filters, String description) {
this();
for (int i = 0; i < filters.length; i++) {
// add filters one by one
addExtension(filters[i]);
}
151
Estudio para la implementación de un sistema de razonamiento basado en casos
if(description!=null) setDescription(description);
}
/**
* Return true if this file should be shown in the directory pane,
* false if it shouldn't.
*
* Files that begin with "." are ignored.
*
* @see #getExtension
* @see FileFilter#accept
*/
public boolean accept(File f) {
if(f != null) {
if(f.isDirectory()) {
return true;
}
String extension = getExtension(f);
if(extension != null && filters.get(getExtension(f)) != null) {
return true;
};
}
return false;
}
/**
* Return the extension portion of the file's name .
*
* @see #getExtension
* @see FileFilter#accept
*/
public String getExtension(File f) {
if(f != null) {
String filename = f.getName();
int i = filename.lastIndexOf('.');
if(i>0 && i<filename.length()-1) {
return filename.substring(i+1).toLowerCase();
};
}
return null;
}
/**
* Adds a filetype "dot" extension to filter against.
*
* For example: the following code will create a filter that filters
* out all files except those that end in ".jpg" and ".tif":
*
*
ExampleFileFilter filter = new ExampleFileFilter();
*
filter.addExtension("jpg");
*
filter.addExtension("tif");
*
* Note that the "." before the extension is not needed and will be ignored.
*/
public void addExtension(String extension) {
if(filters == null) {
filters = new Hashtable(5);
}
filters.put(extension.toLowerCase(), this);
fullDescription = null;
}
/**
* Returns the human readable description of this filter. For
* example: "JPEG and GIF Image Files (*.jpg, *.gif)"
*
* @see #setDescription
* @see #setExtensionListInDescription
* @see #isExtensionListInDescription
* @see FileFilter#getDescription
*/
public String getDescription() {
if(fullDescription == null) {
152
Estudio para la implementación de un sistema de razonamiento basado en casos
if(description == null || isExtensionListInDescription()) {
fullDescription = description==null ? "(" : description + " (";
// build the description from the extension list
Enumeration extensions = filters.keys();
if(extensions != null) {
fullDescription += "." + (String) extensions.nextElement();
while (extensions.hasMoreElements()) {
fullDescription += ", " + (String) extensions.nextElement();
}
}
fullDescription += ")";
} else {
fullDescription = description;
}
}
return fullDescription;
}
/**
* Sets the human readable description of this filter. For
* example: filter.setDescription("Gif and JPG Images");
*
* @see #setDescription
* @see #setExtensionListInDescription
* @see #isExtensionListInDescription
*/
public void setDescription(String description) {
this.description = description;
fullDescription = null;
}
/**
* Determines whether the extension list (.jpg, .gif, etc) should
* show up in the human readable description.
*
* Only relevent if a description was provided in the constructor
* or using setDescription();
*
* @see #getDescription
* @see #setDescription
* @see #isExtensionListInDescription
*/
public void setExtensionListInDescription(boolean b) {
useExtensionsInDescription = b;
fullDescription = null;
}
/**
* Returns whether the extension list (.jpg, .gif, etc) should
* show up in the human readable description.
*
* Only relevent if a description was provided in the constructor
* or using setDescription();
*
* @see #getDescription
* @see #setDescription
* @see #setExtensionListInDescription
*/
public boolean isExtensionListInDescription() {
return useExtensionsInDescription;
}
}
*******************************************************************************************
FilterCriteria.java
*******************************************************************************************
/**
153
Estudio para la implementación de un sistema de razonamiento basado en casos
This class create one collection of Filtercriterion Objects,
Filtercriterion Objects indicates if Item violates criterions usrs
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
*/
public class FilterCriteria {
//--- Here's where we hold all our data
private ArrayList data = new ArrayList();
/** Add collection of filterCriterion
* @param String field, name of attribute
* @param String operator, operator criterion
* @param String value, value of attribute
* @exception Not Exceptions
*/
public void add( String field, String operator, String value ) {
FilterCriterion criterion = new FilterCriterion( field, operator, value );
}
data.add( criterion );
//--- add
/**
* This has to return Object because that's how
* it's defined in the super class
*/
public Object clone( ) {
FilterCriteria newFilterCriteria = new FilterCriteria();
newFilterCriteria.setValues( data );
}
return (Object) newFilterCriteria;
//--- clone
/** Iterator
* @param Not params
* @return Iterator
* @exception Not Exceptions
*/
public Iterator iterator() {
return data.iterator();
}
/** Set values
* @param ArrayList newValues, arraylist new
* @exception Not Exceptions
*/
private void setValues( ArrayList newValues ) {
data = (ArrayList) newValues.clone();
}
/** get int Size
* @param Not params
* @return int size of collection
* @exception Not Exceptions
*/
public int size() {
return data.size();
}
}
//--- FilterCriteria
154
Estudio para la implementación de un sistema de razonamiento basado en casos
*******************************************************************************************
FilterCriterion.java
*******************************************************************************************
/**
This class indicate if criterion users are violated by items
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
/**
*
* @author <small>baylor</small>
*
*/
public class FilterCriterion
{
//----------------------------------------------------------------------------// Public constants
//----------------------------------------------------------------------------public static final int OPERATOR_UNKNOWN
= 0;
public static final int OPERATOR_EQUALS
= 1;
public static final int OPERATOR_NOT_EQUAL
= 2;
public static final int OPERATOR_GREATER_THAN
= 3;
public static final int OPERATOR_GREATER_THAN_OR_EQUAL = 4;
public static final int OPERATOR_LESS_THAN
= 5;
public static final int OPERATOR_LESS_THAN_OR_EQUAL
= 6;
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------protected String fieldName;
protected int operator;
protected TraitValue value;
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------protected FilterCriterion( String fieldName, String operator, String value ) {
this.fieldName = fieldName;
this.operator = stringToOperator( operator );
this.value = new TraitValue( value );
} //--- constructor
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** Return String Attribute
* @param not params
* @return String fieldName, name Attribute
* @exceptions Not Exceptions
*/
public String getFieldName() {
return fieldName;
}
/** Return integer Operator
* @param not params
* @return integer Operator
* @exceptions Not Exceptions
*/
public int getOperator() {
return operator;
}
/** Return String Opertor
* @param not params
* @return String Operator
* @exceptions Not Exceptions
*/
public String getOperatorAsString() {
155
Estudio para la implementación de un sistema de razonamiento basado en casos
return operatorToString( operator );
}
/** Return Value
* @param not params
* @return traitvalue value
* @exceptions Not Exceptions
*/
public TraitValue getValue() {
return value;
}
/** Return if Item violates criterion
* @param Item item, item of database
* @return boolean if violates
* @exceptions Not Exceptions
*/
public boolean itemViolates( Item item ) {
boolean violationFound = true;
int type = item.getTraitDataType( this.getFieldName() );
int operator = this.getOperator();
TraitValue itemValue = item.getTraitValue( this.getFieldName() );
//--- Ugly messy code
//--- Switch statements aren't great, nested ones are a sure sign
//--that someone (like me) didn't think this through very well
//--- Better fix this once i get this out of the quick and dirty
switch( operator ) {
case OPERATOR_EQUALS:
switch( type ) {
case TraitDescriptor.TYPE_BOOLEAN:
violationFound = (! (itemValue.toBoolean() == this.value.toBoolean()) );
break;
case TraitDescriptor.TYPE_FLOAT:
violationFound = (! (itemValue.toFloat() == this.value.toFloat()) );
break;
case TraitDescriptor.TYPE_INTEGER:
violationFound = (! (itemValue.toInteger() == this.value.toInteger()) );
break;
case TraitDescriptor.TYPE_STRING:
violationFound = (! (this.value.toString().equals(itemValue.toString())) );
break;
}
break;
case OPERATOR_NOT_EQUAL:
switch( type ) {
case TraitDescriptor.TYPE_BOOLEAN:
violationFound = (! (itemValue.toBoolean() != this.value.toBoolean()) );
break;
case TraitDescriptor.TYPE_FLOAT:
violationFound = (! (itemValue.toFloat() != this.value.toFloat()) );
break;
case TraitDescriptor.TYPE_INTEGER:
violationFound = (! (itemValue.toInteger() != this.value.toInteger()) );
break;
case TraitDescriptor.TYPE_STRING:
violationFound = (this.value.toString().equals(itemValue.toString()));
break;
}
break;
case OPERATOR_GREATER_THAN:
switch( type ) {
case TraitDescriptor.TYPE_FLOAT:
violationFound = (! (itemValue.toFloat() > this.value.toFloat()) );
break;
case TraitDescriptor.TYPE_INTEGER:
violationFound = (! (itemValue.toInteger() > this.value.toInteger()) );
break;
}
break;
case OPERATOR_GREATER_THAN_OR_EQUAL:
switch( type ) {
156
Estudio para la implementación de un sistema de razonamiento basado en casos
case TraitDescriptor.TYPE_FLOAT:
violationFound = (! (itemValue.toFloat() >= this.value.toFloat()) );
break;
case TraitDescriptor.TYPE_INTEGER:
violationFound = (! (itemValue.toInteger() >= this.value.toInteger()) );
break;
}
break;
case OPERATOR_LESS_THAN:
switch( type ) {
case TraitDescriptor.TYPE_FLOAT:
violationFound = (! (itemValue.toFloat() < this.value.toFloat()) );
break;
case TraitDescriptor.TYPE_INTEGER:
violationFound = (! (itemValue.toInteger() < this.value.toInteger()) );
break;
}
break;
case OPERATOR_LESS_THAN_OR_EQUAL:
switch( type ) {
case TraitDescriptor.TYPE_FLOAT:
violationFound = (! (itemValue.toFloat() <= this.value.toFloat()) );
break;
case TraitDescriptor.TYPE_INTEGER:
violationFound = (! (itemValue.toInteger() <= this.value.toInteger()) );
break;
}
break;
} //--- switch( operator )
}
return violationFound;
//--- itemViolates
/** Return String Opertor
* @param int operator
* @return String Operator
* @exceptions Not Exceptions
*/
private String operatorToString( int operator ) {
String stringValue = null;
if (operator == OPERATOR_EQUALS) {
stringValue = "=";
} else
if (operator == OPERATOR_NOT_EQUAL) {
stringValue = "!=";
} else
if (operator == OPERATOR_GREATER_THAN) {
stringValue = ">";
} else
if (operator == OPERATOR_GREATER_THAN_OR_EQUAL) {
stringValue = ">=";
} else
if (operator == OPERATOR_LESS_THAN) {
stringValue = "<";
} else
if (operator == OPERATOR_LESS_THAN_OR_EQUAL) {
stringValue = "<=";
} //--- figure out the operator
}
return stringValue;
//--- operatorToString
/** Return intOpertor
* @param String operator
* @return int Operator
* @exceptions Not Exceptions
*/
private int stringToOperator( String operator ) {
int numericValue = OPERATOR_UNKNOWN;
if (operator.equals( "=" )) {
numericValue = OPERATOR_EQUALS;
} else
157
Estudio para la implementación de un sistema de razonamiento basado en casos
if (operator.equals( "!=" )) {
numericValue = OPERATOR_NOT_EQUAL;
} else
if (operator.equals( ">" )) {
numericValue = OPERATOR_GREATER_THAN;
} else
if (operator.equals( ">=" )) {
numericValue = OPERATOR_GREATER_THAN_OR_EQUAL;
} else
if (operator.equals( "<" )) {
numericValue = OPERATOR_LESS_THAN;
} else
if (operator.equals( "<=" )) {
numericValue = OPERATOR_LESS_THAN_OR_EQUAL;
} //--- figure out the operator
}
}
return numericValue;
//--- stringToDataType
//--- FilterCriterion
*******************************************************************************************
FilterEngine.java
*******************************************************************************************
/**
This class filter Items that violates criterion require by user,
create the collection that only contain there items
that not violate criterion.
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
*/
public class FilterEngine {
/** Return Items filtered
* @param Items items, Tems for filter
* @param FilterCriteria filterCriteria, criterions user
* @return Items filteredItems, Items filtered
* @exceptions Not Exceptions
*/
public Items filterItems( Items items, FilterCriteria filterCriteria ) {
Items filteredItems = new Items( items.getTraitDescriptors() );
Item item;
Iterator itemsCursor;
boolean var;
//--- Go through each item and see if violates any of our rules
itemsCursor = items.iterator();
while (itemsCursor.hasNext()) {
item = (Item) itemsCursor.next();
//--- Does this item violate any of our filter criteria?
var = violatesCriteria( item, filterCriteria );
//System.out.println (var);
if (!(var)) {
//--- It didn't violate any criteria so let's keep this one
//System.out.println ("adiciona a filteredItems ");
filteredItems.add( item );
}
} //--- while hasNext
return filteredItems;
158
Estudio para la implementación de un sistema de razonamiento basado en casos
}
//--- filterItems
/** Return if violated criteria user
* @param Item item, Tems for filter
* @param FilterCriteria filterCriteria, criterions user
* @return boolean, if true or false if violates
* @exceptions Not Exceptions
*/
private boolean violatesCriteria( Item item, FilterCriteria criteria ) {
Iterator listOfRules = criteria.iterator();
FilterCriterion criterion;
//--- Look through each filter rule we have to see if any of them
//--disqualify this particular item
while (listOfRules.hasNext()) {
criterion = (FilterCriterion) listOfRules.next();
if (criterion.itemViolates( item )) {
return true;
}
} //--- hasNext
//--- We won't get this far in the method unless none of the criteria
//--were matched
return false;
} //--- violatesCriteria
}
//--- FilterEngine
*******************************************************************************************
GetInfo.java
*******************************************************************************************
/**
Class GetInfo Read Metadata And Cases Of File.dat
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors Proyect: Ivan Lopez Arevalo / Aïda Valls Mateu
University: Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.io.*;
import java.util.*;
import org.ozoneDB.*;
public class GetInfo {
ArrayList list = new ArrayList();
ArrayList listMeta = new ArrayList ();
ArrayList casesTemp;
/**GetInfo
* @param String File, name of File
* @param EsternalDataBase db, Db of Ozone
* @exception Not Exceptions
*/
public GetInfo(String file,ExternalDatabase db){
extract_information(file,db);
}
/**Obtain information and generate cases in db
* @param String File, name of File
* @param EsternalDataBase db, Db of Ozone
* @exception Not Exceptions
*/
public void extract_information(String file, ExternalDatabase db){
159
Estudio para la implementación de un sistema de razonamiento basado en casos
//var
int charIn;
String fixsubstring;
String fixstring = new String("");
StringTokenizer tokens;
int entryNumber = 0;
int entryNumberCases = 0;
int entryNumberMetaInfo = 0;
String tempAttribute;
String tempNotInclude;
StringBuffer temp;
MetaInfoImpl metaInf;
CasesImpl cases;
try{
FileInputStream filesourcedesign = new FileInputStream(file);
while ((charIn=filesourcedesign.read())!=-1) fixstring +=((char)charIn);
filesourcedesign.close();
tokens = new StringTokenizer(fixstring);
while (tokens.hasMoreTokens()) { //while exist tokens
fixsubstring = new String(tokens.nextToken());
if (fixsubstring.equals("Metadata")){
// metadata Information
fixsubstring = new String(tokens.nextToken());
while (!fixsubstring.equals("@")) {
// end of metadata
tempAttribute = fixsubstring;
tempNotInclude = tempAttribute.substring(0,4);
metaInf = new MetaInfoImpl();
if (tempNotInclude.equals("Not:")){
temp = new StringBuffer(tempAttribute);
tempAttribute = String.valueOf(temp.delete(0,4));
metaInf.setName_attribute(tempAttribute);
metaInf.setIncluded(false);
}else{ // Visible Attribute
metaInf.setName_attribute(tempAttribute);
}
fixsubstring = new String(tokens.nextToken());
metaInf.setTypeName_attribute(fixsubstring);
listMeta.add(entryNumberMetaInfo,metaInf);
entryNumberMetaInfo++;
fixsubstring = new String(tokens.nextToken());
}
} else { // cases
casesTemp = new ArrayList();
System.out.println(fixsubstring);
while (!fixsubstring.equals("@")) { // end of one case
casesTemp.add(entryNumber,fixsubstring);
fixsubstring = new String(tokens.nextToken());
entryNumber++;
}
entryNumber = 0;
cases = new CasesImpl();
cases.setList(casesTemp);
list.add(entryNumberCases,cases);
160
Estudio para la implementación de un sistema de razonamiento basado en casos
entryNumberCases++;
}
}
}catch(IOException e) {
System.out.println("File-Open Error: "+file);
}
try{
// COLLECTION Cases
CasesGroup casesGroup = (CasesGroup)(db.createObject(CasesGroupImpl.class.getName(),
0,"Collection"));
Iterator itCases = this.list.iterator();
while (itCases.hasNext()) {
CasesImpl casesNew = (CasesImpl) itCases.next();
casesGroup.addCases(casesNew);
}
// METADATOS
MetaInfoGroup metaInfoGroup =
(MetaInfoGroup)(db.createObject(MetaInfoGroupImpl.class.getName(), 0,"MetaCollection"));
Iterator itMeta = this.listMeta.iterator();
while (itMeta.hasNext()) {
MetaInfoImpl metaInfoNew = (MetaInfoImpl)itMeta.next();
metaInfoGroup.addMeta(metaInfoNew);
}
} catch(Exception e){
System.out.println("Error at" + e);
}
}
} //end
*******************************************************************************************
Item.java
*******************************************************************************************
/**
This class is the reprensentation of a one case of database cases
Item is asociate with yours traitDescriptors and one Object Traits. Traits
is a collection of objects trait, each object trait is a Attribute and your
value
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import cbr.*;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
161
Estudio para la implementación de un sistema de razonamiento basado en casos
*/
public class Item {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------Traits traits = new Traits();
TraitDescriptors traitDescriptors;
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------protected Item( TraitDescriptors traitDescriptors ) {
this.traitDescriptors = traitDescriptors;
}
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/**
return datatype of Attribute
* @param String traitName, name of attribute
* @return int datatype
* @exception Not Exceptions
*/
public int getTraitDataType( String traitName ) {
TraitDescriptor traitDescriptor = traitDescriptors.get( traitName );
}
return traitDescriptor.getDataType();
//--- getTraitValue
/**
return Value of Attribute
* @param String traitName, name of attribute
* @return traitValue
* @exception Not Exceptions
*/
public TraitValue getTraitValue( String traitName ) {
Trait trait = traits.get( traitName );
}
return trait.getValue();
//--- getTraitValue
/**
Iterator
* @param not params
* @return iterator
* @exception Not Exceptions
*/
public Iterator iterator() {
return traits.iterator();
}
/**
* Assumption: good data is passed in.
* This method does not currently do any error checking like
*
making sure the number of fields matches the number of
*
| delimited items in the data
* Hey, it's prototype code, what do you expect?
*/
protected void loadFromDelimitedCase(TraitDescriptors traitDescriptors,
ArrayList caseItem ) {
try {
traits.loadFromDelimitedCase( traitDescriptors, caseItem );
}
}
} //--- try
catch (Exception e) {
e.printStackTrace();
} //--- catch
//--- loadFromDelimitedString
//--- Item
162
Estudio para la implementación de un sistema de razonamiento basado en casos
*******************************************************************************************
ItemManager.java
*******************************************************************************************
/**
This class load the items cases with your traitDescritors, Finally of the class
is create a collection of all items from data base
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.io.*;
import java.util.*;
import cbr.*;
/**
*
* @author <small>baylor</small>
*
*/
public class ItemManager {
//--- Static for performance. i don't want to have each instance
//--of this load its own data from the data source
private TraitDescriptors traitDescriptors = new TraitDescriptors();
private Items items = new Items( traitDescriptors );
CasesImpl casesNew;
/** Add Cases to collection Items
* @param ArrayList listMeta, list metacases
* @param ArrayList listCases, list cases
* @exceptions Not Exceptions
*/
public ItemManager( ArrayList listMeta, ArrayList listCases) throws Exception {
//added by Manuel Miguel Gimenez Arjona
traitDescriptors.loadTraitDescriptorOfCase(listMeta); //load traitdescriptors
Iterator itCases = listCases.iterator();
int i= 0;
while (itCases.hasNext()) {
casesNew = (CasesImpl)itCases.next();
items.add( getTraitDescriptors(), casesNew.list() );
i++;
}
}
/** getItems
* @param Not params
* @return Items
* @exceptions Not Exceptions
*/
public Items getItems() {
return items;
}
/** get TraitDescriptors
* @param Not params
* @return TraitDescriptors
* @exceptions Not Exceptions
*/
public TraitDescriptors getTraitDescriptors() {
return traitDescriptors;
}
}
*******************************************************************************************
Items.java
*******************************************************************************************
/**
This class Ítems is the object that contains one collection of objects Item.
163
Estudio para la implementación de un sistema de razonamiento basado en casos
Item is a one case of Data cases.
This collection of Items are cases of case base reasoning
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import cbr.*;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
*/
public class Items {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------ArrayList data = new ArrayList();
TraitDescriptors traitDescriptors;
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------/**
* This is the only constructor and it requires TraitDescriptors
* Technically, Items doesn't need to know anything about TraitDescriptors,
*
but a lot of the people who use Items (actually, Item) do.
*
They could create their own copy, but that would be slow, what with
*
all the loading and what not. Ditto for storing it with each Item.
*
So storing TraitDescriptors here is just a minor performance tuning thingy
*/
protected Items( TraitDescriptors traitDescriptors ) {
this.traitDescriptors = traitDescriptors;
} //--- constructor
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------protected void add( Item item ) {
data.add( item );
} //--- add
/**
This method create Item and asociate your traitDescriptors and arraylist of collection
attribute - value. Finally insert at collection Items
* @param TraitDescriptors traitDescriptors, collection description Attributes
* @param ArrayList caseItem, caseItem
* @exception Not Exceptions
*/
protected void add( TraitDescriptors traitDescriptors, ArrayList caseItem ) {
Item item = new Item( traitDescriptors );
item.loadFromDelimitedCase( traitDescriptors, caseItem );
this.add( item );
}
//--- add
/**
clone Items and return
* @param not params
* @return Object
* @exception Not Exceptions
*/
public Object clone( ) {
Items newItems = new Items( traitDescriptors );
newItems.setValues( data );
}
return (Object) newItems;
//--- clone
164
Estudio para la implementación de un sistema de razonamiento basado en casos
/**
return traitDescriptors, Attributes of case
* @param not params
* @return traitDescriptors
* @exception Not Exceptions
*/
public TraitDescriptors getTraitDescriptors() {
return traitDescriptors;
}
/**
Iterator for collection
* @param not params
* @return iterator
* @exception Not Exceptions
*/
public Iterator iterator() {
return data.iterator();
}
/**
Asociate new collection
* @param ArrayList newValues, collection of Items
* @exception Not Exceptions
*/
private void setValues( ArrayList newValues ) {
data = (ArrayList) newValues.clone();
}
/**
* Number of items in the collection
* @param not params
* @return int size, size of collection
* @exception Not Exceptions
*/
}
public int size() {
return data.size();
}
//--- Ítems
*******************************************************************************************
MetaInfo.java
*******************************************************************************************
/**
Interface used by ozone casebase for define the methods for Metainfo objects,
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneRemote;
import java.util.*;
public interface MetaInfo extends OzoneRemote {
public String name_attribute();
public void setName_attribute( String name ); /*update*/
public String typeName_attribute();
165
Estudio para la implementación de un sistema de razonamiento basado en casos
public void setTypeName_attribute( String name ); /*update*/
public boolean included();
public void setIncluded( boolean included ); /*update*/
}
*******************************************************************************************
MetaInfoGroup.java
*******************************************************************************************
**
Interface used by ozone casebase for define the methods for MetainfoGroup objects,
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneRemote;
import java.util.*;
public interface MetaInfoGroup extends OzoneRemote {
public void addMeta (MetaInfoImpl meta) throws Exception; /*update*/
public ArrayList getMeta();
public MetaInfoImpl getMeta( int key );
public MetaInfoImpl removeMeta( int key );
}
*******************************************************************************************
MetaInfoGroupImpl.java
*******************************************************************************************
/**
Class MetaInfoGroupImpl, Class contain metadata information.
This objecto contain one collection of object MetaInfoImpl
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors Proyect: Ivan Lopez Arevalo / Aïda Valls Mateu
University: Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneObject;
import java.util.*;
public class MetaInfoGroupImpl extends OzoneObject implements MetaInfoGroup {
final static long serialVersionUID = 1L;
private ArrayList meta;
private int numMetaInfo = 0;
166
Estudio para la implementación de un sistema de razonamiento basado en casos
/**MetaINfoGroupImpl
* @param Not Param
* @exception Not Exceptions
*/
public MetaInfoGroupImpl() {
meta = new ArrayList();
}
/**Add metacase at list of MetaCases collection
* @param MetaInfoImpl meta, metacase for add
* @exception Exception Error at metaInfoGroupImpl
*/
public void addMeta(MetaInfoImpl meta) throws Exception {
try{
this.meta.add( numMetaInfo, meta );// index meta Info
numMetaInfo = numMetaInfo + 1;
} catch(Exception e){
System.out.println("Error at metaInfoGroupImpl::addMeta() "+e);
}
}
/**Add metacase at list of MetaCases collection
* @param Not Params
* @return ArrayList meta, list with metaCases
* @exception Not Exception
*/
public ArrayList getMeta() {
return this.meta;
}
/**Get one metaCase of ArrayList
* @param int key, integer position of metacase
* @return MetaInfoImpl
* @exception Not Exception
*/
public MetaInfoImpl getMeta( int key ) {
return (MetaInfoImpl)this.meta.get( key );
}
/**Remove metacase of list
* @param int key, integer position of metacase
* @return MetaInfoImpl
* @exception Not Exception
*/
public MetaInfoImpl removeMeta( int key ) {
return (MetaInfoImpl)this.meta.remove( key );
}
}
*******************************************************************************************
MetaInfoImpl.java
*******************************************************************************************
**
Class save one Attribut, your datatype and if is visible or not.
167
Estudio para la implementación de un sistema de razonamiento basado en casos
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors Proyect: Ivan Lopez Arevalo / Aïda Valls Mateu
University: Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import org.ozoneDB.OzoneObject;
import java.util.*;
import java.io.*;
public class MetaInfoImpl extends OzoneObject implements MetaInfo {
final static long serialVersionUID = 1L;
private String name_attribute;
private String typeName_attribute;
private boolean included = true;
/**MetaInfoImpl
* @param Not Params
* @exception Not Exception
*/
public MetaInfoImpl() {
}
/**Return name of attribute MetaCase
* @param Not Params
* @return String name_attribute, name of Attribute
* @exception Not Exception
*/
public String name_attribute() {
return name_attribute;
}
/**Set name of Attribute
* @param String name, name of attribute
* @exception Not Exception
*/
public void setName_attribute( String name ) {
this.name_attribute = name;
}
/**Return name of attribute MetaCase
* @param Not Params
* @return String typeName_attribute, name of Attribute
* @exception Not Exception
*/
public String typeName_attribute() {
return typeName_attribute;
}
/**Set Type of Attribute
* @param String name, Type Attibute (Integer, String, boolean, float)
* @exception Not Exception
*/
public void setTypeName_attribute( String name ) {
this.typeName_attribute = name;
}
/**Return included, if is visible or not
* @param Not param
* @return Boolean included, indicates if is visible or not
* @exception Not Exception
168
Estudio para la implementación de un sistema de razonamiento basado en casos
*/
public boolean included(){
return included;
}
/**Set included
* @param Boolean included, true or false
* @exception Not Exception
*/
public void setIncluded( boolean included ) {
this.included = included;
}
}
*******************************************************************************************
OrdenacionFloat.java
*******************************************************************************************
/**
Class OrdenacionFloat
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.util.*;
public class OrdenacionFloat implements Comparator {
/** Compare two objects type Float
* @param obj1 Object for comparation
* @param obj2 Object for comparation
* @return 0 if are identic
*
<-1 if first object is smaller than second
*
>1 if first object in bigger than second
* @exception Not exceptions
*/
public int compare(Object obj1, Object obj2){
float f1 = ((Float)obj1).floatValue();
float f2 = ((Float)obj2).floatValue();
if(f1 > f2) {
return 1;
} else if (f1 < f2) {
return -1;
} else {
return 0;
}
}
}
*******************************************************************************************
OrdenacionInteger.java
*******************************************************************************************
/**
Class Ordenacioninteger
Programmer: Manuel Miguel Gimenez Arjona
169
Estudio para la implementación de un sistema de razonamiento basado en casos
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.util.*;
public class OrdenacionInteger implements Comparator {
/** Compare two objects type Integer
* @param obj1 Object for comparation
* @param obj2 Object for comparation
* @return 0 if are identic
*
<-1 if first object is smaller than second
*
>1 if first object in bigger than second
* @exception Not exceptions
*/
public int compare(Object obj1, Object obj2){
int i1 = ((Integer)obj1).intValue();
int i2 = ((Integer)obj2).intValue();
return Math.abs(i1) - Math.abs(i2);
}
}
*******************************************************************************************
OrdenacionNombre.java
*******************************************************************************************
/**
Class OrdenacionNombre
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.util.*;
public class OrdenacionNombre implements Comparator {
*
*
*
*
*
*
/** Compare two objects type String
@param obj1 Object for comparation
@param obj2 Object for comparation
@return 0 if are indentic
<-1 if first object is smaller than second
>1 if first object in bigger than second
@exception Not exceptions
*/
public int compare( Object obj1,Object obj2 ) {
String s1 = ( (String)obj1.toString());
String s2 = ( (String)obj2.toString());
return( s1.compareTo( s2 ) );
}
170
Estudio para la implementación de un sistema de razonamiento basado en casos
}
*******************************************************************************************
OZoneProgram.java
*******************************************************************************************
/**
Class Ozone Program : Create Db ozone or open to casebase
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.io.*;
import java.awt.*;
import java.util.*;
public class OzoneProgram {
/**main
*/
public static void main(String[] args) {
OzoneProgram application = new OzoneProgram();
application.run();
}
/**Run, Create main Window
* @param Not Param
* @exception Not Exceptions
*/
void run() {
int width=625, height=440; // relize
OzoneWindow mainWindow = new OzoneWindow();
Dimension sizePant=Toolkit.getDefaultToolkit().getScreenSize();
mainWindow.setLocation( (sizePant.width - width) / 2,
(sizePant.height - height) / 2);
mainWindow.setTitle("DATA BASE OZONE");
mainWindow.setResizable(false);
mainWindow.setSize(width,height);
mainWindow.show();
}
}
*******************************************************************************************
OZoneWindow.java
*******************************************************************************************
/**
Class OzeneWindow, Window for Open And create a new database Ozone
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
171
Estudio para la implementación de un sistema de razonamiento basado en casos
package cbr;
import java.io.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.border.*;
import net.sourceforge.selectionengine.SimilarityCriteria;
import net.sourceforge.selectionengine.SimilarityWeights;
import net.sourceforge.selectionengine.FilterCriteria;
import net.sourceforge.selectionengine.FilterEngine;
import net.sourceforge.selectionengine.Items;
import net.sourceforge.selectionengine.ItemManager;
import net.sourceforge.selectionengine.DataSetStatistics;
import net.sourceforge.selectionengine.SimilarItems;
import net.sourceforge.selectionengine.SimilarityEngine;
public class OzoneWindow extends JFrame{
//var
JMenuBar menuOp = new JMenuBar();
JMenu menuFile = new JMenu ("File");
JMenu menuHelp = new JMenu ("Help");
// JMenuItems
JMenuItem newCreateDb = new JMenuItem("Create DB Ozone");
JMenuItem connectionOzone = new JMenuItem("Open DB Ozone");
JMenuItem help = new JMenuItem("Help");
JMenuItem exit = new JMenuItem("Exit Program");
/**OzoneWindow
* @param Not Param
* @exception Exception printStrackTarce
*/
public OzoneWindow() {
try {
montar_Menubar(); // create menubars
ImageIcon imagen= new ImageIcon ("images/ozone.jpg");
JLabel label = new JLabel(imagen);
this.getContentPane().add(label);
}
catch(Exception e) {
e.printStackTrace();
}
}
/**Create the menubar of ozone Window
* @param Not Param
* @exception Not Exceptions
*/
public void montar_Menubar (){
// Group Menubar menuFile
menuFile.setMnemonic(KeyEvent.VK_F);
newCreateDb.setMnemonic(KeyEvent.VK_C);
menuFile.add(newCreateDb);
connectionOzone.setMnemonic(KeyEvent.VK_N);
menuFile.add(connectionOzone);
exit.setMnemonic(KeyEvent.VK_X);
menuFile.add(new JSeparator());
menuFile.add(exit);
172
Estudio para la implementación de un sistema de razonamiento basado en casos
menuHelp.add(help);
menuOp.add(menuFile);
menuOp.add(menuHelp);
// Event Help
help.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
help_actionPerformed(e);
}});
// Event Exit
exit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
exit_actionPerformed(e);
}});
//Event Close
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
exitWindow(e);
}});
//Event Create new DBozone
newCreateDb.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
newCreateDb_actionPerformed(e);
}});
// connection
connectionOzone.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
connectionOzone_actionPerformed(e);
}});
this.setJMenuBar(menuOp);
}
/**help of Aplication
* @param ActionEvent e
* @exception Not Exceptions
*/
void help_actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(this,
"CBR MODULE EXTRACTION\n" +
"*******************************\n" +
"PROGRAMMER:\n" +
"
Manuel Miguel Gimenez Arjona\n" +
"
[email protected]\n\n" +
"DIRECTORS:\n" +
"
Ivan Lopez Arevalo / Aïda Valls Mateu\n" +
"
[email protected] / [email protected]\n\n" +
"LINKS:\n" +
"
[BANZAI Research Group]
http://www.etse.urv.es/recerca/banzai\n" +
"
[Dept. Enginyeria Informatica i Matematiques]
http://www.etse.urv.es/DEIM\n" +
"
[Universitat Rovira i Virgili]
http://www.urv.net\n" +
"
[Java]
http://www.java.sun.com\n" +
"
[Selection Engine]
http://selectionengine.sourceforge.net\n"
+
"
[Ozone Project]
http://www.ozone-db.org\n",
"ABOUT CBR..", JOptionPane.PLAIN_MESSAGE);
}
/**Create a new Database of Ozone
* @param ActionEvent e
* @exception Not Exceptions
*/
void newCreateDb_actionPerformed(ActionEvent e) {
173
Estudio para la implementación de un sistema de razonamiento basado en casos
JFileChooser jFileChooser = new JFileChooser();
String path = new String();
try{
// file chosser window
if (JFileChooser.APPROVE_OPTION == jFileChooser.showSaveDialog(this)) {
path = jFileChooser.getSelectedFile().getPath();
String fileName = "iniozone" +
jFileChooser.getSelectedFile().getName() + ".bat";
File f = new File(fileName);
if ( f.exists()){ // if file.bat exist
JOptionPane.showMessageDialog( this, "Data base exist",
null, JOptionPane.ERROR_MESSAGE
);
}
else { // if file.bat not exist
FileOutputStream file = new FileOutputStream(fileName);
String createDb = new String();
createDb = "ozone -d" + path +" -c";
// create path
file.write(createDb.getBytes());
file.close();
this.setVisible(false);
this.removeAll();
String fileNameConnect = "ConectOzone" +
jFileChooser.getSelectedFile().getName() + ".bat";
FileOutputStream fileNew = new
FileOutputStream(fileNameConnect);
String conectDb = new String();
conectDb = "ozone -d" + path; // create path
fileNew.write(conectDb.getBytes());
fileNew.close();
CmdExec("libraries.bat"); // libraries run for Ozone
CmdExec(fileName);
}
}
}catch (Exception excep) {
JOptionPane.showMessageDialog( this, "Error: " + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/**Connection Database of Ozone
* @param ActionEvent e
* @exception Not Exceptions
*/
void connectionOzone_actionPerformed(ActionEvent e) {
JFileChooser jFileChooser = new JFileChooser();
String path = new String();
try{
ExampleFileFilter filter = new ExampleFileFilter();
filter.addExtension("bat");
jFileChooser.setFileFilter(filter);
174
Estudio para la implementación de un sistema de razonamiento basado en casos
if (JFileChooser.APPROVE_OPTION == jFileChooser.showOpenDialog(this)) {
String fileName = jFileChooser.getSelectedFile().getName();
this.setVisible(false);
this.removeAll();
CmdExec("libraries.bat"); // execute libraries needed
CmdExec(fileName);
// execute file.bat
}
}catch (Exception excep) {
JOptionPane.showMessageDialog( this, "Error: " + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/**Exit program
* @param ActionEvent e
* @exception Not Exceptions
*/
void exit_actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(this,"Are you sure to Exit?","Exit
Program",JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION){
System.exit(0);
}
}
/**Exit window
* @param ActionEvent e
* @exception Not Exceptions
*/
void exitWindow(WindowEvent e){
if(JOptionPane.showConfirmDialog(this,"Are you sure to Exit?",
"ExitProgram",JOptionPane.YES_NO_OPTION)
==JOptionPane.YES_OPTION){
System.exit(0);
}
}
/**Execute .bat, Code for execute file.bat
* @param String cmdline, file .bat for execute
* @exception exception printStackTrace
*/
public void CmdExec(String cmdline) {
try {
String line;
Process p = Runtime.getRuntime().exec(cmdline);
Runtime.getRuntime().gc();
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}
*******************************************************************************************
RepositoryOzone.java
*******************************************************************************************
**
175
Estudio para la implementación de un sistema de razonamiento basado en casos
Class RepositoyOzone, reload cases, open, close & save cases in casebase Ozone
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import java.io.*;
import java.util.*;
import javax.swing.*;
import org.ozoneDB.*;
public class RepositoryOzone {
ExternalDatabase db;
GetInfo InfoCases;
/**RepositoryOzone
* @param Not Param
* @exception Not Exceptions
*/
public RepositoryOzone() {
}
/**open dataBase
* @param Not Param
* @exception Exception
*/
public void open() throws Exception {
db = ExternalDatabase.openDatabase( "ozonedb:remote://localhost:3333" );
}
/**Close DataBase
* @param Not Param
* @exception Not Exceptions
*/
public void close() throws Exception {
db.close();
JOptionPane.showMessageDialog( null, "Disconect DataBase Ozone",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
/**Create Cases from File.dat
* @param Not Param
* @exception Exception, Not exist
*/
public void create() throws Exception {
try{
InfoCases = new GetInfo( "Dvd_Catalog.dat",db );
} catch(Exception e){
JOptionPane.showMessageDialog( null, "Error: Not exist File",
"Information",
JOptionPane.INFORMATION_MESSAGE );
176
Estudio para la implementación de un sistema de razonamiento basado en casos
}
}
/**Get Cases of DataBase
* @param Not Param
* @exception Exception, Not cases
*/
public ArrayList getCases(JFrame frame) throws Exception {
ArrayList listReturn = new ArrayList();
try {
CasesGroup casesGroup = (CasesGroup)(db.objectForName("Collection")); //
Object collection cases ozone
listReturn = casesGroup.getCases(); // collection of cases
} catch(Exception e){
CasesGroup casesGroup =
(CasesGroup)(db.createObject(CasesGroupImpl.class.getName(), 0,"Collection"));
JOptionPane.showMessageDialog(frame, "DataBase don't have cases",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
return listReturn;
}
/**delete Case in database Ozone
* @param int index, index of case
* @exception Exception, error
*/
public void deleteCase(int index){
CasesGroup casesGroup;
try{
casesGroup = (CasesGroup)(db.objectForName("Collection"));
casesGroup.removeCases(index); // remove case
} catch(Exception e){
JOptionPane.showMessageDialog( null, "Error:" + e,
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
/**Edit Case in database Ozone
* @param int index, index of case
* @param CasesImpl caseObtain, caseObtain for edit
* @exception Exception, error
*/
public void EditCase(int index, CasesImpl caseObtain){
CasesGroup casesGroup;
try{
casesGroup = (CasesGroup)(db.objectForName("Collection")); // object collection
casesGroup.insertCase(index, caseObtain); // edit case
} catch(Exception e){
JOptionPane.showMessageDialog( null, "Error:" + e,
"Information",
177
Estudio para la implementación de un sistema de razonamiento basado en casos
JOptionPane.INFORMATION_MESSAGE );
}
}
/**Save Case obtain in database Ozone
* @param CasesImpl caseObtain, caseObtain for insert
* @exception Exception, error
*/
public void saveCaseObtain(CasesImpl caseObtain){
CasesGroup casesGroup;
try{
casesGroup = (CasesGroup)(db.objectForName("Collection")); // object Collection
casesGroup.addCases(caseObtain);
// save case
} catch(Exception e){
casesGroup = (CasesGroup)(db.createObject(CasesGroupImpl.class.getName(),
0,"Collection"));
JOptionPane.showMessageDialog( null, "Error:" + e,
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
/**Save metadata case en data base
* @param ArrayList listMeta, list of metacases
* @exception Exception, not collection iniciated
*/
public void saveDataBase(JFrame frame, ArrayList listMeta) throws Exception {
MetaInfoGroup metaInfoGroup;
try{
metaInfoGroup = (MetaInfoGroup)(db.objectForName("MetaCollection")); //object collection
// METADATOS
db.deleteObject(metaInfoGroup); // delete
metaInfoGroup = (MetaInfoGroup)(db.createObject(MetaInfoGroupImpl.class.getName(),
0,"MetaCollection"));
Iterator itMeta = listMeta.iterator();
while (itMeta.hasNext()) { // insert
MetaInfoImpl metaInfoNew = (MetaInfoImpl)itMeta.next();
metaInfoGroup.addMeta(metaInfoNew);
}
} catch(Exception e){
//object collection of metacases
metaInfoGroup = (MetaInfoGroup)(db.createObject(MetaInfoGroupImpl.class.getName(),
0,"MetaCollection"));
Iterator itMeta = listMeta.iterator();
while (itMeta.hasNext()) { //insert
MetaInfoImpl metaInfoNew = (MetaInfoImpl)itMeta.next();
metaInfoGroup.addMeta(metaInfoNew);
178
Estudio para la implementación de un sistema de razonamiento basado en casos
}
}
}
/**Get metacases of database
* @param Not Param
* @exception Exception, Not metainformation
*/
public ArrayList getMeta(JFrame frame) throws Exception {
ArrayList listReturn = new ArrayList();
try {
//object collection of metacases
MetaInfoGroup metaInfoGroup =
(MetaInfoGroup)(db.objectForName("MetaCollection"));
listReturn = metaInfoGroup.getMeta(); // return list of metacases
} catch(Exception e){
MetaInfoGroup metaInfoGroup =
(MetaInfoGroup)(db.createObject(MetaInfoGroupImpl.class.getName(),
0,"MetaCollection"));
JOptionPane.showMessageDialog( frame, "DataBase don't have a Metadata
Information",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
return listReturn;
}
}
*******************************************************************************************
ResultsVindow.java
*******************************************************************************************
/**
Class ResultsWindow, window results similarity, This Window show the similar cases that
criterion of user in query window.
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class ResultsWindow extends JPanel implements Printable{
//var
179
Estudio para la implementación de un sistema de razonamiento basado en casos
int MAX_CASES_DISPLAYED = 30; // max cases show
JEditorPane resultsEditorPane = new JEditorPane();
JFrame frame;
String results = "null";
SimilarItems similarItemsInfo = new SimilarItems();
TraitDescriptors traitDescriptorsInfo = new TraitDescriptors();
/** ResultsWindow
* @param JFrame frameOriginal, frame main window
* @param ArrayList listView, List of metaCases
* @param SimilarItems similarItems, Class of similar items
* @param TraitDescriptors TraitDescriptors, Descritors of attributes
* @param int maxCases, integer of max cases show
* @param boolean similarity, true or false prefer serach user
* @exception Exception error in windowProve
*/
public ResultsWindow(JFrame frameOriginal, ArrayList listView, SimilarItems
similarItems, TraitDescriptors traitDescriptors, int maxCases, boolean similarity)
{//throws Exception
try{
frame = frameOriginal;
Container contentPaneDialog;
// JPanel & Butons
JPanel resultsPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JButton okButton = new JButton();
JButton cancelButton = new JButton();
JButton printButton = new JButton();
JButton saveButton = new JButton();
final JTable tableResults;
JScrollPane scrollPane;
this.similarItemsInfo = similarItems;
this.traitDescriptorsInfo = traitDescriptors;
MAX_CASES_DISPLAYED = maxCases; // max similar cases Show
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoResultsSimilarity.jpg");
JLabel labelTitle = new JLabel(imagen);
final JDialog dialog = new JDialog(frame);
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
// title of dialog
dialog.setTitle("Case-based Reasoning Module - Results");
displayResults dispResult = new displayResults(frame, listView, similarItems,
traitDescriptors, similarity);
tableResults = new JTable(dispResult); // results of similar cases
this.results = dispResult.getHtml(); // get code Html for save results
tableResults.setBackground(Color.lightGray);
// mouse listener
tableResults.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
Point p = e.getPoint();
infoTable_action(tableResults.rowAtPoint(p));
}
}
});
scrollPane = new JScrollPane(tableResults);
if (similarItems.size() <= 0){
JPanel noResultsPanel = new JPanel();
noResultsPanel.add(new JLabel("There are not similar cases. "));
noResultsPanel.add(new JLabel("The data you have entered might be
inconsistent or incorrect. "));
180
Estudio para la implementación de un sistema de razonamiento basado en casos
noResultsPanel.add(new JLabel("Try again"));
resultsPanel.add(noResultsPanel, BorderLayout.CENTER);
}else{
resultsPanel.add(scrollPane, BorderLayout.CENTER);
}
// buttons
okButton.setText("Ok");
okButton.setBounds(100,20,100,20);
okButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
saveButton.setText("Save Results");
saveButton.setBounds(100,20,100,20);
saveButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
SaveButton_actionPerformed(e);
}
});
buttonPanel.add(okButton, null);
buttonPanel.add(saveButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(okButton);
buttonPanel.add(saveButton);
//insert in dialog
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(850, 465));
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( frame, "Error: " + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/** Window iformation of one case, Show one case with all Attributes and values
* @param int row, row of table
* @exception Not Exception
*/
public void infoTable_action(int row){
WindowCasesInfo infoCases = new WindowCasesInfo(row, this.similarItemsInfo,
this.traitDescriptorsInfo);
}
/** Save Cases in file.html
* @param ActionEvent e
* @exception Exception
*/
public void SaveButton_actionPerformed( ActionEvent e ) {
JFileChooser jFileChooser = new JFileChooser();
String path = new String();
ExampleFileFilter filter = new ExampleFileFilter();
filter.addExtension("html");
jFileChooser.setFileFilter(filter);
try{
if (JFileChooser.APPROVE_OPTION == jFileChooser.showSaveDialog(this)) {
path = jFileChooser.getSelectedFile().getPath() + ".html";
FileOutputStream file = new FileOutputStream(path);
file.write(this.results.getBytes());
file.close();
JOptionPane.showMessageDialog( frame, "Save results succesful",
"Svae",
JOptionPane.INFORMATION_MESSAGE );
}
181
Estudio para la implementación de un sistema de razonamiento basado en casos
}catch (Exception excep) {
JOptionPane.showMessageDialog( frame, "Error: " + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/** Print
* @param ActionEvent evnt
* @exception Exception printStackTrace
*/
public void PrintButton_actionPerformed( ActionEvent evnt ) {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(this);
if( printJob.printDialog() ) {
try {
printJob.print();
} catch( PrinterException e ) {
e.printStackTrace();
}
}
}
/** metod aux
* @param ActionEvent e
* @exception Not Exception
*/
public int print( Graphics g,PageFormat pf,int pi ) {
if( pi >= 1 ){
return( NO_SUCH_PAGE );
}
pi = 1;
Graphics2D g2 = (Graphics2D)g;
g2.translate( pf.getImageableX(),pf.getImageableY() );
Rectangle componentBounds = this.resultsEditorPane.getBounds(null);
g2.translate(-componentBounds.x, -componentBounds.y);
g2.scale(0.5, 0.5);
this.resultsEditorPane.paint(g2);
return PAGE_EXISTS;
}
//***************************************************************************
//***************************************************************************
/**
Class DisplayResults, for create a abstractTableModel
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayResults extends AbstractTableModel{
//var
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
private int counter = 0;
private TraitDescriptor traitDescriptor;
private SimilarityDescription similarityDescription;
private int percentSimilarity, rank;
private String HTML = new String("");
private String traitName, value, align = "";
private Iterator cursor;
private Item item;
String htmlInfo;
private JFrame frame;
182
Estudio para la implementación de un sistema de razonamiento basado en casos
/** DisplayResults
* @param JFrame jframe, jframe
* @param ArrayList listView, List of metaCases
* @param SimilarItems similarItems, Class of similar items
* @param TraitDescriptors TraitDescriptors, Descritors of attributes
* @param boolean similarity, user indicate similarity prefer?
* @exception Not Exception
*/
public displayResults( JFrame frameX,ArrayList listView, SimilarItems items,
TraitDescriptors traitDescriptors, boolean similarity ){// p/Sustances
String results = "null";;
int i, j, counter, descriptorSize = traitDescriptors.size();
this.frame = frameX;
// code html is sabe in String
HTML = HTML + "<title>Results of Similar Cases</title>";
HTML = HTML + "<CENTER><font " + "face=arial" + " size=10>CBR - EXTRACTION
MODULE</font> </CENTER>";
HTML = HTML + "<CENTER><font " + "face=arial" + " size=2>Results of Similar
Cases</font> </CENTER>";
HTML = HTML + "<table border=2 align=center cellspacing=0
bordercolor=#000000>";
//--- Column headers
HTML = HTML + "<tr>";
HTML = HTML + "<th " + "align=center" + " bgcolor=#FF9900" + "><font " +
"color=#FFFFFF" + "</font>";
HTML = HTML + "Rank";
HTML = HTML + "</th>";
HTML = HTML + "<th " + "align=center" + " bgcolor=#99CC00" + "><font " +
"color=#FFFFFF" + "</font>";
HTML = HTML + "Similarity";
HTML = HTML + "</th>";
// column Names special
columnNames.add("Rank");
columnNames.add("Similarity");
for (i=0; i < descriptorSize; i++ ) { // descriptors
traitDescriptor = traitDescriptors.get( i );
traitName = traitDescriptor.getName();
if (traitDescriptor.getIncluded()== true){ // is visible attribute?
HTML = HTML + "<th " + "align=center" + " bgcolor=#0099CC" + "><font
" + "color=#FFFFFF" + "</font>";
HTML = HTML + traitName;
HTML = HTML + "</th>";
columnNames.add(traitName);
}
}
counter = 0;
int numCasesDisplayed = 1;
cursor = items.iterator();
while ( (cursor.hasNext()) && (numCasesDisplayed <= MAX_CASES_DISPLAYED) ) { //
while exist items &
Vector columns = new Vector(1,1);
//
numCasesDisplayed <= MaxCASES
similarityDescription = (SimilarityDescription) cursor.next(); // next item
Similar
percentSimilarity = (int) (100 *
similarityDescription.getPercentSimilarity()); // create %
rank = similarityDescription.getRank();
item = similarityDescription.getItem();
if (percentSimilarity != 0 || similarity == false){ //if is diferent of 0%
HTML = HTML + "<tr>";
HTML = HTML + "<td>";
HTML = HTML + rank ;
183
Estudio para la implementación de un sistema de razonamiento basado en casos
HTML = HTML + "</td>";
HTML = HTML + "<td align=center>";
HTML = HTML + percentSimilarity + " %";
HTML = HTML + "</td>";
columns.add( String.valueOf(rank) );
columns.add(percentSimilarity + " %");
Iterator itraits = listView.iterator();
for (i=0; i < descriptorSize; i++ ) { // for all Attributes of case
traitDescriptor = traitDescriptors.get( i );
traitName = traitDescriptor.getName();
align = "align=center";
//--- Let's get that trait in the current item
if (traitDescriptor.getIncluded()== true){
value = item.getTraitValue( traitName ).value();
HTML = HTML + "<td " + align + ">";
HTML = HTML + value;
HTML = HTML + "</td>";
columns.add(value);
}
}
//--- for i=0 to fields.size
HTML = HTML +
"</tr>";
//
value += " %";
columns.add(value);
data.add(columns); // add to data
counter++;
numCasesDisplayed ++;
}
} //--- while hasNext
HTML = HTML + "</table>";
results = HTML;
htmlInfo = results;
}//constructor
/** get Html
* @param not params
* @return return String, String contain Code html
* @exception Not Exception
*/
public String getHtml() {
return htmlInfo;
}
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
184
Estudio para la implementación de un sistema de razonamiento basado en casos
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
*/
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get object
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
/** is editable?
* @param EventObject evt
* @return return boolean, false is editable
* @exception Not Exception
*/
public boolean isCellEditable(EventObject evt) {
return false;
}
}
}
//--- ResultsWindow
*******************************************************************************************
SimilarItems.java
*******************************************************************************************
/**
This class save a collection of similar Items, This items are the percent similarity
bigger in all items. items are order by percent similarity
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
*/
public class SimilarItems {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------//--- Sorted list of SimilarityDescription objects
private ArrayList descriptions = new ArrayList();
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** add collection similar items
* @param SimilarityDescription descriptor, item similarity
185
Estudio para la implementación de un sistema de razonamiento basado en casos
* @exceptions Not Exceptions
*/
protected void add( SimilarityDescription descriptor ) {
descriptions.add( descriptor );
} //--- add
/** return SimilarityDescription, get bestmatch
* @param not params
* @return SimilarityDescription descriptor
* @exceptions Not Exceptions
*/
public SimilarityDescription getBestMatch( ) {
SimilarityDescription descriptor =
(SimilarityDescription) descriptions.get( 0 );
}
return descriptor;
//--- getBestMatch
/** return SimilarItems bestmatches
* @param int numberOf maches, integer Items filtered
* @return SimilarItems, SimilarItems filtererd
* @exceptions Not Exceptions
*/
public SimilarItems getBestMatches( int numberOfMatches ) {
SimilarItems subset = new SimilarItems();
if (numberOfMatches > descriptions.size()) {
numberOfMatches = descriptions.size();
}
for (int i=0; i < numberOfMatches; i++ ) {
SimilarityDescription description =
(SimilarityDescription) descriptions.get( i
);
subset.add( description );
}
}
return subset;
//--- getBestMatches
/** return SimilarItems ByPercentSimilarity
* @param float percentSimilar, percent similarity Item
* @return SimilarItems, SimilarItems filtererd
* @exceptions Not Exceptions
*/
public SimilarItems getByPercentSimilarity( float percentSimilar ) {
SimilarItems subset = new SimilarItems();
for (int i=0; i < descriptions.size(); i++ ) {
SimilarityDescription description =
(SimilarityDescription) descriptions.get( i
);
if (description.getPercentSimilarity() ==
percentSimilar) {
subset.add( description );
}
}
}
return subset;
//--- getByPercentSimilarity
/** return SimilarItems ByRank
* @param int rank, integer rank of item
* @return SimilarItems, SimilarItems filtererd
* @exceptions Not Exceptions
*/
public SimilarItems getByRank( int rank ) {
SimilarItems subset = new SimilarItems();
for (int i=0; i < descriptions.size(); i++ ) {
SimilarityDescription description =
(SimilarityDescription) descriptions.get( i
);
if (description.getRank() == rank) {
186
Estudio para la implementación de un sistema de razonamiento basado en casos
subset.add( description );
}
}
}
return subset;
//--- getByRank
/** return ByRelativeRank
* @param fint rank, integer rank of item
* @return SimilarDescrition, SimilarDescrition item
* @exceptions Not Exceptions
*/
public SimilarityDescription getByRelativeRank( int rank ) {
int index = rank - 1;
//--- 0 based array
SimilarityDescription descriptor =
(SimilarityDescription) descriptions.get( index );
}
return descriptor;
//--- getByRelativeRank
/** return SimilarItems ByThreshold
* @param float minimumPercentSimilar, min pecent similar item
* @return SimilarItems, SimilarItems filtererd
* @exceptions Not Exceptions
*/
public SimilarItems getByThreshold( float minimumPercentSimilar ) {
SimilarItems subset = new SimilarItems();
for (int i=0; i < descriptions.size(); i++ ) {
SimilarityDescription description =
(SimilarityDescription) descriptions.get( i
);
if (description.getPercentSimilarity() >=
minimumPercentSimilar) {
subset.add( description );
}
}
}
return subset;
//--- getByThreshold
/** return isEmpty
* @param not param
* @return boolean is Empty
* @exceptions Not Exceptions
*/
public boolean isEmpty() {
return false;
}
/** return iterator
* @param not param
* @return Iterator
* @exceptions Not Exceptions
*/
public Iterator iterator() {
return descriptions.iterator();
}
/** put rank Items
* @param not param
* @exceptions Not Exceptions
*/
public void rankItems() {
try {
Collections.sort( this.descriptions );
//--- Hopefully now the index is the also the sort order
//--so we'll use it for our ranking
for (int i=0; i < descriptions.size(); i++ ) {
SimilarityDescription description =
(SimilarityDescription)
descriptions.get( i );
int rank = i + 1;
187
//--- +1 to compensate
Estudio para la implementación de un sistema de razonamiento basado en casos
}
for 0-based arrays
description.setRank( rank );
//--- for i=0 to fields.size
}
catch (Exception e) {
System.out.println( "exception: " + e );
e.printStackTrace();
} //--- catch
}
//--- rankItems
/** return size collection
* @param not param
* @return int size
* @exceptions Not Exceptions
*/
public int size() {
return descriptions.size();
} //--- size
}
//--- SimilarItems
*******************************************************************************************
SimilarityCriteria.java
*******************************************************************************************
/**
This class save a collection of SimilarityCriterion objects,
This collection are all criterion similarty definited by user
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
* @author <small>baylor</small>
*/
public class SimilarityCriteria {
private ArrayList criteria = new ArrayList();
/** add to collection SimilarCriterion
* @param SimilarityCriterion criterion
* @exceptions Not Exceptions
*/
public void add( SimilarityCriterion criterion ) {
criteria.add( criterion );
} //--- add
/** add to collection SimilarCriterion
* @param String fieldName, name Attribute
* @param String operator, operator
* @param String value, Value attribute
* @exceptions Not Exceptions
*/
public void add( String fieldName, String operator, String value ) {
SimilarityCriterion criterion =
new SimilarityCriterion( fieldName, operator, value );
this.add( criterion );
} //--- add
/** Clone object
* @param not param
* @return object
* @exceptions Not Exceptions
188
Estudio para la implementación de un sistema de razonamiento basado en casos
*/
public Object clone( ) {
SimilarityCriteria newItems = new SimilarityCriteria();
newItems.setValues( criteria );
}
return (Object) newItems;
//--- clone
/** Return iterator
* @param not param
* @return Iterator
* @exceptions Not Exceptions
*/
public Iterator iterator() {
return criteria.iterator();
} //--- iterator
/** Set values new
* @param ArrayList newValues, new values
* @exceptions Not Exceptions
*/
protected void setValues( ArrayList newValues ) {
criteria = (ArrayList) newValues.clone();
} //--- setValues
/** Set integer size of array list
* @param not param
* @exceptions Not Exceptions
*/
public int size() {
return criteria.size();
} //--- size
}
//--- SimilarityCriteria
*******************************************************************************************
SimilarityCriterion.java
*******************************************************************************************
/**
This class save one criterion similarity, each criterion similarity
defined by user is one object SimilarityCriterion. This class save one attribute,
the operator special of similarity and the value of attribute
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
public class SimilarityCriterion
{
//----------------------------------------------------------------------------// Public constants
//----------------------------------------------------------------------------public static final int OPERATOR_UNKNOWN
= 0;
public static final int OPERATOR_SIMILAR
= 1;
public static final int OPERATOR_NOT_SIMILAR
= 2;
public static final int OPERATOR_AROUND
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private String
fieldName;
private int
operator;
private TraitValue value;
//----------------------------------------------------------------------------// Constructors
189
= 3;
Estudio para la implementación de un sistema de razonamiento basado en casos
//----------------------------------------------------------------------------protected SimilarityCriterion( String fieldName, String operator, String value )
{
this.fieldName = fieldName;
this.operator = stringToOperator( operator );
this.value
= new TraitValue( value );
}
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** Get Special Operator
* @param int operator. operator
* @Return string OperatorValue
* @exceptions Not Exceptions
*/
private String operatorToString( int operator )
{
String stringValue = null;
if (operator == OPERATOR_SIMILAR) {
stringValue = "%";
}
else if (operator == OPERATOR_NOT_SIMILAR) {
stringValue = "!%";
}
else if (operator == OPERATOR_AROUND) {
stringValue = "~";
} //--- figure out the operator
}
return stringValue;
//--- operatorToString
/** Get Special Operator
* @param String operator. operator
* @Return int OperatorValue
* @exceptions Not Exceptions
*/
private int stringToOperator( String operator )
{
int numericValue = OPERATOR_UNKNOWN;
if (operator.equals( "%" )) {
numericValue = OPERATOR_SIMILAR;
}
else if (operator.equals( "!%" )) {
numericValue = OPERATOR_NOT_SIMILAR;
}
else if (operator.equals( "~" )) {
numericValue = OPERATOR_AROUND;
} //--- figure out the operator
}
return numericValue;
//--- stringToDataType
//----------------------------------------------------------------------------// Accessors
//----------------------------------------------------------------------------/** Get String Attribute
* @param not params
* @Return string Attribute
* @exceptions Not Exceptions
*/
public String getFieldName()
{
return this.fieldName;
}
/** Get ID
* @param not params
* @Return string Id "[" + fieldName + "|" + getOperatorAsString() + "|" + value + "]"
* @exceptions Not Exceptions
*/
public String getID()
190
Estudio para la implementación de un sistema de razonamiento basado en casos
{
return "[" + fieldName + "|" + getOperatorAsString() + "|" + value +
"]";
}
/** Get Operator
* @param not params
* @Return Int operaror
* @exceptions Not Exceptions
*/
public int getOperator()
{
return this.operator;
}
/** Transform operator As String
* @param not params
* @Return String Operator
* @exceptions Not Exceptions
*/
public String getOperatorAsString()
{
return operatorToString( this.operator );
}
/** Get trait Value
* @param not params
* @Return Trait Value
* @exceptions Not Exceptions
*/
public TraitValue getValue()
{
return this.value;
}
}
//--- SimilarityCriterion
*******************************************************************************************
SimilarityCriterionScore.java
*******************************************************************************************
/*
This class SimilarityCriterionScore save the attribute operator and the value required by
user experience This group of objects are required in the search
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
/**
*
* @author <small>baylor</small>
*
*/
public class SimilarityCriterionScore {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private String criterionID;
private float normalizedValue;
private float weightedValue;
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------protected SimilarityCriterionScore( String criterionID ) {
setID( criterionID );
}
//-----------------------------------------------------------------------------
191
Estudio para la implementación de un sistema de razonamiento basado en casos
// Accessors
//----------------------------------------------------------------------------/** Get Normalized value
* @param Not params
* @Return float normalizedValue, value normalized
* @exceptions Not Exceptions
*/
public float getNormalizedValue() {
return normalizedValue;
}
/** Set Normalized value
* @param Float value, value normalized
* @exceptions Not Exceptions
*/
protected void setNormalizedValue( float value ) {
this.normalizedValue = value;
}
/** Get ID "[" + fieldName + "|" + getOperatorAsString() + "|" + value + "]"
* @param Not params
* @Return String CriterionID
* @exceptions Not Exceptions
*/
public String getID() {
return criterionID;
}
/** Set ID
* @param String criterionID, "[" + fieldName + "|" + getOperatorAsString() + "|" +
value + "]"
* @exceptions Not Exceptions
*/
protected void setID( String criterionID ) {
this.criterionID = criterionID;
}
/** Get weight
* @param Not params
* @Return float weightedValue, value weight
* @exceptions Not Exceptions
*/
public float getWeightedValue() {
return weightedValue;
}
/** Set Weight
* @param float value, value Weight
* @exceptions Not Exceptions
*/
protected void setWeightedValue( float value ) {
this.weightedValue = value;
}
}
//--- SimilarityCriterionScore
*******************************************************************************************
SimilarityCriterionScores.java
*******************************************************************************************
/**
This class save a one collection of objects SimilarityCriterionScore,
SimilarityCriterionScore save the attribute operator and the value required by
user. This class is applicated in require criterions
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
*/
192
Estudio para la implementación de un sistema de razonamiento basado en casos
public class SimilarityCriterionScores {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private HashMap scores = new HashMap();
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** Add SimilarityCriterionScore at HashMap
* @param SimilarityCriterionScore score, Score normalize
* @exceptions Not Exceptions
*/
public void add( SimilarityCriterionScore score ) {
this.scores.put( score.getID(), score );
} //--- add
/** get SimilarityCriterionScore
* @param String ID, "[" + fieldName + "|" + getOperatorAsString() + "|" + value + "]"
* @return SimilarityCriterionScore
* @exceptions Not Exceptions
*/
public SimilarityCriterionScore get( String ID ) {
return (SimilarityCriterionScore) scores.get( ID );
} //--- get
/** return Iterator
* @param Not param
* @return Iterator
* @exceptions Not Exceptions
*/
public Iterator iterator() {
return scores.values().iterator();
} //--- iterator
/** return Int
* @param Not param
* @return int Scores
* @exceptions Not Exceptions
*/
public int size() {
return scores.size();
} //--- size
}
*******************************************************************************************
SimilarityDescription.java
*******************************************************************************************
/**
This class compare this percent of similar items for order from bigger to smaller
percent of Items
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
/**
*
* @author <small>baylor</small>
*
*/
public class SimilarityDescription implements Comparable {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private Item itemBeingDescribed;
193
Estudio para la implementación de un sistema de razonamiento basado en casos
private int rank;
private float percentMatch;
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/**
* Implements the compareTo method required by the Comparable interface
* We're gonna compare items based on their percent similarity
* Used by SimilarItems.rankItems()
* The stupid argument name (o) is Sun's fault, not mine
*
* Return codes:
*
me > arg = -1 (better % match means we go first)
*
me = arg = 0
*
me < arg = +1 (it's a better match, it goes first)
*/
public int compareTo( Object o ) {
//--- If this fails, it'll throw a ClassCastException, which we
//--expect the idiot who pass us this argument to handle
SimilarityDescription arg = (SimilarityDescription) o;
int result = 0;
//--- default to being equal
if (this.getPercentSimilarity() < arg.getPercentSimilarity() ) {
result = 1;
}
if (this.getPercentSimilarity() > arg.getPercentSimilarity() ) {
result = -1;
}
}
return result;
//--- compareTo
//----------------------------------------------------------------------------// Accessors
//----------------------------------------------------------------------------/** Retun item
* @param Not param
* @return Item, case
* @exceptions Not Exceptions
*/
public Item getItem() {
return itemBeingDescribed;
}
/** Return Integer rank
* @param Not param
* @return Integer rank
* @exceptions Not Exceptions
*/
public int getRank() {
return rank;
}
/** Retun PercentSimilarity
* @param Not param
* @return Float Percent
* @exceptions Not Exceptions
*/
public float getPercentSimilarity() {
return percentMatch;
}
/** Set Item
* @param Item newItem, Item case
* @exceptions Not Exceptions
*/
protected void setItem( Item newItem ) {
itemBeingDescribed = newItem;
}
/** Set percent Similaruty
* @param float newPercentMatch, percent
* @exceptions Not Exceptions
194
Estudio para la implementación de un sistema de razonamiento basado en casos
*/
protected void setPercentSimilarity( float newPercentMatch ) {
percentMatch = newPercentMatch;
}
/** Set Rank
* @param int newRank, rank of item
* @exceptions Not Exceptions
*/
protected void setRank( int newRank ) {
rank = newRank;
}
}
//--- SimilarityDescription
*******************************************************************************************
SimilarityEngine.java
*******************************************************************************************
/**
This class is the most important in the proyect. It computes the similarity of a
collection
of items (cases) to a specified target case. The target case is specified by user and
user's
criterion search
The call to SimilarityEngine's main method, computeSimilarity(),takes the objects Items,
SimilarityCriteria and SimilarityWeights, that are needed for compute similarity
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
*
* @author <small>baylor</small>
*
*/
public class SimilarityEngine {
//----------------------------------------------------------------------------// Private Constants
//----------------------------------------------------------------------------private static final String MAX_VAL_INDICATOR = "[max_val]";
private static final String MIN_VAL_INDICATOR = "[min_val]";
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** Get compute Distance between Target values and Item values
* @param SimilarityCriterionScores targetValues Values of target
* @param SimilarityCriterionScores itemValues Values of item
* @return Float Distance distance between they
* @exceptions Not Exceptions
*/
private float computeDistance( SimilarityCriterionScores targetValues,
SimilarityCriterionScores itemValues ) {
float sum = 0;
Iterator targetValueList = targetValues.iterator();
while (targetValueList.hasNext()) {
//--- This is the score for one of the several criteria
SimilarityCriterionScore targetScore =
(SimilarityCriterionScore) targetValueList.next();
SimilarityCriterionScore itemScore = itemValues.get(
targetScore.getID() );
float targetValue = targetScore.getWeightedValue();
float itemValue
= itemScore.getWeightedValue();
float delta = (targetValue - itemValue);
195
Estudio para la implementación de un sistema de razonamiento basado en casos
}
float squaredDelta = (delta * delta);
sum += squaredDelta;
//--- while targetValueList.hasNext
float distance = (float) Math.sqrt( sum );
}
return distance;
//--- computeDistance (from one item to target)
/** Get compute similarity
* @param Items items, collection of items
* @param SimilarityCriteria criteria, Criterion similarity
* @param SimilarityWeights weights, weighs
* @return SimilarItems collection
* @exceptions Not Exceptions
*/
public SimilarItems computeSimilarity( Items items,
SimilarityCriteria criteria,
SimilarityWeights weights ) {
//--- Calculate the DataSetStatistics on the items passed in
//--- If we are only being passed a subset of items
//--(ex. - the items have been filtered), the stats
//--will only be calculated on the subset of items
DataSetStatistics stats = new DataSetStatistics( items );
}
return computeSimilarity( items, criteria, weights, stats );
//--- computeSimilarity, all items, no passed-in data set stats
/** Get compute similarity
* @param Items items, collection of items
* @param SimilarityCriteria criteria, Criterion similarity
* @param SimilarityWeights weights, weighs
* @param DataSetStatistics statistics
* @return SimilarItems collection
* @exceptions Not Exceptions
*/
public SimilarItems computeSimilarity( Items items,
SimilarityCriteria criteria,
SimilarityWeights weights,
DataSetStatistics statistics ) {
//--- This is the item that we want to compare ourselves to
//--to see how similar we are
SimilarityCriterionScores targetValues =
getTargetValues( items.getTraitDescriptors(),
criteria, weights, statistics );
float maxDistance = getMaxDistance( criteria, weights );
//--- Create a similarity descriptor for each item
SimilarItems similarItems = new SimilarItems();
Iterator itemList = items.iterator();
while (itemList.hasNext()) {
Item item = (Item) itemList.next();
SimilarityDescription descriptor = new
SimilarityDescription();
descriptor.setItem( item );
SimilarityCriterionScores itemValues =
normalizeValues( item, criteria, weights,
statistics );
float distance = computeDistance( targetValues,
itemValues );
float percentDifference = (distance / maxDistance);
float percentSimilarity = (1 - percentDifference);
196
Estudio para la implementación de un sistema de razonamiento basado en casos
descriptor.setPercentSimilarity( percentSimilarity );
}
similarItems.add( descriptor );
//--- itemList.hasNext()
//--- Now that we know how similar everyone is, let's go and
//--and rank them so that the caller has an easy way to sort
//--the items and so to make it easier to select the
//--k-best matches
similarItems.rankItems();
}
//--- OK, we're all done, hand the whole package back to the caller
return similarItems;
//--- computeSimilarity (multiple items)
/**
* To compute how similar two items are, we first create
*
a single-dimensional range from 0 to some max distance
*
number. We then give each item a score that falls
*
somewhere in that range
* The perfect item will score 0, meaning the difference
*
between what we're looking for and this item is nothing
* The worst possible choice will score the max distance,
*
meaning it is the opposite of everything we wanted
* We can give every item a score without knowing the max distance,
*
but we need it if we want to compute percent similarity
* To get the max distance, figure out the number of criteria
*
we were measuring to compute similarity. Multiply each
*
by its weight. Square the weights, add them all together
*
and then take the square root of that. In other words,
*
do the old Pythagorean Theorem on the weights
* For those who don't remember 9th grade geometry (thank god!)
*
the Pythagorean Theorem is that, for right triangles,
*
the length of side c is (a^2 + b^2) = c^2,
*
so the length of c = sqrt(a^2 + b^2)
*/
private float getMaxDistance( SimilarityCriteria criteria,
SimilarityWeights weights ) {
float sum = 0;
//--- Square, sum, take square root
Iterator criteriaList = criteria.iterator();
while (criteriaList.hasNext()) {
SimilarityCriterion criterion = (SimilarityCriterion)
criteriaList.next();
String fieldName = criterion.getFieldName();
float weight = weights.get( fieldName );
weight *= weight;
in Java like ^?
}
//--- Isn't there a square operator
sum += weight;
//--- criteriaList.hasNext()
float squareOfSummedDeltas = (float) Math.sqrt( sum );
}
return squareOfSummedDeltas;
//--- getMaxDistance
/** Get values of the case target
* @param TraitDescriptors traitDescriptors, descriptors of attributes
* @param SimilarityCriteria criteria, Criterion similarity
* @param SimilarityWeights weights, weighs
* @param DataSetStatistics statistics
* @return SimilarityCriterionScores normalizedValues
* @exceptions Not Exceptions
*/
private SimilarityCriterionScores getTargetValues(
TraitDescriptors traitDescriptors,
SimilarityCriteria criteria,
SimilarityWeights weights,
DataSetStatistics statistics ) {
197
Estudio para la implementación de un sistema de razonamiento basado en casos
SimilarityCriterionScores normalizedValues = new
SimilarityCriterionScores();
//--- Compute the normalized and weighted values of each trait we're
//--measuring.
//--- The normalized value will be between 0 and 1
//--where 1 means you had the max value that existed in the data
set,
//--0 means you had the minimum value and any other number is
basically
//--how close you were to the min and max
Iterator criteriaList = criteria.iterator();
while (criteriaList.hasNext()) {
SimilarityCriterion criterion = (SimilarityCriterion)
criteriaList.next();
String criterionID
= criterion.getID();
String traitName
= criterion.getFieldName();
int
traitDataType = traitDescriptors.getDataType(
traitName );
SimilarityCriterionScore score
= new SimilarityCriterionScore( criterionID );
normalizedValues.add( score );
float position = 0;
if ( (traitDataType != TraitDescriptor.TYPE_FLOAT ) &&
(traitDataType != TraitDescriptor.TYPE_INTEGER) )
{
switch( criterion.getOperator() ) {
case
SimilarityCriterion.OPERATOR_SIMILAR:
position = 1;
break;
case
SimilarityCriterion.OPERATOR_NOT_SIMILAR:
position = 0;
break;
default:
}
position = 0;
break;
//--- switch operator
}
else
{
//--- We have numbers, so we want to
calculate where this
//--trait for this item falls on the
continuum
//--from min value to max value
//--- We also want it to normalized to a
Percentage
//--format, which means a float between
0 and 1
//--- Ex. - Say we have an SAT score of
1,000
//--The max score on the SAT is 1600,
min=400
//--Our 1000 is half way between 400 and
1600
//--We'd normalize this value to 0.5
(50%) by doing
//--(score - min) / range
//--= (1000 - 400) / (1600 - 400)
//--= 600 / 1200
//--= 0.5
TraitStatistics stats = statistics.get(
traitName );
float max
= stats.getMaximumValue();
float min
= stats.getMinimumValue();
float range = stats.getRange();
//--- Although numeric data in the data set
should always be numeric,
198
Estudio para la implementación de un sistema de razonamiento basado en casos
//--in the user's query, numeric data
can also be the special
//--String keywords [MAX_VAL] or
[MIN_VAL]
TraitValue traitValue = criterion.getValue(
);
float value = 0;
if (traitValue.toString().equals(
MAX_VAL_INDICATOR )) {
value = max;
} else if (traitValue.toString().equals(
MIN_VAL_INDICATOR )) {
value = min;
} else {
value = traitValue.toFloat();
}
}
//--- 0=min value, 1=max value, in between
means % of max
position = (value - min) / range;
//--- if dataType = ...
score.setNormalizedValue( position );
}
}
float weight
= weights.get( traitName );
float weightedValue = (position * weight);
score.setWeightedValue( weightedValue );
//--- criteriaList.hasNext()
return normalizedValues;
//--- getTargetValues
/** Nomralized values
* @param Item item,
* @param SimilarityCriteria criteria, Criterion similarity
* @param SimilarityWeights weights, weighs
* @param DataSetStatistics statistics
* @return SimilarityCriterionScores normalizedValues
* @exceptions Not Exceptions
*/
private SimilarityCriterionScores normalizeValues(
Item item,
SimilarityCriteria criteria,
SimilarityWeights weights,
DataSetStatistics statistics ) {
SimilarityCriterionScores normalizedValues = new
SimilarityCriterionScores();
//--- Compute the normalized and weighted values of each trait we're
//--measuring.
//--- The normalized value will be between 0 and 1
//--where 1 means you had the max value that existed in the data
set,
//--0 means you had the minimum value and any other number is
basically
//--how close you were to the min and max
Iterator criteriaList = criteria.iterator();
while (criteriaList.hasNext()) {
SimilarityCriterion criterion = (SimilarityCriterion)
criteriaList.next();
String traitName
= criterion.getFieldName();
int
traitDataType = item.getTraitDataType( traitName
);
String criterionID
= criterion.getID();
SimilarityCriterionScore score
= new SimilarityCriterionScore( criterionID );
normalizedValues.add( score );
float position = 0;
if ( (traitDataType != TraitDescriptor.TYPE_FLOAT ) &&
(traitDataType != TraitDescriptor.TYPE_INTEGER) ) {
//--- We have a string or boolean
199
Estudio para la implementación de un sistema de razonamiento basado en casos
//--- We only do "=" on those, so see if
they're equal
String value = item.getTraitValue( traitName
).toString();
String targetValue =
criterion.getValue().toString();
if (value.equals( targetValue )) {
position = 1;
} else {
position = 0;
}
} else {
//--- We have numbers, so we want to
calculate where this
//--trait for this item falls on the
continuum
//--from min value to max value
//--- We also want it to normalized to a
percentage
//--format, which means a float between
0 and 1
//--- Ex. - Say we have an SAT score of
1,000
//--The max score on the SAT is 1600,
min=400
//--Our 1000 is half way between 400 and
1600
//--We'd normalize this value to 0.5
(50%) by doing
//--(score - min) / range
//--= (1000 - 400) / (1600 - 400)
//--= 600 / 1200
//--= 0.5
float itemValue = item.getTraitValue(
traitName ).toFloat();
TraitStatistics stats = statistics.get(
traitName );
float min
= stats.getMinimumValue();
float range = stats.getRange();
}
position = (itemValue - min) / range;
//--- if dataType = ...
score.setNormalizedValue( position );
}
}
}
float weightedValue = (position * weights.get( traitName
));
score.setWeightedValue( weightedValue );
//--- criteriaList.hasNext()
return normalizedValues;
//--- normalizeValues
//--- SimilarityEngine
*******************************************************************************************
SimilarityWeigth.java
*******************************************************************************************
/**
This clas SimilarityWeight keep a one Attribute and your Weight
selected by User
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
class SimilarityWeight
{
private String fieldName;
private Integer weight;
200
Estudio para la implementación de un sistema de razonamiento basado en casos
/** set Attribute and Weigth
* @param String Fieldname, name of attribute
* @param Integer Weight, weight of Attribute
* @exceptions Not Exceptions
*/
public SimilarityWeight( String fieldName, Integer weight )
{
this.fieldName = fieldName;
this.weight = weight;
}
/** Return Attribute
* @param String Attribute
* @exceptions Not Exceptions
*/
public String getFieldName()
{
return fieldName;
}
/** Return Weight
* @param not param
* @return integer weight
* @exceptions Not Exceptions
*/
public Integer getWeight()
{
return weight;
}
}
//--- SimilarityWeight
*******************************************************************************************
SimilarityWeigths.java
*******************************************************************************************
/**
This clas create a collection of Weights acordins Attributes search by
user and weights over Attributes
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
*
* @author <small>baylor</small>
*
*/
public class SimilarityWeights {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------protected HashMap weights = new HashMap();
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** Add HashMap Weights
* @param String fieldname, name of attribute
* @param int Weight, integer weight desire
* @exceptions Not Exceptions
*/
public void add( String fieldName, int weight ) {
//--- HashMaps require objects, no intrinsic data types
201
Estudio para la implementación de un sistema de razonamiento basado en casos
//--- So we gotta convert int to Integer to store it
Integer weightAsObject = new Integer( weight );
}
weights.put( fieldName, weightAsObject );
//--- add
/** Clone Object
* @param Not param
* @return Object hashMap
* @exceptions Not Exceptions
*/
public Object clone( ) {
SimilarityWeights newItems = new SimilarityWeights();
newItems.setValues( weights );
}
return (Object) newItems;
//--- clone
/** return Integer Value Weight from attribute
* @param String traitName
* @return integer value
* @exceptions Not Exceptions
*/
public int get( String traitName ) {
Integer value = (Integer) weights.get( traitName );
return value.intValue();
} //--- get
/** Return iterator
* @param Not param
* @return Iterator values
* @exceptions Not Exceptions
*/
public Iterator iterator() {
return weights.values().iterator();
} //--- iterator
/** Return Iterator
* @param Not param
* @return Iterator
* @exceptions Not Exceptions
*/
public Iterator mapIterator() {
return weights.entrySet().iterator();
} //--- iterator
/** setValues hashmap
* @param hashMap newVAlues
* @exceptions Not Exceptions
*/
private void setValues( HashMap newValues ) {
weights = (HashMap) newValues.clone();
} //--- setValues
/** return Size of Weights
* @param String name
* @exceptions Not Exceptions
*/
public int size() {
return weights.size();
} //--- size
}
//--- SimilarityWeights
*******************************************************************************************
Trait.java
*******************************************************************************************
/**
This class saves the attribute and its value, One case is composed by a group of
attribute - value pairs, This class saves a one pair at time.
202
Estudio para la implementación de un sistema de razonamiento basado en casos
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
/**
*
* @author <small>baylor</small>
*
*/
public class Trait {
//--- Attributes
private String name = null;
private TraitValue value = null;
/**
Set Name attribute & value
* @param String name, name Attibute
* @param String value, value Attribute
* @exception Not Exceptions
*/
protected Trait( String name, String value ) {
setName( name );
setValue( value );
} //--- constructor
/**
Return Name of Attribute
* @param Not param
* @return String Name
* @exception Not Exceptions
*/
public String getName() {
return name;
}
/**
Return Value of Attribute
* @param Not param
* @return String value
* @exception Not Exceptions
*/
public TraitValue getValue() {
return value;
}
/**
Set Name attribute
* @param String name, name Attibute
* @exception Not Exceptions
*/
protected void setName( String newName ) {
this.name = newName;
} //--- setName
/**
Set value of attribute
* @param String newValue
* @exception Not Exceptions
*/
protected void setValue( String newValue ) {
this.value = new TraitValue( newValue );
} //--- setValue
}
//--- Trait
*******************************************************************************************
TraitDescriptor.java
203
Estudio para la implementación de un sistema de razonamiento basado en casos
*******************************************************************************************
/**
This class saves the name of the attribute, the datatype of atribute.
It has been modified for accept visible attributes
*/
package net.sourceforge.selectionengine;
import java.util.*;
import java.io.*;
public class TraitDescriptor implements Serializable {
//--- Public constants
public static final int TYPE_UNKNOWN = 0;
public static final int TYPE_BOOLEAN = 1;
public static final int TYPE_FLOAT
= 2;
public static final int TYPE_INTEGER = 3;
public static final int TYPE_STRING = 4;
//----------------------------------------------------------------------------//--- Private constants
private static final String
private static final String
private static final String
private static final String
BOOLEAN_ABBREVIATION
FLOAT_ABBREVIATION
INTEGER_ABBREVIATION
STRING_ABBREVIATION
=
=
=
=
"b";
"f";
"i";
"s";
//----------------------------------------------------------------------------//--- Attributes
private String name = null;
private boolean included = false;
private int dataType = TYPE_UNKNOWN;
//----------------------------------------------------------------------------/**
Construct traitDescriptor
* @param String name, name of attribute
* @param String Type, TypeData
* @param boolean included, true or false is visible?
* @exception Not Exceptions
*/
TraitDescriptor( String name, String type, boolean included ) {
//added by Ivan Lopez-Arevalo
//this method receive two parameters para crear un TraitDescriptor
//the name (String) and the type of data (according to the constants)
//In theory it must receive only the above constants types
try {
this.name
= name;
this.included = included;
this.dataType = obtainDataType( type );
} catch (Exception e) {
String methodName = "TraitDescriptor::TraitDescriptor( Vector dataVector )";
System.out.println( methodName + " error: " + e );
}
} //--- constructor
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/**
Return DataType
* @param Not Param
* @return int datatype
* @exception Not Exceptions
*/
public int getDataType() {
return dataType;
}
204
Estudio para la implementación de un sistema de razonamiento basado en casos
/**
Return Name Attribute
* @param Not Param
* @return String name
* @exception Not Exceptions
*/
public String getName() {
return name;
}
/**
Return is visible?
* @param Not Param
* @return boolean Included, true or false is visible?
* @exception Not Exceptions
*/
public boolean getIncluded() {
return included;
}
/**
Return Numeric value
* @param String dataType
* @return int datatype
* @exception Not Exceptions
*/
private int stringToDataType( String dataType ) {
int numericValue = TYPE_UNKNOWN;
if (dataType.equals( BOOLEAN_ABBREVIATION )) {
numericValue = TYPE_BOOLEAN;
} else
if (dataType.equals( FLOAT_ABBREVIATION )) {
numericValue = TYPE_FLOAT;
} else
if (dataType.equals( INTEGER_ABBREVIATION )) {
numericValue = TYPE_INTEGER;
} else
if (dataType.equals( STRING_ABBREVIATION )) {
numericValue = TYPE_STRING;
}
//--- figure out the datatype
}
return numericValue;
//--- stringToDataType
/**
Return Numeric value
* @param String dataType
* @return int datatype
* @exception Not Exceptions
*/
private int obtainDataType( String dataType ) {
int numericValue = TYPE_UNKNOWN;
if ( dataType.equals("Boolean") ){
numericValue = TYPE_BOOLEAN;
} else
if ( dataType.equals("Float") ){
numericValue = TYPE_FLOAT;
} else
if ( dataType.equals("Integer") ){
numericValue = TYPE_INTEGER;
} else
if ( dataType.equals("String") ){
numericValue = TYPE_STRING;
}
}
//--- figure out the datatype
return numericValue;
//--- stringToDataType
public String toString( ) {
205
Estudio para la implementación de un sistema de razonamiento basado en casos
return getName();
}
}
//--- TraitDescriptor
*******************************************************************************************
TraitDescriptors.java
*******************************************************************************************
/**
This class saves a collection of TraitDescriptor objects.
A TraitDescritor object saves the name of attribute, its datatype and the
visible attribute
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import cbr.*;
import java.util.*;
public class TraitDescriptors{
//--- Should probably have the trait and trait descriptors
//--act the same for get's and iterator
ArrayList traitDescriptors = new ArrayList();
/**
add traitDescriptor to collection
* @param int index, index in collection
* @param TraitDescriptor descriptor, Descriptors of item
* @exception Not Exceptions
*/
private void add( int index, TraitDescriptor descriptor ) {
traitDescriptors.add( index, descriptor );
} //--- add
/**
is empty collection?
* @param not params
* @return boolean isEmpty
* @exception Not Exceptions
*/
public boolean isEmpty() {
return traitDescriptors.isEmpty();
}
/*
return Iterator
* @param not params
* @return Iterator collection
* @exception Not Exceptions
*/
public Iterator iterator() {
//--- Returns an iterator to an array list containing
//--TraitDescriptor objects
return traitDescriptors.iterator();
} //--- iterator
/*
return TraitDescriptor
* @param int Index, index of traitdescriptor
* @return traitDescriptor
* @exception Not Exceptions
*/
206
Estudio para la implementación de un sistema de razonamiento basado en casos
public TraitDescriptor get( int index ) {
return (TraitDescriptor) traitDescriptors.get( index );
} //--- get
/*
return TraitDescriptor
* @param String traitName, name of attribute
* @return traitDescriptor
* @exception Not Exceptions
*/
public TraitDescriptor get( String traitName ) {
TraitDescriptor matchingDescriptor = null;
Iterator cursor = traitDescriptors.iterator();
while (cursor.hasNext()) {
TraitDescriptor traitDescriptor = (TraitDescriptor)
cursor.next();
//System.out.println (traitDescriptor.getName() +" "+traitName);
if (traitDescriptor.getName().equals( traitName )) {
matchingDescriptor = traitDescriptor;
}
} //--- hasNext
}
return matchingDescriptor;
//--- getTraitDescriptor
/*
return integer Datatype
* @param String traitName, name of attribute
* @return int Datatype
* @exception Not Exceptions
*/
public int getDataType( String traitName ) {
TraitDescriptor traitDescriptor = get( traitName );
}
return traitDescriptor.getDataType();
//--- getDataType
/*
loadTraitDescriptorOfCase, keep traitdescriptors case
* @param ArrayList listMeta, list of cases
* @exception Error Exceptions
*/
protected void loadTraitDescriptorOfCase(ArrayList listMeta) {
//added by Manuel Miguel Gimenez Arjona
//this method create the TraitDescriptor collection from the properties of a Unit
object
int entryNumber = 0;
TraitDescriptor traitDescriptor;
MetaInfoImpl metaInfoNew;
try {
Iterator it = listMeta.iterator();
while (it.hasNext()) {
metaInfoNew = (MetaInfoImpl)it.next();
//
if (metaInfoNew.included() == true){
traitDescriptor = new TraitDescriptor(
metaInfoNew.name_attribute(),
metaInfoNew.typeName_attribute(),
metaInfoNew.included());
this.add( entryNumber, traitDescriptor ); entryNumber++;
//
}
}
207
Estudio para la implementación de un sistema de razonamiento basado en casos
} catch (Exception e) {
System.out.println( "Error into TraitDescriptors::loadTraitDescriptor()" + "
error: " + e );
}
}
/*
return integer size collection
* @param not param
* @return int size collection
* @exception Not Exceptions
*/
public int size() {
return traitDescriptors.size();
} //--- size
}
//--- TraitDescriptors
*******************************************************************************************
TraitPanel.java
*******************************************************************************************
/*
This class has been modified to comment the methods- Manuel Miguel Gimenez Arjona
*/
package cbr;
import java.util.*;
import javax.swing.JPanel;
import javax.swing.*;
import net.sourceforge.selectionengine.TraitDescriptor; //--- trait data types
/**
* Title:
TraitPanel
* Description: JPanel doesn't have an ActionCommand or Tag or any place
*
to store info. To be able to dynamically create
*
a UI for the PCShoppingAssistant application, i want to be
*
able to ask a panel what trait it represents. i'd also like
*
to know the button groups in it so i can extract values.
*
And knowing the data type of the trait it represents would
*
be pretty useful
* Copyright:
Copyright (c) 2001
* Company:
University of St Thomas
* @author baylor wetzel
* @version 1.0
*/
public class TraitPanel extends JPanel {
//--------------------------------------------------------------------------//--- Attributes
//--------------------------------------------------------------------------protected JCheckBox filterCheckBox = null;
protected JComboBox filterOperatorComboBox = null;
protected JComboBox filterValueComboBox = null;
protected JComboBox preferenceValueComboBox = null;
protected JCheckBox similarityCheckBox = null;
protected int traitDataType = TraitDescriptor.TYPE_UNKNOWN;
protected String traitName = "";
protected ButtonGroup valueButtonGroup = null;
protected ButtonGroup weightButtonGroup = null;
//--------------------------------------------------------------------------//--- Constructors
//--------------------------------------------------------------------------//--------------------------------------------------------------------------//--- Public Methods
208
Estudio para la implementación de un sistema de razonamiento basado en casos
//--------------------------------------------------------------------------/** Return filterCheckBox
* @param Not params
* @return JCheckBox filterCheckBox
* @exception Not Exceptions
*/
public JCheckBox getFilterCheckBox() {
return filterCheckBox;
}
/** set filterCheckBox asign JCheckBox
* @param JCheckBox filterCheckBox
* @exception Not Exceptions
*/
public void setFilterCheckBox(JCheckBox filterCheckBox) {
this.filterCheckBox = filterCheckBox;
}
/** Return JCheckBox of Similarity
* @param Not params
* @return JCheckBox similarityCheckBox
* @exception Not Exceptions
*/
public JCheckBox getSimilarityCheckBox() {
return similarityCheckBox;
}
/** Set Similarity CheckBox
* @param JCheckBox preferCheckBox
* @exception Not Exceptions
*/
public void setSimilarityCheckBox(JCheckBox preferCheckBox) {
this.similarityCheckBox = preferCheckBox;
}
/** Return name Attribute
* @param Not params
* @return String traitName name of attribute
* @exception Not Exceptions
*/
public String getTraitName() {
return traitName;
}
/** Set traitName os attribute
* @param String name name of attribute
* @exception Not Exceptions
*/
public void setTraitName(String name) {
this.traitName = name;
}
/** get Datatype of attribute
* @param Not params
* @return int traitDataType, type of attribute
* @exception Not Exceptions
*/
public int getTraitDataType() {
return traitDataType;
}
/** set TraitDataType
* @param int Datatype
* @exception Not Exceptions
*/
public void setTraitDataType(int dataType) {
this.traitDataType = dataType;
}
/** get JcomboBox
* @param Not params
* @return JComboBox filterOperatorComboBox
* @exception Not Exceptions
*/
public JComboBox getFilterOperatorComboBox() {
209
Estudio para la implementación de un sistema de razonamiento basado en casos
return filterOperatorComboBox;
}
/** set FilterOperatorComboBox
* @param JComboBox list
* @exception Not Exceptions
*/
public void setFilterOperatorComboBox(JComboBox list) {
filterOperatorComboBox = list;
}
/** get FilterOperator
* @param Not params
* @return String value value operator
* @exception Exceptions printStackTrace()
*/
public String getFilterOperator() {
String value = null;
try {
switch (traitDataType) {
case TraitDescriptor.TYPE_INTEGER:
case TraitDescriptor.TYPE_FLOAT:
case TraitDescriptor.TYPE_STRING:
JComboBox list = getFilterOperatorComboBox();
value = list.getSelectedItem().toString();
break;
case TraitDescriptor.TYPE_BOOLEAN:
value = "=";
//--- Always
break;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
return value;
//--- getFilterOperator
/** return String Valuefilter
* @param Not params
* @return String value value filter conbobox
* @exception Exceptions printStackTrace()
*/
public String getFilterValue() {
String value = null;
try {
JComboBox list = getFilterValueComboBox();
value = list.getSelectedItem().toString();
}
catch (Exception e) {
e.printStackTrace();
}
}
return value;
//--- getFilterValue
/** getFilterValueComboBox
* @param Not params
* @return JComboBox filterValueComboBox
* @exception Not Exceptions
*/
public JComboBox getFilterValueComboBox() {
return filterValueComboBox;
}
/** getFilterValueComboBox
* @param JComboBox list, list value
* @exception Not Exceptions
*/
public void setFilterValueComboBox(JComboBox list) {
filterValueComboBox = list;
210
Estudio para la implementación de un sistema de razonamiento basado en casos
}
/** getPreferenceValue
* @param Not params
* @return String value, value prefer
* @exception Exceptions printStackTrace()
*/
public String getPreferenceValue() {
String value = null;
try {
JComboBox list = getPreferenceValueComboBox();
value = list.getSelectedItem().toString();
}
catch (Exception e) {
e.printStackTrace();
}
return value;
}
//--- Only applies if the trait is numeric, not strings or booleans
/** getValueButtonGroup
* @param Not params
* @return ButtonGroup valueButtonGroup
* @exception Not exceptions
*/
public ButtonGroup getValueButtonGroup() {
return valueButtonGroup;
}
/** setValueButtonGroup
* @param ButtonGroup group
* @exception Not Exceptions
*/
public void setValueButtonGroup(ButtonGroup group) {
valueButtonGroup = group;
}
//--- Only applies if the trait is string or boolean
/** getPreferenceValueComboBox
* @param Not params
* @return JComboBox preferenceValueComboBox
* @exception Not exceptions
*/
public JComboBox getPreferenceValueComboBox() {
return preferenceValueComboBox;
}
/** setPreferenceValueComboBox
* @param JComboBox list
* @exception Not Exceptions
*/
public void setPreferenceValueComboBox(JComboBox list) {
this.preferenceValueComboBox = list;
}
/** getWeightButtonGroup
* @param Not params
* @return ButtonGroup weightButtonGroup
* @exception Not exceptions
*/
public ButtonGroup getWeightButtonGroup() {
return weightButtonGroup;
}
/** setWeightButtonGroup
* @param ButtonGroup group
* @exception Not exceptions
*/
public void setWeightButtonGroup(ButtonGroup group) {
weightButtonGroup = group;
}
211
Estudio para la implementación de un sistema de razonamiento basado en casos
/** getWeight
* @param Not params
* @return Int weight
* @exception exceptions traitpanel
*/
public int getWeight() {
int weight = 0;
try {
ButtonGroup radioButtons = getWeightButtonGroup();
String actionCommand = radioButtons.getSelection().getActionCommand().trim();
weight = Integer.parseInt(actionCommand);
}
catch (Exception e) {
//--- If we have a problem, return a weight of 0
//--- A 0 weight is like not having this criteria at all
System.out.println("TraitPanel::getWeight: " + e);
}
return weight;
}
/** return hasFilterCriteria
* @param Not params
* @return boolean hasFilterCriteria
* @exception exceptions filterCheckBox for TraitPanel not set
*/
public boolean hasFilterCriteria() {
boolean hasFilterCriteria = false;
try {
JCheckBox checkBox = getFilterCheckBox();
hasFilterCriteria = checkBox.isSelected();
}
catch (Exception e) {
System.out.println("Exception: filterCheckBox for TraitPanel not set");
}
}
return hasFilterCriteria;
//--- hasFilterCriteria
/** return hasSimilarityCriteria
* @param Not params
* @return boolean hasSimilarityCriteria
* @exception exceptions similarityCheckBox for TraitPanel not set
*/
public boolean hasSimilarityCriteria() {
boolean hasSimilarityCriteria = false;
try {
JCheckBox checkBox = getSimilarityCheckBox();
hasSimilarityCriteria = checkBox.isSelected();
}
catch (Exception e) {
System.out.println("Exception: similarityCheckBox for TraitPanel not set");
}
}
return hasSimilarityCriteria;
//--- hasSimilarityCriteria
//--------------------------------------------------------------------------//--- Protected Methods
//--------------------------------------------------------------------------}
//--- TraitPanel
*******************************************************************************************
TraitStatistics.java
*******************************************************************************************
/*
212
Estudio para la implementación de un sistema de razonamiento basado en casos
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
/**
* The TraitStatistics class contains statistical info
*
about the various values for a single, specific trait.
*
That includes the max value, min value and range
*
* This class has two primary purposes.
* First, we need this info to handle queries that use the variables
*
[MAX_VALUE] and [MIN_VALUE]
* Second, we need the min, max and range info to do the
*
nearest neighbor/similarity calculation
*
* Although this should be obvious, this class was only designed
*
to work with numbers - i don't want to compute degrees of
*
similarity on strings or booleans
* When building stats for strings and booleans, min=0 max=1
*
* It is believed that DataSetStatistics is the only class
*
that will instantiate this one. The class was designed
*
to be contained by DataSetStatistics
*
* @author <small>baylor</small>
*
*/
public class TraitStatistics {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private String traitName;
private float minimumValue;
private float maximumValue;
private int
numberOfExamples = 0;
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------public TraitStatistics( String traitName ) {
setTraitName( traitName );
}
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** Put minimum value and maximun value
* @param Float value
* @exceptions Not Exceptions
*/
public void addExample( float value ) {
if (numberOfExamples == 0) {
this.setMinimumValue( value );
this.setMaximumValue( value );
} else {
if (value < getMinimumValue()) {
this.setMinimumValue( value );
}
if (value > getMaximumValue()) {
this.setMaximumValue( value );
}
}
}
numberOfExamples++;
//--- addExample
/** return Maximun value
* @param Not Param
* @return float maximum value
213
Estudio para la implementación de un sistema de razonamiento basado en casos
* @exceptions Not Exceptions
*/
public float getMaximumValue() {
return maximumValue;
} //--- getMaximumValue
/** return minimum
* @param Not Param
* @return int , value integer
* @exceptions Not Exceptions
*/
public float getMinimumValue() {
return minimumValue;
} //--- getMinimumValue
/** return name trait
* @param Not Param
* @return String traitname, name of attribute
* @exceptions Not Exceptions
*/
public String getTraitName() {
return traitName;
} //--- getTraitName
/** return get range (maxvalue - minvalue)
* @param Not Param
* @return float range
* @exceptions Not Exceptions
*/
public float getRange() {
return (maximumValue - minimumValue);
} //--- getMinimumValue
/** set max value
* @param float value, value max
* @exceptions Not Exceptions
*/
protected void setMaximumValue( float value ) {
maximumValue = value;
} //--- setMaximumValue
/** set min value
* @param float value
* @exceptions Not Exceptions
*/
protected void setMinimumValue( float value ) {
minimumValue = value;
} //--- setMinimumValue
/** set traitname
* @param String name
* @exceptions Not Exceptions
*/
protected void setTraitName( String name ) {
traitName = name;
} //--- setTraitName
}
//--- TraitStatistics
*******************************************************************************************
TraitValue.java
*******************************************************************************************
/**
This class converts the value of attribute in its datatype format
and return it
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
public class TraitValue
214
Estudio para la implementación de un sistema de razonamiento basado en casos
{
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private String value;
//----------------------------------------------------------------------------// Constructors
//----------------------------------------------------------------------------public TraitValue( String value )
{
this.value = value;
}
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/** return integer value
* @param Not Param
* @return int , value integer
* @exceptions Not Exceptions
*/
public int toInteger ()
{
Integer integerValue = new Integer( value );
return integerValue.intValue();
} //--- toInteger
/** return Boolean value
* @param Not Param
* @return boolean , value boolean
* @exceptions Not Exceptions
*/
public boolean toBoolean ()
{
Boolean booleanValue = new Boolean( value );
return booleanValue.booleanValue();
} //--- toBoolean
/** return Float value
* @param Not Param
* @return float , value float
* @exceptions Not Exceptions
*/
public float toFloat ()
{
Float floatValue = new Float( value );
return floatValue.floatValue();
} //--- toFloat
/** return String value
* @param Not Param
* @return String , value String
* @exceptions Not Exceptions
*/
public String toString ()
{
return value;
} //--- toString
/** return String value
* @param Not Param
* @return String , value String
* @exceptions Not Exceptions
*/
public String value ()
{
return toString();
}
215
Estudio para la implementación de un sistema de razonamiento basado en casos
}
//--- TraitValue
*******************************************************************************************
Traits.java
*******************************************************************************************
/**
This class containt a collection of Trait objects, each Trait object is a pair
of attribute - value
This class has been modified to comment the methods
modified by Manuel Miguel Gimenez Arjona
*/
package net.sourceforge.selectionengine;
import java.util.*;
/**
* @author baylor
* modified by Manuel Miguel Gimenez Arjona
*/
public class Traits {
//----------------------------------------------------------------------------// Attributes
//----------------------------------------------------------------------------private HashMap traits = new HashMap();
//----------------------------------------------------------------------------// Methods
//----------------------------------------------------------------------------/**
* Insert objects Trait in hasMap for rapid accesvkey for insert is name Attribute
* @param trait newTrait, trait for insert
* @exception Not Exceptions
*/
protected void add( Trait newTrait ) {
String key = newTrait.getName();
traits.put( key, newTrait );
}
/** return object trait
* @param String traitname, Name of attribute
* @return trait
* @exception Not Exceptions
*/
public Trait get( String traitName ) {
return (Trait) traits.get( traitName );
} //--- get
/** Return boolean if Traits is Empty
* @param not params
* @return boolean is empty
* @exception Not Exceptions
*/
public boolean isEmpty() {
return traits.isEmpty();
}
/** Return iterator of values Traits
* @param Not params
* @return Iterator
* @exception Not Exceptions
*/
public Iterator iterator() {
return traits.values().iterator();
}
/**
216
Estudio para la implementación de un sistema de razonamiento basado en casos
* Load data from a string
* The string will have the data fields in the same
*
order as the array of field definitions
* The string is | delimited
*/
protected void loadFromDelimitedCase( TraitDescriptors traitDescriptors,
ArrayList caseItem ) {
try {
int fieldNumber = 0;
Iterator it = caseItem.iterator();
while (it.hasNext()) {
String key = traitDescriptors.get(fieldNumber).toString();
String value = (String)it.next();
Trait trait = new Trait( key, value );
add( trait );
fieldNumber++;
}
}
}
//--- while hasNext
} //--- try
catch (Exception e) {
e.printStackTrace();
} //--- catch
//--- loadFromDelimitedCase
//--- Traits
*******************************************************************************************
WindowCaseDelete.java
*******************************************************************************************
/**
This class displays a case to delete, show all attributes and values of a case
and confirm the deletion from casebase
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class WindowCaseDelete extends JPanel{
//var
public static final int TYPE_FLOAT
= 2;
public static final int TYPE_INTEGER = 3;
JEditorPane resultsEditorPane = new JEditorPane();
217
Estudio para la implementación de un sistema de razonamiento basado en casos
ArrayList list;
ArrayList listMeta;
JFrame frame;
int position;
Hashtable casesAcces;
String code;
CasesImpl caseObtain;
/** WindowCaseDelete
* @param JFrame frameOriginal, frame main window
* @param ArrayList listMeta, List of metaCases
* @param HashTable casesAcces, hashTable for immediate acces
* @param ArrayList list, list of cases
* @param String code, Code of case for immendiate acces
* @param CasesImpl caseObtain, case for delete
* @param RepositoryOzone ozoneRepository, OzoneRepository for delete
* @exception Exception error results
*/
public WindowCaseDelete(JFrame frameOriginal, ArrayList listMeta, Hashtable casesAcces,
ArrayList list, String code, CasesImpl caseObtain, final RepositoryOzone ozoneRepository)
{//throws Exception
try{
//var
frame = frameOriginal;
Container contentPaneDialog;
JPanel resultsPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JButton cancelButton = new JButton();
JButton printButton = new JButton();
JButton deleteButton = new JButton();
final JTable tableResults;
JScrollPane scrollPane;
this.list = list;
this.listMeta = listMeta;
this.caseObtain = caseObtain;
this.casesAcces = casesAcces;
this.code = code;
final Vector data;
// image
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoDeleteCase.jpg");
JLabel labelTitle = new JLabel(imagen);
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
final JDialog dialog = new JDialog(frame);
dialog.setTitle("Are you sure delete Case?");
// class for generate information case delete
displayDeleteNew dispResult = new displayDeleteNew(frame, listMeta, list,
caseObtain);
tableResults = new JTable(dispResult);
data = dispResult.getData();
tableResults.setBackground(Color.lightGray);
scrollPane = new JScrollPane(tableResults);
resultsPanel.add(scrollPane, BorderLayout.CENTER);
//butons
cancelButton.setText("Cancel");
cancelButton.setBounds(100,20,100,20);
cancelButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
deleteButton.setText("Delete Case");
deleteButton.setBounds(100,20,100,20);
deleteButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
deleteButton_actionPerformed(e, ozoneRepository, dialog);
}
});
buttonPanel.add(cancelButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(cancelButton);
buttonPanel.add(deleteButton, null);
218
Estudio para la implementación de un sistema de razonamiento basado en casos
buttonPanel.add(deleteButton);
//dialog inserts
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(500, 465)); // 500 - 300
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( frame, "Error" + excep,
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
/** Action boton Delete case, delete case from database
* @param ActionEvent e
* @param RepositoryOzone ozoneRepository, ozone repository
* @param JDialog dialog, dialog of window
* @exception not Exception
*/
public void deleteButton_actionPerformed( ActionEvent e, RepositoryOzone
ozoneRepository, JDialog dialog) {
if (JOptionPane.showConfirmDialog(frame,"Are you sure delete case?",
"Delete
case",JOptionPane.YES_NO_OPTION)
==
JOptionPane.YES_OPTION){
dialog.dispose();
int index = list.indexOf(caseObtain);
list.remove(list.indexOf(caseObtain)); // remove of list Cases
casesAcces.remove(code);
// remove of hash
ozoneRepository.deleteCase(index);
// remove of database ozone
JOptionPane.showMessageDialog( frame, "Delete Case Succesful",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
//***************************************************************************
//***************************************************************************
/**
Class DisplayDeletenew,for create a abstractTableModel of case delete
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayDeleteNew extends AbstractTableModel{
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
private int counter = 0;
private String traitName, value;
Vector columns;
private JFrame frame;
CasesImpl caseDelete;
ArrayList listMeta;
219
Estudio para la implementación de un sistema de razonamiento basado en casos
/** DisplayEditNew, show attributes of delete case
* @param JFrame jframe, jframe
* @param ArrayList listMeta, List of metaCases
* @param ArrayList listCases, list of cases
* @param CasesImpl caseObtain, case for delete
* @exception Not Exception
*/
public displayDeleteNew( JFrame frameX, ArrayList listMeta, ArrayList listCases,
CasesImpl caseObtain){// p/Sustances
//var
int i, j, counter;
this.frame = frameX;
this.listMeta = listMeta;
MetaInfoImpl metaInf;
//column Names
columnNames.add("ATTRIBUTE");
columnNames.add("VALUE");
columns = new Vector(1,1);
ArrayList attributesCase = caseObtain.list();
for (i=0; i < listMeta.size(); i++ ) { // all attributes of listMeta
metaInf = (MetaInfoImpl) listMeta.get(i);
traitName = metaInf.name_attribute(); // name of Attribute
columns = new Vector(1,1);
columns.add(traitName.toUpperCase());
columns.add((String)attributesCase.get(i));
data.add(columns); // Attribut and Value
}
}//constructor
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
/** get Data
* @param not params
* @return return Vector, Vector data
* @exception Not Exception
*/
public Vector getData() {
return data;
}
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
*/
220
Estudio para la implementación de un sistema de razonamiento basado en casos
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get value
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
/** Class column
* @param int c, integer row
* @return return Class, Class of position object
* @exception Not Exception
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/** is editable?
* @param int row, integer row
* @param int col, integer column
* @return return boolean, false is editable
* @exception Not Exception
*/
public boolean isCellEditable(int row, int col) {
return false;
}
}
}
*******************************************************************************************
WindowCaseEdit.java
*******************************************************************************************
/**
Class for edit cases of the casebase
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors Proyect: Ivan Lopez Arevalo / Aïda Valls Mateu
University: Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
221
Estudio para la implementación de un sistema de razonamiento basado en casos
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class WindowCaseEdit extends JPanel{
//Var
JEditorPane resultsEditorPane = new JEditorPane();
ArrayList listCases;
JFrame frame;
ArrayList listMeta;
Hashtable casesAcces;
CasesImpl caseObtain;
String code;
/** WindowCaseEdit
@param JFrame frameOriginal, JFrame main window
* @param ArrayList listMeta, List of metaCases
* @param HashTable casesAcces, hashTable for immediate acces
* @param ArrayList list, list of cases
* @param String code, Code of case for immendiate acces
* @param CasesImpl caseObtain, case for delete
* @param RepositoryOzone ozoneRepository, ozone repository
* @exception Exception error results
*/
public WindowCaseEdit(JFrame frameOriginal, ArrayList listMeta, Hashtable casesAcces,
ArrayList listCases, String code, CasesImpl caseObtain, final RepositoryOzone
ozoneRepository) {//throws Exception
try{
// var
frame = frameOriginal;
Container contentPaneDialog;
JPanel resultsPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JButton cancelButton = new JButton();
JButton printButton = new JButton();
JButton saveButton = new JButton();
final JTable tableResults;
JScrollPane scrollPane;
this.listCases = listCases;
this.listMeta = listMeta;
this.casesAcces = casesAcces;
this.caseObtain = caseObtain;
this.code = code;
final Vector data;
//image
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoEditCase.jpg");
JLabel labelTitle = new JLabel(imagen);
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
final JDialog dialog = new JDialog(frame);
//title
dialog.setTitle("Case Edit");
displayInfoEdit dispResult = new displayInfoEdit(frame, listMeta,
this.listCases, caseObtain);
tableResults = new JTable(dispResult);
data = dispResult.getData();
tableResults.setBackground(Color.lightGray);
scrollPane = new JScrollPane(tableResults);
resultsPanel.add(scrollPane, BorderLayout.CENTER);
//butons
cancelButton.setText("Cancel");
cancelButton.setBounds(100,20,100,20);
cancelButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
222
Estudio para la implementación de un sistema de razonamiento basado en casos
saveButton.setText("Save Case");
saveButton.setBounds(100,20,100,20);
saveButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
SaveButton_actionPerformed(e, data, ozoneRepository, dialog);
buttonPanel.add(cancelButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(cancelButton);
buttonPanel.add(saveButton, null);
buttonPanel.add(saveButton);
}
});
//dialog inserts
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(500, 465)); // 500 - 300
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( frame, "Error:" + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/** Action boton Save case
* @param ActionEvent e
* @param Vector Data, Data of case
* @param RepositoryOzone ozoneRepository, ozone repository
* @param JDialog dialog, dialog of window
* @exception not Exception
*/
public void SaveButton_actionPerformed( ActionEvent e, Vector data,RepositoryOzone
ozoneRepository, JDialog dialog ) {
//var
CasesImpl cases;
Iterator it = data.iterator();
ArrayList casesTemp = new ArrayList();
int entryNumber = 0;
ArrayList listTemp = new ArrayList();
String attribute;
int i = 0;
boolean error = false;
String reference = "null";
while (it.hasNext() & !error) { // while exist attributes
Vector infoCaseVector = (Vector)it.next();
if (infoCaseVector.get(1).equals("")){ // if camp value es blank
error = true;
}
else{
casesTemp.add(entryNumber,infoCaseVector.get(1));
entryNumber++;
}
}
if (!error){ // if not exist null
cases = new CasesImpl();
cases.setList(casesTemp);
int position = listCases.indexOf(caseObtain); // obtain position
listCases.remove(position);
// remove list of cases
listCases.add(position,cases);
// insert list of cases
casesAcces.remove(code);
// remove hash
casesAcces.put(code, cases );
// edit hash
ozoneRepository.EditCase(position,cases); // edit ozone database
dialog.dispose();
JOptionPane.showMessageDialog( frame, "Edit Case Succesful",
"Information",
JOptionPane.INFORMATION_MESSAGE );
223
Estudio para la implementación de un sistema de razonamiento basado en casos
}else{
JOptionPane.showMessageDialog( frame, "Error in
Parameters: Value is null",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
//***************************************************************************
//***************************************************************************
/**
Class DisplayInfoEdit, for create a abstractTableModel of case
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors Proyect: Ivan Lopez Arevalo / Aïda Valls Mateu
University: Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayInfoEdit extends AbstractTableModel{
//var
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
private String HTML = new String("");
private String traitName, value;
Vector columns;
private JFrame frame;
CasesImpl caseEdit;
ArrayList listMeta;
/** DisplayInfoEdit, show attributes of edit case
* @param JFrame jframe, jframe
* @param ArrayList listMeta, List of metaCases
* @param ArrayList listCases, list of cases
* @param CasesImpl caseObtain, case for edit
* @exception Not Exception
*/
public displayInfoEdit( JFrame frameX, ArrayList listMeta, ArrayList listCases,
CasesImpl caseObtain ){// p/Sustances
String results = "null";;
int i, j, counter;
this.frame = frameX;
MetaInfoImpl metaInf;
this.listMeta = listMeta;
columnNames.add("ATTRIBUTE");
columnNames.add("VALUE");
columnNames.add("DATA TYPE");
columns = new Vector(1,1);
ArrayList attributesCase = caseObtain.list();
for (i=0; i < listMeta.size(); i++ ) {
metaInf = (MetaInfoImpl) listMeta.get(i);
traitName = metaInf.name_attribute(); // attribute
columns = new Vector(1,1);
columns.add(traitName.toUpperCase());
columns.add((String)attributesCase.get(i));
// insert type of attribute in table model
224
Estudio para la implementación de un sistema de razonamiento basado en casos
if ( metaInf.typeName_attribute().equals("Boolean")) {
columns.add("[ Data Type BOOLEAN ]");
}else if ( metaInf.typeName_attribute().equals("Float") ) {
columns.add("[ Data Type FLOAT ]");
}else if ( metaInf.typeName_attribute().equals("Integer") ) {
columns.add("[ Data Type INTEGER ]");
}else{
columns.add("[ Data Type STRING ]");
}
data.add(columns);
}
}//constructor
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
/** get Data
* @param not params
* @return return Vector, Vector data
* @exception Not Exception
*/
public Vector getData() {
return data;
}
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
*/
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get value
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
/** Class column
* @param int c, integer row
* @return return Class, Class of position object
* @exception Not Exception
*/
225
Estudio para la implementación de un sistema de razonamiento basado en casos
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/** is editable?
* @param int row, integer row
* @param int col, integer column
* @return return boolean, true or false is editable
* @exception Not Exception
*/
public boolean isCellEditable(int row, int col) {
if (col == 1) {
if (row == 0){
return false;
}else{
return true;
}
} else {
return false;
}
}
/** Set value at table
* @param object Value, new value
* @param int row, integer row
* @param int col, integer column
* @exception Not Exception
*/
public void setValueAt(Object value, int row, int col) {
Vector column = (Vector)data.get(row);
String dataType = (String)column.get(2);
MetaInfoImpl metaInf = (MetaInfoImpl)this.listMeta.get(row);
if (metaInf.typeName_attribute().equals("Boolean")){ // is boolean?
String tempValue = (String)value;
tempValue = tempValue.toLowerCase();
if (!tempValue.equals("false") && !tempValue.equals("true")){
JOptionPane.showMessageDialog( null, "Data type Parameters: Require
Boolean - true or false",
"Error", JOptionPane.ERROR_MESSAGE );
column.add(1,"");
}else{
column.add(1,tempValue);
}
}else if (metaInf.typeName_attribute().equals("Float")){
//is float?
try{
float var = Float.parseFloat((String)value);
String varConvert = String.valueOf(var);
column.add(1,varConvert);
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog( null, "Data type
Parameters: Require Integer",
"Error", JOptionPane.ERROR_MESSAGE );
column.add(1,"");
}
}else if (metaInf.typeName_attribute().equals("Integer")){ // is integer??
try{
int var = Integer.parseInt((String)value);
column.add(1,value);
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog( null, "Data type
Parameters: Require Integer",
226
Estudio para la implementación de un sistema de razonamiento basado en casos
"Error", JOptionPane.ERROR_MESSAGE );
column.add(1,"");
}
}else{
column.add(1,value);
}
column.add(2,dataType);
}
}
}
*******************************************************************************************
WindowCaseNew.java
*******************************************************************************************
/**
Class for insert values to attributes of a empty case
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors Proyect: Ivan Lopez Arevalo / Aïda Valls Mateu
University: Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class WindowCaseNew extends JPanel{
//var
JEditorPane resultsEditorPane = new JEditorPane();
ArrayList listCases;
JFrame frame;
Hashtable casesAcces;
ArrayList listMeta;
/** WindowCaseNew
* @param JFrame frameOriginal, JFrame main window
* @param ArrayList listMeta, List of metaCases
* @param HashTable casesAcces, hashTable for immediate acces
* @param ArrayList list, list of cases
* @param RepositoryOzone ozoneRepository, Repository Ozone
* @exception Exception error results
*/
public WindowCaseNew(JFrame frameOriginal,ArrayList listMeta, Hashtable casesAcces,
ArrayList listCases, final RepositoryOzone ozoneRepository) {//throws Exception
try{
//var
frame = frameOriginal;
Container contentPaneDialog;
JPanel resultsPanel = new JPanel();
227
Estudio para la implementación de un sistema de razonamiento basado en casos
JPanel buttonPanel = new JPanel();
JButton cancelButton = new JButton();
JButton printButton = new JButton();
JButton saveButton = new JButton();
final JTable tableResults;
JScrollPane scrollPane;
this.listCases = listCases;
this.casesAcces = casesAcces;
final Vector data;
// image
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoNewCase.jpg");
JLabel labelTitle = new JLabel(imagen);
//this.traitDescriptors = traitDescriptors;
this.listMeta = listMeta;
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
final JDialog dialog = new JDialog(frame);
//title
dialog.setTitle("New Case");
displayInfoNew dispResult = new displayInfoNew(frame, this.listMeta,
this.listCases);
tableResults = new JTable(dispResult);
data = dispResult.getData();
tableResults.setBackground(Color.lightGray);
scrollPane = new JScrollPane(tableResults);
resultsPanel.add(scrollPane, BorderLayout.CENTER);
//butons
cancelButton.setText("Cancel");
cancelButton.setBounds(100,20,100,20);
cancelButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
saveButton.setText("Save Case");
saveButton.setBounds(100,20,100,20);
saveButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
SaveButton_actionPerformed(e, data, ozoneRepository, dialog);
});
buttonPanel.add(cancelButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(cancelButton);
buttonPanel.add(saveButton, null);
buttonPanel.add(saveButton);
}
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(500, 465));
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( frame, "Error:" + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/** Action boton Save case
* @param ActionEvent e
* @param Vector Data, Data of case
* @param RepositoryOzone ozoneRepository, Ozone repository
* @exception not Exception
*/
228
Estudio para la implementación de un sistema de razonamiento basado en casos
public void SaveButton_actionPerformed( ActionEvent e, Vector data, RepositoryOzone
ozoneRepository, JDialog dialog ) {
CasesImpl cases;
Iterator it = data.iterator();
ArrayList casesTemp = new ArrayList();
int entryNumber = 0;
ArrayList listTemp = new ArrayList();
String attribute;
int i = 0;
boolean error = false;
String reference = "null";
while (it.hasNext() & !error) { // while exist attributes
Vector infoCaseVector = (Vector)it.next();
if (infoCaseVector.get(1).equals("")){ // if Attribute is empty
error = true;
}
else{
if(infoCaseVector.get(0).equals("REFERENCE")){
reference = (String)infoCaseVector.get(1);
}
casesTemp.add(entryNumber,infoCaseVector.get(1));
entryNumber++;
}
}
if (!error){ // if not exist null
cases = new CasesImpl();
cases.setList(casesTemp);
this.listCases.add(this.listCases.size(),cases); // put new case in list of
cases
casesAcces.put(reference, cases );
// put new case in hash
ozoneRepository.saveCaseObtain(cases); // save case in ozone database
dialog.dispose();
JOptionPane.showMessageDialog( frame, "Insert Case Succesful",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}else{
JOptionPane.showMessageDialog( frame, "Error in
Parameters: Value is null",
"Error", JOptionPane.ERROR_MESSAGE );
}
}
//***************************************************************************
//***************************************************************************
/**
Internal class for insert values to the attributes of an empty case
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayInfoNew extends AbstractTableModel{
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
private String traitName, value;
Vector columns;
ArrayList listMeta;
229
Estudio para la implementación de un sistema de razonamiento basado en casos
private JFrame frame;
CasesImpl cases;
/** DisplayInfoNew, show attributes cases
* @param JFrame frameX, jframe
* @param ArrayList listMeta, List of metaCases
* @param ArrayList listCases, list of cases
* @exception Not Exception
*/
public displayInfoNew( JFrame frameX, ArrayList listMeta, ArrayList listCases ){//
p/Sustances
int i, j, counter;
this.frame = frameX;
this.listMeta = listMeta;
ArrayList listTemp = new ArrayList();
MetaInfoImpl metaInf;
// colum Names
columnNames.add("ATTRIBUTE");
columnNames.add("VALUE");
columnNames.add("DATA TYPE");
columns = new Vector(1,1);
for (i=0; i < listMeta.size(); i++ ) { // for all attributes of case
metaInf = (MetaInfoImpl) listMeta.get(i);
traitName = metaInf.name_attribute();
columns = new Vector(1,1);
columns.add(traitName.toUpperCase());
if ( i == 0 ){ // create refenrence
cases = new CasesImpl();
if(listCases.size() == 0){ // case reference Initial
columns.add("cbr-0001000");
}else{
// create refenrece for others cases
cases = (CasesImpl)listCases.get(listCases.size()1); // reference of last case
listTemp = cases.list();
String reference = (String)listTemp.get(0);
reference = reference.substring(4);
int var = Integer.parseInt(reference);
var = var + 1; // incremet reference
String varConvert = String.valueOf(var);
reference = "cbr-000" + varConvert;
columns.add(reference);
}
}else{
columns.add("");
}
// insert type of attributes
if ( metaInf.typeName_attribute().equals("Boolean")) {
columns.add("[ Data Type BOOLEAN ]");
}else if ( metaInf.typeName_attribute().equals("Float") ) {
columns.add("[ Data Type FLOAT ]");
}else if ( metaInf.typeName_attribute().equals("Integer") ) {
columns.add("[ Data Type INTEGER ]");
}else{
columns.add("[ Data Type STRING ]");
}
data.add(columns);
}
230
Estudio para la implementación de un sistema de razonamiento basado en casos
}//constructor
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
/** get Data
* @param not params
* @return return Vector, Vector data
* @exception Not Exception
*/
public Vector getData() {
return data;
}
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
*/
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get value
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
/** Class column
* @param int c, integer row
* @return return Class, Class of position object
* @exception Not Exception
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/** is editable?
* @param int row, integer row
* @param int col, integer column
* @return return boolean, true or false is editable
* @exception Not Exception
*/
public boolean isCellEditable(int row, int col) {
if (col == 1) {
if (row == 0){
231
Estudio para la implementación de un sistema de razonamiento basado en casos
return false;
}else{
return true;
}
} else {
return false;
}
}
/** Set value at table
* @param object Value, new value
* @param int row, integer row
* @param int col, integer column
* @exception Not Exception
*/
public void setValueAt(Object value, int row, int col) {
Vector column = (Vector)data.get(row);
String dataType = (String)column.get(2);
MetaInfoImpl metaInf = (MetaInfoImpl)this.listMeta.get(row);
if (metaInf.typeName_attribute().equals("Boolean")){
String tempValue = (String)value;
tempValue = tempValue.toLowerCase();
if (!tempValue.equals("false") && !tempValue.equals("true")){
JOptionPane.showMessageDialog( null, "Data type Parameters: Require
Boolean - true or false",
"Error", JOptionPane.ERROR_MESSAGE );
column.add(1,"");
}else{
column.add(1,tempValue);
}
}else if (metaInf.typeName_attribute().equals("Float")){
try{
float var = Float.parseFloat((String)value);
String varConvert = String.valueOf(var);
column.add(1,varConvert);
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog( null, "Data type
Parameters: Require Integer",
"Error", JOptionPane.ERROR_MESSAGE );
column.add(1,"");
}
}else if (metaInf.typeName_attribute().equals("Integer")){
try{
int var = Integer.parseInt((String)value);
column.add(1,value);
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog( null, "Data type
Parameters: Require Integer",
"Error", JOptionPane.ERROR_MESSAGE );
column.add(1,"");
}
}else{
column.add(1,value);
}
column.add(2,dataType);
}
}
}
232
Estudio para la implementación de un sistema de razonamiento basado en casos
*******************************************************************************************
WindowCaseView.java
*******************************************************************************************
/**
Class for display all the cases in the casebase
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class WindowCaseView extends JPanel{
//var
JEditorPane resultsEditorPane = new JEditorPane();
ArrayList list;
ArrayList listMeta;
int position;
Hashtable casesAcces;
String code;
/** WindowCaseView
* @param JFrame frameOriginal, frame main window
* @param ArrayList listMeta, List of metaCases
* @param ArrayList list, list of cases
* @exception Exception error results
*/
public WindowCaseView(JFrame frameOriginal, ArrayList listMeta, ArrayList list)
{//throws Exception
try{
//var
final JFrame frame = frameOriginal;
Container contentPaneDialog;
JPanel resultsPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JButton okButton = new JButton();
JButton printButton = new JButton();
final JTable tableResults;
JScrollPane scrollPane;
this.list = list;
this.listMeta = listMeta;
this.position = position;
this.casesAcces = casesAcces;
this.code = code;
final Vector data;
//image
233
Estudio para la implementación de un sistema de razonamiento basado en casos
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoNewAllCases.jpg");
JLabel labelTitle = new JLabel(imagen);
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
final JDialog dialog = new JDialog(frame);
// title
dialog.setTitle("View All cases of DataBase");
displayViewNew dispResult = new displayViewNew(frame, listMeta, list);
tableResults = new JTable(dispResult);
data = dispResult.getData();
tableResults.setBackground(Color.lightGray);
scrollPane = new JScrollPane(tableResults);
resultsPanel.add(scrollPane, BorderLayout.CENTER);
// butons
okButton.setText("ok");
okButton.setBounds(100,20,100,20);
okButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
buttonPanel.add(okButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(okButton);
//dialog inserts
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(980, 465)); // 500 - 300
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( null, "Error:" + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
//***************************************************************************
//***************************************************************************
/**
Class DisplayViewNew,for create a abstractTableModel of all Attributes of all cases
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayViewNew extends AbstractTableModel{
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
private String traitName, value;
Vector columns;
private JFrame frame;
CasesImpl caseView;
ArrayList listTemp;
String attribute;
234
Estudio para la implementación de un sistema de razonamiento basado en casos
/** DisplayViewNew, show all cases
* @param JFrame frameX, frame main window
* @param ArrayList listMeta, List of metaCases
* @param ArrayList listCases, list of cases
* @exception Not Exception
*/
public displayViewNew( JFrame frameX, ArrayList listMeta, ArrayList listCases){//
p/Sustances
String results = "null";;
int i, j, counter;
this.frame = frameX;
MetaInfoImpl metaInf;
for (i=0; i < listMeta.size(); i++ ) { // all attributes
metaInf = (MetaInfoImpl) listMeta.get(i);
traitName = metaInf.name_attribute();
columnNames.add(traitName);
}
Iterator itCases = listCases.iterator();
while (itCases.hasNext()) { // all cases
caseView = (CasesImpl)itCases.next();
listTemp = caseView.list();
Iterator it = listTemp.iterator();
Vector columns = new Vector(1,1);
while (it.hasNext()) {
attribute = (String)it.next();
columns.add(attribute);
}
data.add(columns);
}
}//constructor
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
/** get Data
235
Estudio para la implementación de un sistema de razonamiento basado en casos
* @param not params
* @return return Vector, Vector data
* @exception Not Exception
*/
public Vector getData() {
return data;
}
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
*/
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get value
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
/** Class column
* @param int c, integer row
* @return return Class, Class of position object
* @exception Not Exception
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/** is editable?
* @param int row, integer row
* @param int col, integer column
* @return return boolean, true or false is editable
* @exception Not Exception
*/
public boolean isCellEditable(int row, int col) {
return false;
}
}
}
//--- ResultsWindow
*******************************************************************************************
WindowCasesInfo.java
*******************************************************************************************
/**
Class for display all the attributes of a case
Programmer: Manuel Miguel Gimenez Arjona
236
Estudio para la implementación de un sistema de razonamiento basado en casos
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class WindowCasesInfo extends JPanel{
JEditorPane resultsEditorPane = new JEditorPane();
String results = "null";
/** WindowCasesInfo
* @param int rank, intteger rank of case
* @param SimilarItems similarItems, contain similar cases
* @param TraitDescriptors traitDescriptors, traitDescriptors of cases
* @exception Exception error results
*/
public WindowCasesInfo(int rank, SimilarItems similarItems, TraitDescriptors
traitDescriptors) {//throws Exception
try{
//Var
final JFrame frame = new JFrame();
Container contentPaneDialog;
JPanel resultsPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JButton okButton = new JButton();
JButton cancelButton = new JButton();
JButton printButton = new JButton();
JButton saveButton = new JButton();
final JTable tableResults;
JScrollPane scrollPane;
//image
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoCase.jpg");
JLabel labelTitle = new JLabel(imagen);
final JDialog dialog = new JDialog(frame);
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
//Title
dialog.setTitle("Case-based Reasoning Module - Results");
displayResultsInfo dispResult = new displayResultsInfo(frame, rank,
similarItems, traitDescriptors);
tableResults = new JTable(dispResult); // results
tableResults.setBackground(Color.lightGray);
scrollPane = new JScrollPane(tableResults);
resultsPanel.add(scrollPane, BorderLayout.CENTER);
//buttons
237
Estudio para la implementación de un sistema de razonamiento basado en casos
okButton.setText("Ok");
okButton.setBounds(100,20,100,20);
okButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
buttonPanel.add(okButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(okButton);
//dilog inserts
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(380, 465)); // 500 - 300
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( null, "Error:" + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
//***************************************************************************
//***************************************************************************
/**
Class DisplayResultsInfo,for create a abstractTableModel of all Attributes of case
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayResultsInfo extends AbstractTableModel{
//var
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
private TraitDescriptor traitDescriptor;
private SimilarityDescription similarityDescription;
private int percentSimilarity, rank;
private String traitName, value;
private Iterator cursor;
private Item item;
Vector columns;
private JFrame frame;
/** DisplayResultsInfo, show attributes cases
* @param JFrame framex, main frame
* @param int rank, integer rank
* @param SimilarItems items, similar items
* @param TraitDescriptors traitDescriptors, traitDestriptors of cases
* @exception Not Exception
*/
public displayResultsInfo( JFrame frameX, int rank, SimilarItems items,
TraitDescriptors traitDescriptors ){// p/Sustances
int i, j, counter, descriptorSize = traitDescriptors.size();
this.frame = frameX;
// Column names
columnNames.add("ATTRIBUTE");
columnNames.add("VALUE");
238
Estudio para la implementación de un sistema de razonamiento basado en casos
columns = new Vector(1,1);
cursor = items.getByRank(rank + 1).iterator();
similarityDescription = (SimilarityDescription) cursor.next();
percentSimilarity = (int) (100 * similarityDescription.getPercentSimilarity());
// similarity
item = similarityDescription.getItem();
// Attributes Special
columns.add( "RANK" );
columns.add( String.valueOf(rank + 1) );
data.add(columns);
columns = new Vector(1,1);
columns.add( "SIMILARITY" );
columns.add( percentSimilarity + " %" );
data.add(columns);
for (i=0; i < descriptorSize; i++ ) { // for All Attributes of Items
traitDescriptor = traitDescriptors.get( i );
traitName = traitDescriptor.getName(); // name Attribute
value = item.getTraitValue( traitName ).value();
columns = new Vector(1,1);
columns.add(traitName.toUpperCase());
columns.add(value);
data.add(columns);
}
}//constructor
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
*/
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get value
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
239
Estudio para la implementación de un sistema de razonamiento basado en casos
/** Class column
* @param int c, integer row
* @return return Class, Class of position object
* @exception Not Exception
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/** is editable?
* @param int row, integer row
* @param int col, integer column
* @return return boolean, true or false is editable
* @exception Not Exception
*/
public boolean isCellEditable(int row, int col) {
return false;
}
}
}
*******************************************************************************************
WindowMetaDataCase.java
*******************************************************************************************
/**
Class for create metadata cases
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
java.awt.print.*;
java.text.DecimalFormat;
java.awt.print.PrinterJob;
net.sourceforge.selectionengine.*;
javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class WindowMetaDataCase extends JPanel{
//var
JEditorPane resultsEditorPane = new JEditorPane();
ArrayList list;
JFrame frame;
240
Estudio para la implementación de un sistema de razonamiento basado en casos
int position;
Hashtable casesAcces;
String code;
int index = 0;
JPanel resultsPanel = new JPanel();
JPanel insertpanel = new JPanel();
JPanel deletePanel = new JPanel();
Vector columns;
JScrollPane scrollPane;
JTable tableResults;
JComboBox comboBox;
JComboBox comboBoxVisible;
JTextField fieldAttribute;
JTextField fielDelete;
displayMetaDataCaseNew dispResult;
ArrayList listMeta = new ArrayList ();
//JMenuItem
JMenuItem newFind;
JMenuItem viewList;
JMenuItem insertCase;
JMenuItem editCase;
JMenuItem deleteCase;
JMenuItem metaDataOpCase;
JMenuItem maxCasesView;
int numAttributes = 0;
/** WindowMetadataCase, Create window for insert metadata
* @param JFrame frameOriginal, frame main Window
* @param ArrayList listMeta, list of metacases
* @param ArrayList list, list of cases
* @param JMenuItem newFind, set true or false if create metadata
* @param JMenuItem viewList, set true or false if create metadata
* @param JMenuItem insertCase, set true or false if create metadata
* @param JMenuItem editCase. set true or false if create metadata
* @param JMenuItem deleteCase, set true or false if create metadata
* @param JMenuItem metaDataOpCase,set true or false if create metadata
* @param JMenuItem maxCasesView, set true or false if create metadata
* @exception Exception error results
*/
public WindowMetaDataCase(JFrame frameOriginal, final ArrayList listMeta, final
ArrayList list, JMenuItem newFind, JMenuItem viewList, JMenuItem insertCase, JMenuItem
editCase, JMenuItem deleteCase, JMenuItem metaDataOpCase,JMenuItem maxCasesView) {//throws
Exception
try{
frame = frameOriginal;
Container contentPaneDialog;
JPanel buttonPanel = new JPanel();
// JButtons
JButton cancelButton = new JButton();
JButton printButton = new JButton();
JButton addButton = new JButton();
JButton okButton = new JButton();
JButton deleteAttribute = new JButton();
this.newFind = newFind;
this.viewList = viewList;
this.insertCase = insertCase;
this.editCase = editCase;
this.deleteCase = deleteCase;
this.maxCasesView = maxCasesView;
this.metaDataOpCase = metaDataOpCase;
this.position = position;
this.casesAcces = casesAcces;
this.code = code;
final Vector data;
JPanel titlePanel = new JPanel();
ImageIcon imagen= new ImageIcon ("images/DibujoMetaCase.jpg");
JLabel labelTitle = new JLabel(imagen);
fieldAttribute = new JTextField();
fielDelete = new JTextField();
241
Estudio para la implementación de un sistema de razonamiento basado en casos
// Combobox
comboBox = new JComboBox();
comboBox.addItem("String");
comboBox.addItem("Integer");
comboBox.addItem("Float");
comboBox.addItem("Boolean");
comboBoxVisible = new JComboBox();
comboBoxVisible.addItem("true");
comboBoxVisible.addItem("false");
insertpanel.setLayout(new GridLayout(3,3));
insertpanel.add(new JLabel("Name Attribute : ",JLabel.LEFT));
insertpanel.add(fieldAttribute);
insertpanel.add(new JLabel("Type Attribute : ",JLabel.LEFT));
insertpanel.add(comboBox);
insertpanel.add(new JLabel("Visible Attribute : ",JLabel.LEFT));
insertpanel.add(comboBoxVisible);
deletePanel.setLayout(new GridLayout(1,3));
deletePanel.add(new JLabel("Number Attribute : ",JLabel.LEFT));
deletePanel.add(fielDelete);
deleteAttribute.setText("Delete Attribute");
deleteAttribute.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
deleteAttribute_actionPerformed(e);
}
});
deletePanel.add(deleteAttribute);
resultsPanel.setLayout(new BorderLayout());
resultsPanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
final JDialog dialog = new JDialog(frame);
dialog.setTitle("Metadata case");
tableResults = new JTable();
dispResult = new displayMetaDataCaseNew(frame);
tableResults.setModel(dispResult);
tableResults.setBackground(Color.lightGray);
scrollPane = new JScrollPane(tableResults);
resultsPanel.add(scrollPane, BorderLayout.CENTER);
resultsPanel.add(deletePanel, BorderLayout.NORTH);
resultsPanel.add(insertpanel, BorderLayout.SOUTH);
//buttons
cancelButton.setText("Cancel");
cancelButton.setBounds(100,20,100,20);
cancelButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.dispose();
}
});
addButton.setText("Add Attribute");
addButton.setBounds(100,20,100,20);
addButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
addButton_actionPerformed(e);
}
});
okButton.setText("ok");
okButton.setBounds(100,20,100,20);
okButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
okButton_actionPerformed(e, listMeta, list, dialog);
}
buttonPanel.add(cancelButton, null);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(cancelButton);
buttonPanel.add(addButton, null);
buttonPanel.add(addButton);
buttonPanel.add(okButton, null);
buttonPanel.add(okButton);
//dialog inserts
242
});
Estudio para la implementación de un sistema de razonamiento basado en casos
dialog.getContentPane().add(labelTitle,BorderLayout.NORTH);
dialog.getContentPane().add(resultsPanel, BorderLayout.CENTER);
dialog.getContentPane().add(buttonPanel,BorderLayout.SOUTH);
dialog.setSize(new Dimension(500, 465)); // 500 - 300
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}catch (Exception excep) {
JOptionPane.showMessageDialog( frame, "Error:" + excep,
"Error", JOptionPane.ERROR_MESSAGE );
}
}
/** Action Buton detele meta Attribute
* @param ActionEvent e
* @exception Not exception
*/
public void deleteAttribute_actionPerformed( ActionEvent e) {
if (fielDelete.getText().length() > 0){ // if field length > 0
if (!fielDelete.getText().equals("0")){ // if field is diferent of 0
try{
String value = fielDelete.getText();
int number = Integer.parseInt(value);
if (number <= numAttributes){ // if number is bigger that exist
dispResult.deleteFile(number); // delete
fielDelete.setText("");
numAttributes = numAttributes - 1;
}else{
JOptionPane.showMessageDialog( frame, "This number
attribute not exist",
"Error", JOptionPane.ERROR_MESSAGE );
}
// not format number
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog( frame, "Please insert
number Attribute",
"Error", JOptionPane.ERROR_MESSAGE );
}
}else{
JOptionPane.showMessageDialog( frame, "Reference attribute not
remove",
"Error", JOptionPane.ERROR_MESSAGE );
}
}else{
JOptionPane.showMessageDialog( frame, "Please insert number
Attribute",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
/** Action Buton add Attribute defined
* @param ActionEvent e
* @exception ENot exception
*/
public void addButton_actionPerformed( ActionEvent e) {
if (fieldAttribute.getText().length() > 0){
numAttributes = numAttributes + 1;
dispResult.newFile(fieldAttribute.getText(), (String)comboBox.getSelectedItem(),
243
Estudio para la implementación de un sistema de razonamiento basado en casos
(String)comboBoxVisible.getSelectedItem(),numAttributes);
fieldAttribute.setText("");
}else{ // blank
JOptionPane.showMessageDialog( frame, "Error Insert Attribute:
Attibute is null",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
/** Action Buton save metadata, list of metadata complete
* @param ActionEvent e
* @exception ENot exception
*/
public void okButton_actionPerformed( ActionEvent e, ArrayList listMeta,
ArrayList list, JDialog dialog) {
MetaInfoImpl metaInf;
Vector data = dispResult.getData();
if (dispResult.getRowCount() > 1 ){ // if exist more attributes apart of
reference
for ( int i=0; i<dispResult.getRowCount();i++ ){ // for all Attributes
Vector column = (Vector)data.get(i);
String attribute = (String)column.get(1);
String typeAttribute = (String)column.get(2);
String visible = (String)column.get(3);
metaInf = new MetaInfoImpl();
metaInf.setName_attribute(attribute);
metaInf.setTypeName_attribute(typeAttribute);
if( visible.equals("false")){
metaInf.setIncluded(false);
}
listMeta.add(i,metaInf);
// insert metadata case in list of metadata
}
newFind.setEnabled(true);
viewList.setEnabled(true);
maxCasesView.setEnabled(true);
insertCase.setEnabled(true);
editCase.setEnabled(true);
deleteCase.setEnabled(true);
metaDataOpCase.setEnabled(false);
dialog.dispose();
JOptionPane.showMessageDialog( frame, "MetaDataCase Succesful",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}else{
JOptionPane.showMessageDialog( frame, "Not insert
Attributes",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
//***************************************************************************
//***************************************************************************
/**
Class DisplayMetaDataCaseNew,for create a abstractTableModel of meta Attributes defined
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
244
Estudio para la implementación de un sistema de razonamiento basado en casos
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
class displayMetaDataCaseNew extends AbstractTableModel{
private Vector columnNames = new Vector(1,1);
private Vector data = new Vector(1,1); //rows
Vector columns;
private JFrame frame;
CasesImpl caseView;
ArrayList listTemp;
String attribute;
Vector column;
/** DisplayMetaDataCaseNew, show & Insert refence
* @param JFrame jframe, jframe
* @exception Not Exception
*/
public displayMetaDataCaseNew( JFrame frameX){
columnNames.add("NUMBER");
columnNames.add("ATTRIBUTE");
columnNames.add("DATA TYPE");
columnNames.add("VISIBLE");
columns = new Vector(1,1);
columns.add("0");
columns.add("Reference");
columns.add("String");
columns.add("false");
data.add(columns);
}//constructor
/** get colum size
* @param Not params
* @return return int, Vector size
* @exception Not Exception
*/
public int getColumnCount() {
return columnNames.size();
}
/** get data size
* @param Not params
* @return return int, data size
* @exception Not Exception
*/
public int getRowCount() {
return data.size();
}
/** get vector data
* @param Not param
* @return return Vector, vector data
* @exception Not Exception
*/
public Vector getData() {
return data;
}
/** get column Name
* @param int col, index of column
* @return return String, name of column
* @exception Not Exception
245
Estudio para la implementación de un sistema de razonamiento basado en casos
*/
public String getColumnName(int col) {
return (String)columnNames.elementAt(col);
}
/** get value
* @param int row, index of row
* @param int col, index of column
* @return return object, object that contain position
* @exception Not Exception
*/
public Object getValueAt(int row, int col) {
return ((Vector)data.elementAt(row)).elementAt(col);
}
/** Class column
* @param int c, integer row
* @return return Class, Class of position object
* @exception Not Exception
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/** is editable?
* @param int row, integer row
* @param int col, integer column
* @return return boolean, false is editable
* @exception Not Exception
*/
public boolean isCellEditable(int row, int col) {
return false;
}
/** new meta Attribute
* @param String Attribute, nome of attribute
* @param String Visible, true of false
* @param int numAttributes, integer all attributes
* @exception Not Exception
*/
public void newFile(String attribute, String dataType, String visible, int
numAttributes){
columns = new Vector(1,1);
columns.add(String.valueOf(numAttributes));
columns.add(attribute);
columns.add(dataType);
columns.add(visible);
data.add(columns);
fireTableDataChanged(); // actualizate Table
}
/** delete Attribute
* @param int file, file of table
* @return int numAttributes
* @exception Not Exception
*/
public void deleteFile(int file){
int newNumber = 0;
Vector column;
Vector newColumn;
Vector newData = new Vector(1,1);
for (int i=0; i<=numAttributes;i++ ){ // for all Attributes
if ( i != file) { // if is file delete not insert in new Data
column = (Vector)data.get(i);
246
Estudio para la implementación de un sistema de razonamiento basado en casos
String attribute = (String)column.get(1);
String typeAttribute = (String)column.get(2);
String visible = (String)column.get(3);
newColumn = new Vector(1,1);
newColumn.add(String.valueOf(newNumber));
newColumn.add(attribute);
newColumn.add(typeAttribute);
newColumn.add(visible);
newData.add(newColumn);
newNumber = newNumber + 1;
}
}
data.removeAllElements(); // remove all data
data = newData;
// new data
fireTableDataChanged(); // actualizate Table
}
}
}
//--- ResultsWindow
*******************************************************************************************
WindowProgressBarReloaded.java
*******************************************************************************************
/**
Class for display the progressbar in reloading cases
Programmer: Manuel Miguel Gimenez Arjona
Proyect:CBR Extraccion Module
Directors: Ivan Lopez Arevalo / Aïda Valls Mateu
Departament de Enginyeria Informatica i Matematiques
Universitat Rovira i Virgili
Date: 2.08.2005
*/
package cbr;
import
import
import
import
import
import
java.io.*;
java.awt.*;
java.util.*;
javax.swing.*;
java.awt.event.*;
net.sourceforge.selectionengine.*;
public class WindowProgressBarReload extends JPanel{
/** WindowprogressbarReload
* @param JFrame frameOriginal,main Frame
* @param Hashtable casesAcces, hash table for inmediat acces
* @param ArrayList list, list of cases
* @exception not exception
*/
public WindowProgressBarReload(JFrame frameOriginal, Hashtable casesAcces, ArrayList
list) {//throws Exception
// var
ArrayList listTemp = new ArrayList();
Hashtable casesHash = new Hashtable();
int number = 0;
CasesImpl casesNew;
247
Estudio para la implementación de un sistema de razonamiento basado en casos
final JFrame frame = frameOriginal;
Container contentPaneDialog;
final JDialog dialog = new JDialog(frame);
JPanel panelProgress = new JPanel();
JProgressBar progress = new JProgressBar();
JLabel label1 = new JLabel( "PROGRESS DATABASE CASES RELOAD......");
label1.setPreferredSize( new Dimension( 280, 34 ) );
JLabel label2 = new JLabel( "Number of Cases:" );
label2.setPreferredSize( new Dimension( 280, 34 ) );
// progres bar
progress.setStringPainted(true);
progress.setMinimum( 0 );
progress.setMaximum( list.size() + 1 ); // set max progress bar
progress.setValue( 0 );
progress.setBounds( 20, 35, 260, 20 );
progress.setPreferredSize( new Dimension( 280, 25 ) );
panelProgress.add(label1);
panelProgress.add(progress);
panelProgress.add(label2);
//title
dialog.setTitle("Progress");
dialog.getContentPane().add(panelProgress);
dialog.setSize(new Dimension(300, 150));
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
Iterator itCases = list.iterator();
while (itCases.hasNext()) { // while exist cases
label1.setText( "PROGRESS DATABASE CASES RELOAD..." );
Rectangle labelRect = label1.getBounds();
labelRect.x = 0;
labelRect.y = 0;
label1.paintImmediately( labelRect );
label2.setText( "NUMBER OF CASES: " + number);
Rectangle labelRect2 = label2.getBounds();
labelRect2.x = 0;
labelRect2.y = 0;
label2.paintImmediately( labelRect2 );
casesNew = (CasesImpl)itCases.next(); // next case
listTemp = casesNew.list();
String attribute = (String)listTemp.get(0);// reference
casesAcces.put(attribute, casesNew ); // insert in hash table
number = number + 1 ;
progress.setValue( number );
Rectangle progressRect =
progress.getBounds();
progressRect.x = 0;
progressRect.y = 0;
progress.paintImmediately( progressRect );
}
dialog.dispose();
JOptionPane.showMessageDialog( frame, "DataBase Reload
Complete",
"Information",
JOptionPane.INFORMATION_MESSAGE );
}
}
248