Celestino

Anuncio
Inteligencia de redes y comunicaciones
Celestino
Eduardo García Ballestero
Julio F. Borreguero Ballesteros
CELESTINO
1. Introducción
¿Cuántas de las personas que conocemos tienen pareja?, ¿cuántas tienen dificultades
para encontrarla?.......ya no es problema, hemos implementado... “el Celestino”.
El Celestino es un sistema experto que mediante una serie de preguntas al usuario le
aconseja la mujer que mejor se le adecua en el catálogo. Lo siento chicas, pero el
catálogo no incluye a chicos.
El sistema será implementado utilizando los entornos de sistemas expertos de Jess.
2. Nuestro sistema experto.
2.1 Nuestro problema.
El Celestino es un sistema experto de ayuda a encontrar la pareja ideal. Mediante una
serie de preguntas para averiguar las preferencias del usuario podremos asesorarle sobre
cuál de las mujeres de las que dispone el catálogo se adapta mejor a sus gustos.
Para clasificar a las mujeres hemos preguntado por su altura (si son altas o no), por su
color de pelo, por su edad (al ser de mala educación preguntar por la edad de una mujer,
hemos preguntado por la decena por la que rondan), si están delgadas, y por algún dato
adicional que quieran incluir (elegantes, universitarias, tímidas, hippies,....).
Las mujeres disponibles en el catálogo son las siguientes:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Elena: muy muy alta, morena, alrededor de 40 años.
Lola: alta, morena, alrededor de 40 años, tímida.
Patricia: alta, morena, alrededor de 40 años.
Sandra: alta, morena, alrededor de 30 años.
Susana: alta, morena, alrededor de 20 años.
Julia: alta, morena, alrededor de 18 años, universitaria.
Cristina: alta, morena, alrededor de 18 años.
Ana: alta, pelirroja, alrededor de 18 años.
Silvia: alta, rubia, alrededor de 30 años.
María: alta, rubia, alrededor de 20 años.
Adelaida: baja, delgadita, alrededor de 40 años.
Paloma: baja, delgadita, alrededor de 20 años.
Alicia: baja, gordita, elegante, alrededor de 40 años.
Flor: baja, gordita, hippie, alrededor de 40 años.
África: baja, gordita, hippie, alrededor de 30 años.
Lorena: baja, gordita, alrededor de 40 años.
Sonia: baja, gordita, alrededor de 30 años.
Como podemos comprobar, el catálogo es muy amplio, 17 mujeres.
2.2 Implementación del sistema Celestino.
El sistema experto Celestino se implementó buscando la sencillez. Constará únicamente
de funciones y reglas que nos permitán llegar a la elección más adecuada para el
usuario. Básicamente el sistema funciona mediante una serie de reglas por las que nos
iremos desplazando según los valores que obtengamos de las diferentes funciones.
Las reglas se podrían dividir en tres grandes grupos.:
•
Tipo: conjunto de reglas para determinar las cualidades de la mujer que más se
asemeja a las preferencias del consumidor.
•
Edad: es una única regla en la que se realizan una serie de preguntas para
determinar qué edad prefiere el usuario que tenga su pareja. Puede ser
excluyente si el tipo de mujer no admite variedad de edad. Por ejemplo, si el
usuario elige el tipo “Muy alta”, la única mujer del catálogo es Elena, y no podrá
elegir la edad que le gustaría que tuviese su pareja.
•
Elección: Una vez que sabemos las preferencias del usuario respecto a la mujer
que le gusta, mediante estas reglas le asignamos la mujer del catálogo que mejor
se ajusta. Primero comprobaremos si existe una mujer con esas características.
2.2.1 Las funciones que emplearemos.
•
Opciones
Es la encargada de preguntar al usuario sobre sus preferencias. Todas las
preguntas que hagamos al usuario sólo admiten como respuesta “sí” o “no” (“s”
o “n” por defecto), ya que el sistema experto es el encargado de guiarle sobre la
elección de la mujer.
•
Respuesta es si
Función booleana según sea la respuesta del usuario sobre una característica de
su mujer ideal.
•
Respuesta es 40,30,20,18
Conjunto de funciones booleanas según la preferencia de edad que el usuario
desea que tenga su mujer ideal.
2.2.2 Las reglas que emplearemos.
LOLA
s
¿Tímida?
n
s
PATRICIA
ELENA
s
SANDRA
s
¿Sobre los 40?
n
¿Muy muy alta?
¿Sobre los 30?
s
n
¿Sobre los 20?
¿Morena?
n
s
s
SUSANA
s
n
ANA
n
s
JULIA
¿Universitaria?
¿Pelirroja?
NO
s
n
¿Sobre los 40?
n
SILVIA
s
n
¿Sobre los 30?
¿Te gusta una chica alta?
n
CRISTINA
n
s
MARIA
¿Sobre los 20?
n
ADELAIDA
s
NO
s
¿Sobre los 40?
n
PALOMA
s
¿Sobre los 30?
n
s
¿Sobre los 20?
n
¿Delgadita?
s
s
n
NO
NO
s
¿Sobre los 30?
s
NO
ALICIA
¿Sobre los 40?
n
s
NO
n
¿Sobre los 20?
n
¿Elegante?
s
n
FLOR
s
¿Sobre los 40?
s
n
n
¿Hippie?
s
LORENA
¿Sobre los 40?
n
AFRICA
¿Sobre los 30?
n
n
NO
NO
s
¿Sobre los 20?
n
s
SONIA
n
¿Sobre los 20?
¿Sobre los 30?
NO
s
NO
n
NO
•
Inicio
Presentación de Celestino.
•
Preferencia base
Como puede verse en el árbol que acabamos de mostrar, la preferencia inicial
sobre la que se pregunta al usuario es sobre si le gustan las mujeres altas. Si le
gustan altas le preguntaremos si le gustan muy muy altas. En caso afirmativo,
como hemos explicado antes no hay más opción que Elena, y ya tendremos el
tipo asignado “Muyalta”.
•
Altura Alta
Sabemos ya que la preferencia inicial es que le gustan las mujeres altas, no muy
altas. Le preguntaremos ahora sobre el color de pelo. Y una vez escogido el
color de pelo preguntaremos sobre la edad que le gustaría que tuviese.
•
Altura Baja
Sabemos que no le gustan las mujeres altas. Le preguntaremos ahora sobre su
constitución física, acerca de si le gustan las mujeres delgaditas. En caso
afirmativo le preguntaremos sobre la edad deseada. En caso negativo
intentaremos averiguar sus preferencias sobre rasgos particulares que nos han
definido las aspirantes (elegancia, hippies,..).
•
Edad
Una vez que sabemos el tipo (estatura, color de pelo, complexión,..), se le
pregunta sobre la edad deseada en un bucle de preguntas desde los 40 años hasta
los 18.
•
Tipo-(40/30/20/18)-edad
Comprueba que la mujer ideal definida a base de elecciones de preferencias,
tiene la edad requerida en el catálogo de aspirantes.
•
Tipo-Morena-(40/30/20/18)
Según la edad de la aspirante puede preguntar sobre características especiales
para discernir entre dos aspirantes (tímida, universitaria).
•
Tipo Muyalta
La única mujer disponible en el catálogo que reúna la característica de ser muy
alta, es Elena.
•
Tipo-Rubia-(30/20)
Cuando el usuario ha elegido que no le gustan las morenas ni las pelirrojas, por
defecto ya sabemos que le gustan las rubias. Hay definidas reglas para cada edad
especificada.
•
Tipo-Delgadas-(40/20)
Cuando ya sabemos que no le gustan las mujeres altas, se le preguntó sobre si le
gustaban delgadas. En caso afirmativo tenemos las mujeres que pertenecen a
este tipo.
•
Tipo-Hippie-(40/30)
Ya sabemos que no le gustan altas, ni delgaditas, ni elegantes, por lo que le
preguntaremos si le gustan hippies. Según la edad deseada se elegirá entre las
dos aspirantes disponibles.
•
Tipo-Pelirroja
La única aspirante disponible es Ana.
•
Tipo-Normal-(40/30)
Ya sabemos que no le gustan altas, ni delgaditas, ni elegantes, ni hippies, por lo
que concluiremos que le gustan las mujeres normales. En función de la edad
deseada le asignaremos a una de las dos aspirantes disponibles en esta categoría.
•
Tipo-Elegante
La única aspirante que se define como elegante es Alicia.
•
No-existe
En caso de que no exista ninguna mujer que se adapte a sus deseos.
•
Mostrar-tipo
Muestra por pantalla el nombre de la mujer que el sistema experto le
recomienda.
•
Final
Mensaje de despedida del sistema experto en el que se ruega que se nos invite a
la boda, de gorra por supuesto.
3. Simulaciones.
Vamos a proponer varias ejecuciones del Celestino para tratar de explicar mejor su
funcionamiento. Le cuestionaremos sobre unas determinadas preferencias para que nos
aconseje la mujer del catálogo que mejor se adapta a nuestra idea de pareja ideal.
3.1 Primer caso.
Al comenzar nuestro programa, lo primero que intentamos es averiguar la altura de
mujer ideal; para ello preguntamos primero que si nos gustan las chicas altas, en caso de
decir que si, nos vuelve a preguntar que si nos gustan muy altas. En caso de decir que
no, ya conocemos grosso modo la altura de la mujer a buscar, con lo que pasamos a otro
tipo de preguntas para averiguar el color del pelo.
Preguntamos ahora que si le gustan morenas, en caso afirmativo, preguntamos sobre la
edad, comenzando por los 40 años, y si obtenemos de nuevo una repuesta afirmativa,
preguntamos si le gustan tímidas. Si la respuesta es si, mostramos como elección final a
Lola.
Mostramos en la siguiente ilustración el proceso exacto de preguntas que seguiría
nuestro programa:
3.2 Segundo Caso.
Análogamente al ejemplo anterior, y en función de las respuestas que vayamos dando,
los resultados son diferentes. Si ahora nos gustan las chicas altas, rubias y de unos 30
años, la elección que hace nuestro programa es Silvia.
El proceso exacto de preguntas y respuestas se observa en la siguiente ilustración:
3.3 Tercer Caso.
Si preferimos las chicas bajas, delgadas y de unos 20 años, la nuestra elección es
Paloma, tal y como podemos apreciar en la siguiente ilustración:
3.4 Cuarto caso.
Como última simulación, mostramos la elección realizada cuando preferimos una chica
hippie de unos 30 años. Como siempre, mostramos una ilustración con el proceso de
preguntas realizado para llegar a la elección final.
4. Nuestro código fuente.
;;;======================================================
;;;
Sistema experto de Jess
;;;
(Java Expert System Shell)
;;;
;;;
CELESTINO:
;;;
encuentra tu pareja ideal
;;;======================================================
;;* Definimos las funciones necesarias *
;;*****************************************
(deffunction opciones (?opcion)
(printout t ?opcion)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))
)
?respuesta
)
(do-backward-chaining opciones)
(deffunction respuesta-es-si (?opcion)
(bind ?respuesta (opciones ?opcion))
(if (eq ?respuesta "s")
then
TRUE
else
FALSE
)
)
(do-backward-chaining respuesta-es-si)
(deffunction respuesta-es-40 (?opcion)
(bind ?respuesta (opciones ?opcion))
(if (eq ?respuesta "40")
then
TRUE
else
FALSE
)
)
(do-backward-chaining respuesta-es-40)
(deffunction respuesta-es-30 (?opcion)
(bind ?respuesta (opciones ?opcion))
(if (eq ?respuesta "30")
then
TRUE
else
FALSE
)
)
(do-backward-chaining respuesta-es-30)
(deffunction respuesta-es-20 (?opcion)
(bind ?respuesta (opciones ?opcion))
(if (eq ?respuesta "20")
then
TRUE
else
FALSE
)
)
(do-backward-chaining respuesta-es-20)
(deffunction respuesta-es-18 (?opcion)
(bind ?respuesta (opciones ?opcion))
(if (eq ?respuesta "18")
then
TRUE
else
FALSE
)
)
(do-backward-chaining respuesta-es-18)
;;;* Reglas para realizar la selección
;;;***********************************
(defrule inicio ""
(declare (salience 10))
=>
(printout t crlf crlf)
(printout t "****** Encuentra tu pareja ideal
(printout t crlf crlf)
(printout t crlf)
)
(do-backward-chaining inicio)
*********")
(defrule preferencia-base ""
(not (tipo ?))
=>
(if (respuesta-es-si " te gusta una chica alta (si/no)? ")
then
(if (respuesta-es-si " muy, muy alta (si/no)? ")
then (assert (tipo Muyalta))
(assert (edad 40))
(assert (existe si))
else (assert (altura alta))
)
else
(assert (altura baja))
)
)
(do-backward-chaining preferencia-base)
(defrule altura-alta ""
(declare (salience 10))
(altura alta)
=>
(if (respuesta-es-si " morena (si/no)? ")
then
(assert (tipo Morena))
else
(if (respuesta-es-si " pelirroja (si/no)? ")
then (assert (tipo Pelirroja))
(assert (edad 18))
else (assert (tipo Rubia))
)
)
)
(do-backward-chaining altura-alta)
(defrule altura-baja ""
(declare (salience 10))
(altura baja)
=>
(if (respuesta-es-si " te gusta delgadita (si/no)? ")
then
(assert (tipo Delgada))
else
(if (respuesta-es-si " elegante (si/no)? ")
then
(assert (tipo Elegante))
else
(if (respuesta-es-si " Hippie (si/no)? ")
then (assert (tipo Hippie))
else
(assert (tipo Normal))
)
)
)
)
(do-backward-chaining altura-baja)
;; Regla para determinar la edad de tu pareja.
(defrule numero-edad ""
(declare (salience 10))
(tipo ?)
(not (edad ?))
=>
(if (respuesta-es-si " alrededor de los 40? ")
then
(assert (edad 40))
else
(if (respuesta-es-si " alrededor de 30? ")
then
(assert (edad 30))
else
(if (respuesta-es-si " alrededor de 20? ")
then
(assert (edad 20))
else
(assert (edad 18))
)
)
)
)
;; comprobamos que existe la aspirante segun la edad elegida.
(defrule tipo-18-edad ""
(declare (salience 10))
(or (tipo Morena) (tipo Pelirroja))
(edad 18 )
=>
(assert (existe si))
)
(do-backward-chaining tipo-18-edad)
(defrule tipo-20-edad ""
(declare (salience 10))
(or (tipo Morena) (tipo Rubia) (tipo Delgada))
(edad 20)
=>
(assert (existe si))
)
(do-backward-chaining tipo-20-edad)
(defrule tipo-30-edad ""
(declare (salience 10))
(or (tipo Morena) (tipo Rubia) (tipo Hippie) (tipo Normal))
(edad 30)
=>
(assert (existe si))
)
(do-backward-chaining tipo-30-edad)
(defrule tipo-40-edad ""
(declare (salience 10))
(or (tipo Morena) (tipo Delgada) (tipo Hippie) (tipo Normal) (tipo
Elegante)) (edad 40)
=>
(assert (existe si))
)
(do-backward-chaining tipo-40-edad)
;; Reglas para asignar a la chica según preferencias
(defrule tipo-Morena-18 ""
(declare (salience 10))
(tipo Morena)
(edad 18)
=>
(if (respuesta-es-si " universitaria (si/no)? ")
then
(assert (eleccion Julia))
else
(assert (eleccion Cristina))
)
)
(do-backward-chaining tipo-Morena-18)
(defrule tipo-Morena-20 ""
(declare (salience 10))
(tipo Morena)
(edad 20)
=>
(assert (eleccion Susana))
)
(do-backward-chaining tipo-Morena-20)
(defrule tipo-Morena-30 ""
(declare (salience 10))
(tipo Morena)
(edad 30)
=>
(assert (eleccion Sandra))
)
(do-backward-chaining tipo-Morena-30)
(defrule tipo-Morena-40 ""
(declare (salience 10))
(tipo Morena)
(edad 40)
=>
(if (respuesta-es-si " timida (si/no)? ")
then
(assert (eleccion Lola))
else
(assert (eleccion Patricia))
)
)
(do-backward-chaining tipo-Morena-40)
(defrule tipo-Muyalta-40 ""
(declare (salience 10))
(tipo Muyalta)
(edad 40)
=>
(assert (eleccion Elena))
)
(do-backward-chaining tipo-Muyalta-40)
(defrule tipo-Rubia-20 ""
(declare (salience 10))
(tipo Rubia)
(edad 20)
=>
(assert (eleccion Maria))
)
(do-backward-chaining tipo-Rubia-20)
(defrule tipo-Rubia-30 ""
(declare (salience 10))
(tipo Rubia)
(edad 30)
=>
(assert (eleccion Silvia))
)
(do-backward-chaining tipo-Rubia-30)
(defrule tipo-Delgada-20 ""
(declare (salience 10))
(tipo Delgada)
(edad 20)
=>
(assert (eleccion Paloma))
)
(do-backward-chaining tipo-Delgada-20)
(defrule tipo-Delgada-40 ""
(declare (salience 10))
(tipo Delgada)
(edad 40)
=>
(assert (eleccion Adelaida))
)
(do-backward-chaining tipo-Delgada-40)
(defrule tipo-Hippie-30 ""
(declare (salience 10))
(tipo Hippie)
(edad 30)
=>
(assert (eleccion Africa))
)
(do-backward-chaining tipo-Hippie-30)
(defrule tipo-Hippie-40 ""
(declare (salience 10))
(tipo Hippie)
(edad 40)
=>
(assert (eleccion Flor))
)
(do-backward-chaining tipo-Hippie-40)
(defrule tipo-Pelirroja ""
(declare (salience 10))
(tipo Pelirroja)
(edad 18)
=>
(assert (eleccion Ana))
)
(do-backward-chaining tipo-Pelirroja)
(defrule tipo-Normal-30 ""
(declare (salience 10))
(tipo Normal)
(edad 30)
=>
(assert (eleccion Sonia))
)
(do-backward-chaining tipo-Normal-30)
(defrule tipo-Normal-40 ""
(declare (salience 10))
(tipo Normal)
(edad 40)
=>
(assert (eleccion Lorena))
)
(do-backward-chaining tipo-Normal-40)
(defrule tipo-Elegante ""
(declare (salience 10))
(tipo Elegante)
(edad 40)
=>
(assert (eleccion Alicia))
)
(do-backward-chaining tipo-Elegante)
;; No hay pareja, lo sentimos
(defrule no-existe ""
(not (existe ?))
=>
(printout t crlf crlf)
(printout t " No hay ninguna chica que se adapte a tus preferencias")
(printout t crlf crlf)
)
(do-backward-chaining no-existe)
;; Regla para mostrar la chica sugerida por pantalla
(defrule mostrar-tipo ""
(eleccion ?final)
(existe ?)
=>
(printout t crlf crlf)
(printout t " Nuestra eleccion: ")
(printout t ?final crlf)
)
(do-backward-chaining mostrar-tipo)
;; Regla para despedir la aplicación
(defrule final " "
(declare (salience -20))
=>
(printout t crlf crlf)
(printout t crlf )
(printout t "****** INVITANOS A LA BODA !!!!
(printout t crlf )
(printout t crlf )
)
(do-backward-chaining final)
(reset)
(run)
*********" crlf)
Descargar