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)
  • Peugeot 207(15,300€)
  • Renault Megane (22,000€)
  • Mazda MX5 (22,000€)
  • BMW Z4 (32,000€)
  • Volvo C70 (37,000€)
  • Audi TTRS (64,000€)
  • Audi TTS (55,000€)
  • BMW Serie G (83,000 €)
Cupé (2 puertas)
  • Renault Laguna (23,000€)
  • BMW Serie 1 (24,000€)
  • Audi A5 (35,000€)
  • Chevrolet Camaro (44,000€)
  • Mercedes Clase E (44,000€)
  • Audi TTS (51,000€)
  • Chevrolet Corvette (86,000€)
  • Porsche 911 (96,000€)
Berlina (4 puertas)
  • Alfa Romeo MiTo (14,000€)
  • Fiat Bravo (12,000€)
  •  
  • Audi A5 (34,000€)
  • BMW Serie 5 (35,000€)
  • Audi S6 (86,000€)
  • BMW Serie 6 (80,000€)
  • BMW Serie 7(74,000€)



Algoritmo del cuestionario básico


SI modelo_de_coche = “cabrio” ENTONCES
   SI rango_precios = “10,000-30,000” ENTONCES
       Elegir el coche
   SINO
       SI rango_precios = “31,000-50,000” ENTONCES
           Elegir el coche
       SINO
           Elegir el coche
       FIN SI
   FIN SI
SINO
    SI modelo_de_coche = “cupe” ENTONCES
        SI rango_precios = “10,000-30,000” ENTONCES
             Elegir el coche    
        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
           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.


posted under , |

0 comentarios:

Publicar un comentario

Entrada más reciente Entrada antigua Inicio