Diseño de un motor de reglas en JavaScript (Parte – II)
Planteamiento del
problema
Una
empresa que vende automóviles por Internet, desea realizar un cuestionario que
permita orientar a sus clientes sobre el tipo de coche que desea comprar.
Como
es posible vender cientos de modelos de coches diferentes para diferentes usos,
vamos a centrarnos en unas preguntas básicas:
- El tipo de modelo de coche
que se desea comprar (cabrio, cupé o berlina)
- El rango de precio del
coche que deseamos comprar
Con
estas preguntas básicas podemos comenzar a crear nuestras reglas de negocio.
Información básica
Tipo
|
10,000-30,000€
|
31,000-50,000€
|
Más de 50,000€
|
Cabrio
(2 puertas descapotable)
|
|
|
|
Cupé
(2 puertas)
|
|
|
|
Berlina
(4 puertas)
|
|
|
|
Algoritmo del cuestionario
básico
SI modelo_de_coche
= “cabrio” ENTONCES
SI rango_precios = “10,000-30,000” ENTONCES
Elegir
el coche
SINO
SINO
SI rango_precios = “31,000-50,000” ENTONCES
Elegir el coche
SINO
Elegir el coche
FIN SI
FIN SI
FIN SI
SINO
SI modelo_de_coche = “cupe” ENTONCES
SI rango_precios = “10,000-30,000” ENTONCES
Elegir el coche
SINO
SINO
SI
rango_precios = “31,000-50,000” ENTONCES
Elegir el coche
SINO
Elegir el coche
FIN SI
FIN
SI
SINO
SI
rango_precios = “10,000-30,000” ENTONCES
Elegir el coche
SINO
SINO
SI rango_precios = “31,000-50,000” ENTONCES
Elegir el coche
SINO
Elegir el coche
FIN SI
FIN SI
FIN SI
FIN SI
Este
algoritmo es posible codificarlo en JavaScript directamente en un archivo .js que
forme parte del sitio Web.
Esto
crea una dependencia entre las reglas de negocio y el propio código y diseño
del sitio Web. Si tenemos necesidad de cambiar una simple regla, como el rango
de precios de los coches, tendremos que modificar parte del código del sitio
para poder adaptarlo al cambio.
Un
problema adicional es que no permite separar los roles a la hora de mantener
las reglas de negocio. Con la existencia de un motor de evaluación de reglas y
las reglas separadas, podemos encargar del mantenimiento del primero al
personal de Tecnologías de la Información, mientras que las reglas pueden ser
mantenidas, revisadas y actualizadas por el personal de ventas o de marketing.
El
motor de reglas se encargaría de:
- Hacer
las preguntas adecuadas
- Evaluar
las diferentes variantes
- Dar
una selección
- Aportar
información de cómo el usuario llegó a esta selección
Este
motor sería siempre el mismo para cualquier página Web o cualquier encuesta.
Solo tendríamos que aportar como datos las preguntas, las conclusiones y las
reglas para evaluarlas. Esta información podría recuperarse de un archivo .js,
una base de datos, un servicio Web, etc.
El motor de
reglas
El
motor de reglas es una clase JavaScript que se encarga de evaluar un conjunto
de respuestas para llegar a una determinada conclusión.
Las
conclusiones a las que queremos llegar las vamos a determinar hechos (facts).
Los hechos pueden ser establecidos como conclusión o no.
Las
preguntas (questions) nos permiten responder:
- Si
una afirmación es correcta o no
- Seleccionar
un valor de un conjunto de valores discretos
- Seleccionar
un valor de un rango de valores numérico
Cada
pregunta tiene además una parte descriptiva que nos aclara el sentido o el por
qué hacemos la pregunta.
Por
último están las reglas. Estas nos permiten evaluar hechos y respuestas de
determinadas preguntas para llegar o establecer otros hechos como conclusiones.
Las
reglas, los hechos y las preguntas conforman nuestra base de conocimientos.
Hechos
Establecen
una determinada afirmación como verdadera. Poseen dos atributos:
Atributo
|
Descripción
|
FID
|
Fact
Identification. Número entero que identifica a un hecho dentro de la base de
conocimientos. Debe ser único.
|
FTEXT
|
Fact
Text. Texto que describe al hecho
|
Ejemplos
de hechos:
- El coche es rojo
- El coche es un Audi A8
Sintaxis
del hecho en JavaScript:
{fid:1,ftext:'El coche es rojo'}
{fid:2,ftext:'El coche es un Audi A8'}
Preguntas
Las
preguntas recaban la información que el motor de reglas necesita para
establecer determinados hechos como conclusiones. Tenemos tres tipos de
preguntas:
- Booleanas. Preguntan si alguna
información es verdadera o falsa
- Selección. Permiten elegir un valor
de un grupo de valores
- Rango: Permiten elegir un valor
de un rango numérico de valores
Sus
atributos son:
Atributo
|
Descripción
|
QID
|
Question
Identification. Número entero que identifica a una pregunta dentro de la base
de conocimientos. Debe ser único.
|
QTEXT
|
Question
Text. Texto de la pregunta que deseamos hacer
|
QDESC
|
Question
Description. Texto que permite aclarar o aportar más información sobre la
pregunta que deseamos hacer. Esta información es opcional.
|
QTYPE
|
Question
Type. Define el tipo de la pregunta: boolean, selection o range
|
INFO
|
Information.
Aporta información adicional en el caso de preguntas de tipo selection o
range. En las preguntas de tipo boolean este atributo siempre será null.
|
Sintaxis
en JavaScript.
Pregunta
de tipo booleana:
{qid:1,qtext:'Desea
comprar un coche deportivo',
qdesc:'',
qtype:'boolean',info:null},
Pregunta
de tipo selection:
{qid:5,
qtext:'Por favor, elija un rango de
precios',
qdesc:'Define el rango de precios del coche
que queremos comprar’,
qtype:'selection',
info:[
'10,000-30000€',
‘31000-50000€’,
‘+50,000€’]}
Pregunta
de tipo range:
{qid:5,qtext:
'Cual es su evaluación del coche',
qdesc:'Nota del coche entre 0 y 10',
qtype:'range',info:[0,10]},
Reglas
Las
reglas relacionan determinados hechos y las preguntas para establecer otros
hechos como conclusiones.
Básicamente,
son estructuras de decisión simples tipo:
SI condición ENTONCES
Acciones-1
SINO
Acciones-2
FIN SI
Si
se cumple la condición, entonces se ejecutan las acciones Acciones-1 y si no se
ejecutan las Acciones-2.
Atributo
|
Descripción
|
RID
|
Rule
Identification. Número entero que identifica a una regla dentro de la base de
conocimientos. Debe ser único.
|
COND
|
Expresión
lógica que relaciona hechos y respuestas a las preguntas
|
IFTRUE
|
Acciones
a realizar en caso de que se cumpla la condición
|
IFFALSE
|
Acciones
a realizar en caso de que no se cumpla la condición
|
Sintaxis
en JavaScript:
{rid:1,cond: 'q(1)',
iftrue:'ask(3);set(3);',
iffalse:'ask(2);'},
Esto
se interpreta como:
Si
la respuesta a la pregunta 1 es
verdadera:
- Hacer la pregunta 3
- Establecer el hecho 3 como
verdadero
Si
la respuesta la pregunta 1 es falsa:
- Hacer la pregunta 2
Condiciones
Las
condiciones son expresiones booleanas (devuelven verdadero o falso) formadas
por los siguientes elementos:
- Respuestas a preguntas [función
q()]
- Evaluar si un hecho es
verdadero o no [función f()]
- Operadores de comparación
- Operadores lógicos
Función q(qid)
Función
que devuelve el valor de la pregunta identificada en la base de conocimientos
como qid.
El
valor devuelto depende del tipo de la pregunta:
- Boolean. Devuelve true o false
- Selection. Depende una cadena de
caracteres
- Range. Devuelve un número
entero entre el rango de valores especificado.
Función f(fid)
Función
que devuelve verdadero o falso en dependencia de si se ha establecido o no un
hecho identificado con el parámetro fid.
Operadores de comparación
Se
utilizan los mismos operadores de JavaScript teniendo en cuenta que se comparan
valores booleanos, enteros o de cadenas de caracteres.
Operador
|
Descripción
|
Ejemplo
|
==
|
Igual
en valor
|
q(2)
== “rojo”
|
===
|
Igual
en valor y tipo
|
q(3)
=== 10
|
!=
|
Desigual
en valor
|
q(2)
!= “rojo”
|
!==
|
Desigual
en valor y tipo
|
q(3)
!== 10
|
>
|
Mayor
que
|
q(3)
> 40
|
>=
|
Mayor
o igual que
|
q(3)
>= 40
|
<
|
Menor
que
|
q(3)
< 40
|
<=
|
Menor
o igual que
|
q(3)
<= 40
|
Operadores lógicos y de
agrupación
Se
utiliza el paréntesis como operador de agrupación y además los operadores lógicos
que permiten relacionar expresiones booleanas:
Operador
|
Descripción
|
Ejemplo
|
!
|
NOT
o negación lógica
|
!(q(2)
== “rojo”)
|
&&
|
AND o
“Y” lógico
|
q(3)
&& f(2) && q(1)
|
||
|
OR u
“O” lógico
|
q(2)
|| q(3)
|
Acciones
Las
acciones están orientadas a:
- Establecer determinados hechos como
verdaderos [función set()]
- Realizar determinadas preguntas [función ask()]
- Establecer determinados hechos como conclusión
final [función final()]
La función set(fid)
Esta
función permite establecer un hecho como verdadero aunque no se alcance ninguna
conclusión. El parámetro es el número que identifica el hecho.
La función ask(qid)
Esta
función permite que el motor de reglas realice al usuario la pregunta
identificada por qid.
La función
final(fid)
Esta
función permite establecer un hecho como verdadero estableciendo una conclusión.
El parámetro es el número que identifica el hecho. Cuando el motor de reglas
establece una conclusión, detiene la evaluación de reglas.
0 comentarios:
Publicar un comentario