Diseño de un motor de reglas en JavaScript (Parte – IV final)


Ahora vamos a tratar como invocar desde una simple aplicación JavaScript el motor de reglas.

Para este ejemplo, hemos colocado todas las reglas, hechos y preguntas en un archivo al que llamaremos rules.js y formará parte de nuestro sitio Web.

De manera muy básica solo tenemos que cambiar reglas en este archivo y actualizarlo para que el motor pueda encontrar soluciones de una manera u otra.

También se puede persistirse este objeto JSON (JavaScript Object Notation) en una base de datos remota y tener una aplicación que permita construir y mantener la información depositada en la base de conocimientos.

Lo primero es ver como esta organizado el motor:

Archivo
Descripción
Question.js
Clase que define a las preguntas
Fact.js
Clase que define a los hechos
Rule.js
Clase que define las reglas
REE.js
Motor de evaluación de reglas

Por lo tanto, en nuestra aplicación Web deberíamos incluir los archivos de esta manera:
<!-- business rules -->

<script src="Rules.js" type="text/javascript"></script>

<!-- rules evaluation engine -->

<script src="Question.js" type="text/javascript"></script>
<script src="Fact.js" type="text/javascript"></script>
<script src="Rule.js" type="text/javascript"></script>
<script src="REE.js" type="text/javascript"></script>

Luego tenemos que construir una instancia del motor.

ree = new RulesEvaluationEngine(knowledge,
                 askCallback,
                 solutionCallback,
                 logicaCallback,true);

Los parámetros de esta llamada son:

  • La base de conocimientos en formato JSON
  • La función callback para realizar las preguntas
  • La función callback para presentar la solución
  • La función callback para presentar la lógica de la solución (esta versión del motor solo incluye hechos y preguntas. Las reglas no se incluyen)
  • Un parámetro booleano que indica si el motor se ejecuta paso a paso o en modo de evaluación completa

El motor tiene dos formas de ejecutarse:

Forma de ejecución
Descripción
Paso a paso
El motor va generando las preguntas necesarias según las respuestas a preguntas anteriores
Evaluación completa
El usuario responde todas las preguntas y luego el motor evalúa todos los resultados.

La comunicación entre la aplicación y el motor se realiza a través de tres funciones callback:

Callback function
Descripción
askCallback
Realiza las preguntas
solutionCallback
Presenta los resultados de la evaluación de las reglas
logicaCallback
Devuelve los hechos establecidos y las respuestas del usuario para aclarar como se llegó a una conclusión

Antes de ejecutar el motor en cualquiera de los modos, tenemos que iniciar la evaluación, proceso que elimina todas las respuestas y todos los hechos establecidos de una evaluación anterior:

ree.initEvaluation();

Para evaluar las preguntas, si estamos utilizando el modo de evaluación completa tenemos dos funciones para navegar y responder en el conjunto de preguntas:

ree.Next();
ree.Prev();

Estas funciones tienen que combinarse con la función Evaluate() que realmente invoca al motor para obtener las conclusiones. En el caso de la evaluación paso a paso, en cada paso se realizan evaluaciones o inferencias en el motor hasta encontrar una solución.

En el caso de evaluación paso a paso tenemos la función Step:

ree.Step();

Por último, la función Logica() devuelve el conjunto de preguntas y hechos establecidos durante la evaluación.

ree.Logica();

En el ejemplo utilizaremos las últimas versiones de jQuery y jQuery Mobile para construir una sencilla interfaz de usuario con tres botones:

  • El primero para iniciar el motor (poner condiciones iniciales)
  • El segundo para realizar preguntas
  • El tercero para mostrar la lógica de la solución

Limitaciones

Este motor de evaluación de reglas en JavaScript es muy simple y ligero. Su algoritmo de evaluación se basa en reglas de producción con una máquina de inferencia con  encadenamiento hacia adelante (forward chaining).

Entre las limitaciones de esta versión está el no incluir las reglas evaluadas dentro de la lógica de como se encontró una solución.

Otra limitación es que se ejecuta en el navegador. Una base de conocimientos muy extensa podría provocar lentitud en nuestro sitio Web debido a que dependería de la potencia de proceso del terminal que tengamos (no es lo mismo responder las preguntas en un móvil que responderlas en un iMac).

Código del proyecto

El código de este proyecto podemos descargarlo desde Google Code:


posted under , |

0 comentarios:

Publicar un comentario

Entrada más reciente Entrada antigua Inicio