Pregunta

Estoy diseñando un sistema de evaluación de las reglas que deben manejar una base de datos de hecho y de ciertas normas sobre la base de datos. Actualmente tenemos un versión modificada de RETE que funciona parcialmente derecha con algunos inconvenientes.

El problema es que las reglas no se limita a coincidencias exactas sino que también deben apoyar la desigualdad (como en menos de) y otros tipos de cálculos difusos.

ejemplos, suponga que tiene estos hechos

(Sueldo John 58000) (Salario Sara 78.000) (Empleado Juan) (Jefe Sara) (Casado John Sara) (Obras John Stackoverflow)

es posible que tenga una regla que dice:

(salario? W <60000) / \ (Casado? W) / \ (Works? W Stackoverflow) ==> Cualquiera que sea

Obviamente, el resultado será la activación de la regla con una? W valor de "John", pero la forma en que estamos haciendo ahora es que por cada elemento de bucle a través de la base de que coincide con el beggining de la primera expresión (Salario XX ) y luego hacer la comparación y almacenar los resultados en el hecho de que la base de auto. Por ejemplo, tras el primer paso que tendrá el siguiente elemento añadido a la base de hechos:

(Sueldo John 58000 <60000)

y una vez que está hecho de realizar las uniones en el camino RETE habitual. De esa manera se necesita una gran cantidad de espacio en la base de hechos, especialmente debido a la regla puede referirse a cualquier número y por lo que tiene esos hechos "calculado", siempre y cuando la regla está activa.

Por otro lado se puede aplicar varias reglas con la primera expresión y se puede seguir usando el algoritmo de coincidencia estándar para activar las reglas.

¿Alguien sabe de algún patrón, referencias o métodos que manejan este tipo de comportamiento? Los saltos habituales, golosinas, algoritmos RETE sólo manejan (por lo que yo sé) "exacta" a juego.

Por cierto, esta es C # .NET.

¿Fue útil?

Solución

Clips ha apoyado elementos condicionales durante el tiempo que he estado consciente de ello - por lo menos 15 años. Echa un vistazo a la href="http://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node5.4.8.html" rel="nofollow noreferrer"> guía de programación básica para los clips y esta tutorial para ejemplos. Se puede ver en (o modificar) la fuente de los clips de forma gratuita.

Clips utiliza la notación de prefijo, por lo que su ejemplo condicional podría ser:

(defrule fat-boy
    (person-data (name ?name) (weight ?weight))
    (test (> ?weight 100))
=>
    (printout t ?name " weighs " ?weight " kg! " crlf)
)

Otros consejos

Por lo que entiendo el problema, todas las reglas difusas dividen valor entero o de coma flotante oscila en un número limitado de subintervalos. Por ejemplo, si un sueldo se compara con 58000, 60000, 78000 valores, tiene 4 rangos:. <58000, 58000 a 60000, 60000-78000,> 78000

Si ese es el caso, tal vez se puede redefinir las variables son números enteros que son o 0,1,2,3, y por lo tanto convertir sus reglas de desigualdad a las reglas de igualdad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top