El algoritmo Rete ( / ˈ r iː t iː / REE -tee , / ˈ r eɪ t iː / RAY -tee , raramente / ˈ r iː t / REET , / r ɛ ˈ t eɪ / reh- TAY ) es un algoritmo de coincidencia de patrones para implementar sistemas basados en reglas . El algoritmo se desarrolló para aplicar eficientemente muchas reglas o patrones a muchos objetos, o hechos , en una base de conocimiento . Se utiliza para determinar qué reglas del sistema deben activarse en función de su almacén de datos , sus hechos. El algoritmo Rete fue diseñado por Charles L. Forgy de la Universidad Carnegie Mellon , publicado por primera vez en un documento de trabajo en 1974, y posteriormente desarrollado en su tesis doctoral de 1979 y en un artículo de 1982. [ 1 ]
Descripción general
Una implementación ingenua de un sistema experto podría verificar cada regla con respecto a hechos conocidos en una base de conocimiento , activando esa regla si es necesario y luego pasando a la siguiente (y volviendo a la primera regla al terminar). Incluso para bases de conocimiento de reglas y hechos de tamaño moderado, este enfoque ingenuo es demasiado lento. El algoritmo Rete proporciona la base para una implementación más eficiente. Un sistema experto basado en Rete construye una red de nodos , donde cada nodo (excepto la raíz) corresponde a un patrón que aparece en el lado izquierdo (la parte de la condición) de una regla. La ruta desde el nodo raíz hasta un nodo hoja define el lado izquierdo completo de una regla. Cada nodo tiene una memoria de hechos que satisfacen ese patrón. Esta estructura es esencialmente un trie generalizado . A medida que se afirman o modifican nuevos hechos, estos se propagan a lo largo de la red, lo que provoca que los nodos se anoten cuando ese hecho coincide con ese patrón. Cuando un hecho o una combinación de hechos hace que se satisfagan todos los patrones de una regla dada, se llega a un nodo hoja y se activa la regla correspondiente.
Rete se utilizó por primera vez como motor principal del lenguaje de sistema de producción OPS5 , que se empleó para construir los primeros sistemas, incluido R1 para Digital Equipment Corporation . Rete se ha convertido en la base de muchos motores de reglas y entornos de sistemas expertos populares, como CLIPS , Jess , Drools , IBM Operational Decision Management , BizTalk Rules Engine , Soar y Evrete . La palabra «Rete» proviene del latín y significa «red» o «peine». En italiano moderno, la misma palabra se usa para referirse a «red». Según se informa, Charles Forgy afirmó haber adoptado el término «Rete» debido a su uso en anatomía para describir una red de vasos sanguíneos y fibras nerviosas. [ 2 ]
El algoritmo Rete está diseñado para sacrificar memoria en aras de una mayor velocidad. En la mayoría de los casos, el aumento de velocidad con respecto a las implementaciones simples es de varios órdenes de magnitud (ya que el rendimiento de Rete es teóricamente independiente del número de reglas en el sistema). Sin embargo, en sistemas expertos muy grandes, el algoritmo Rete original tiende a presentar problemas de consumo de memoria y servidor. Desde entonces, se han diseñado otros algoritmos, tanto novedosos como basados en Rete, que requieren menos memoria (por ejemplo, Rete* [ 3 ] o Collection Oriented Match [ 4 ] ).
Descripción
El algoritmo Rete proporciona una descripción lógica generalizada de una implementación de la funcionalidad responsable de comparar tuplas de datos ("hechos") con producciones (" reglas ") en un sistema de producción de coincidencia de patrones (una categoría de motor de reglas ). Una producción consta de una o más condiciones y un conjunto de acciones que pueden realizarse para cada conjunto completo de hechos que coincidan con las condiciones. Las condiciones prueban los atributos de los hechos , incluidos los especificadores/identificadores de tipo de hecho. El algoritmo Rete presenta las siguientes características principales:
- Reduce o elimina ciertos tipos de redundancia mediante el uso del uso compartido de nodos.
- Almacena coincidencias parciales al realizar uniones entre diferentes tipos de hechos. Esto, a su vez, permite que los sistemas de producción eviten la reevaluación completa de todos los hechos cada vez que se modifican sus memorias de trabajo. En cambio, el sistema de producción solo necesita evaluar los cambios (deltas) en dichas memorias.
- Permite la eliminación eficiente de elementos de memoria cuando se retiran datos de la memoria de trabajo.
El algoritmo Rete se utiliza ampliamente para implementar la funcionalidad de coincidencia dentro de los motores de coincidencia de patrones que explotan un ciclo de coincidencia-resolución-acción para admitir el encadenamiento hacia adelante y la inferencia .
- Proporciona un medio para la coincidencia de muchos a muchos, una característica importante cuando se deben encontrar muchas o todas las soluciones posibles en una red de búsqueda.
Las rete son grafos dirigidos acíclicos que representan conjuntos de reglas de nivel superior. Generalmente, se representan en tiempo de ejecución mediante una red de objetos en memoria. Estas redes relacionan las condiciones de las reglas (patrones) con los hechos (tuplas de datos relacionales). Las redes de rete actúan como un procesador de consultas relacionales, realizando proyecciones , selecciones y uniones condicionalmente sobre un número arbitrario de tuplas de datos.
Las reglas de producción suelen ser capturadas y definidas por analistas y desarrolladores mediante un lenguaje de reglas de alto nivel. Estas se agrupan en conjuntos de reglas que luego se traducen, a menudo en tiempo de ejecución, a un archivo ejecutable.
Cuando se "afirman" hechos en la memoria de trabajo, el motor crea elementos de memoria de trabajo (EMT) para cada hecho. Los hechos son tuplas y, por lo tanto, pueden contener un número arbitrario de elementos de datos. Cada EMT puede contener una tupla completa o, alternativamente, cada hecho puede representarse mediante un conjunto de EMT, donde cada EMT contiene una tupla de longitud fija. En este caso, las tuplas suelen ser tríos (3-tuplas).
Cada WME ingresa a la red Rete a través de un único nodo raíz. El nodo raíz transmite cada WME a sus nodos hijos, y cada WME puede propagarse a través de la red, posiblemente almacenándose en memorias intermedias, hasta llegar a un nodo terminal.
Red Alfa
El lado izquierdo ( alfa ) del grafo de nodos forma una red de discriminación responsable de seleccionar WME individuales basándose en pruebas condicionales simples que comparan los atributos de WME con valores constantes. Los nodos de la red de discriminación también pueden realizar pruebas que comparan dos o más atributos del mismo WME. Si un WME coincide con las condiciones representadas por un nodo, se pasa al siguiente. En la mayoría de los motores, los nodos hijos inmediatos del nodo raíz se utilizan para probar el identificador de entidad o el tipo de hecho de cada WME. Por lo tanto, todos los WME que representan el mismo tipo de entidad suelen recorrer una rama determinada de nodos en la red de discriminación.
Dentro de la red de discriminación, cada rama de nodos alfa (también llamados nodos de una entrada) termina en una memoria denominada memoria alfa . Estas memorias almacenan conjuntos de WME que coinciden con cada condición en cada nodo de una rama determinada. Los WME que no coinciden con al menos una condición en una rama no se materializan en la memoria alfa correspondiente. Las ramas de los nodos alfa pueden bifurcarse para minimizar la redundancia de condiciones.
Red Beta
El lado "derecho" ( beta ) del gráfico realiza principalmente uniones entre diferentes WME. Es opcional y solo se incluye si es necesario. Consta de nodos de 2 entradas, donde cada nodo tiene una entrada "izquierda" y una "derecha". Cada nodo beta envía su salida a una memoria beta .
En las descripciones de Rete, es común referirse al paso de tokens dentro de la red beta. Sin embargo, en este artículo describiremos la propagación de datos en términos de listas WME, en lugar de tokens, teniendo en cuenta las diferentes opciones de implementación y el propósito y uso subyacentes de los tokens. A medida que una lista WME pasa por la red beta, se pueden agregar nuevos WME a ella, y la lista puede almacenarse en memorias beta. Una lista WME en una memoria beta representa una coincidencia parcial con las condiciones de una producción dada.
Las listas WME que llegan al final de una rama de nodos beta representan una coincidencia completa para una sola producción y se pasan a los nodos terminales. Estos nodos a veces se denominan nodos p , donde "p" significa producción . Cada nodo terminal representa una sola producción, y cada lista WME que llega a un nodo terminal representa un conjunto completo de WME coincidentes para las condiciones de esa producción. Por cada lista WME que recibe, un nodo de producción "activará" una nueva instancia de producción en la "agenda". Las agendas se implementan normalmente como colas priorizadas .
Los nodos beta suelen realizar uniones entre listas WME almacenadas en memorias beta y WME individuales almacenadas en memorias alfa. Cada nodo beta está asociado a dos memorias de entrada. Una memoria alfa almacena WM y realiza activaciones "derecha" en el nodo beta cada vez que almacena un nuevo WME. Una memoria beta almacena listas WME y realiza activaciones "izquierda" en el nodo beta cada vez que almacena una nueva lista WME. Cuando un nodo de unión se activa a la derecha, compara uno o más atributos del WME recién almacenado de su memoria alfa de entrada con atributos dados de WME específicos en cada lista WME contenida en la memoria beta de entrada. Cuando un nodo de unión se activa a la izquierda, recorre una única lista WME recién almacenada en la memoria beta, recuperando valores de atributos específicos de WME dados. Compara estos valores con los valores de atributos de cada WME en la memoria alfa.
Cada nodo beta genera listas WME que se almacenan en una memoria beta o se envían directamente a un nodo terminal. Las listas WME se almacenan en las memorias beta siempre que el motor realice activaciones adicionales a la izquierda en nodos beta subsiguientes.
Lógicamente, un nodo beta al inicio de una rama de nodos beta constituye un caso especial, ya que no recibe información de ninguna memoria beta superior en la red. Los distintos motores abordan este problema de diferentes maneras. Algunos utilizan nodos adaptadores especializados para conectar las memorias alfa a la entrada izquierda de los nodos beta. Otros permiten que los nodos beta reciban información directamente de dos memorias alfa, tratando una como entrada "izquierda" y la otra como entrada "derecha". En ambos casos, los nodos beta "al inicio" reciben su información de dos memorias alfa.
Para eliminar la redundancia de nodos, cualquier memoria alfa o beta puede utilizarse para activar múltiples nodos beta. Además de los nodos de unión, la red beta puede contener otros tipos de nodos, algunos de los cuales se describen a continuación. Si una red no contiene ninguna red beta, los nodos alfa envían tokens, cada uno con un único WME, directamente a los nodos p. En este caso, puede que no sea necesario almacenar los WME en las memorias alfa.
Resolución de conflictos
Durante cualquier ciclo de coincidencia-resolución-acción, el motor encontrará todas las coincidencias posibles para los hechos actualmente registrados en la memoria de trabajo. Una vez encontradas todas las coincidencias y activadas las instancias de producción correspondientes en la agenda, el motor determina el orden en que se pueden ejecutar dichas instancias. Esto se denomina resolución de conflictos , y la lista de instancias de producción activadas se denomina conjunto de conflictos . El orden puede basarse en la prioridad de la regla ( relevancia ), el orden de la regla, el momento en que los hechos contenidos en cada instancia se registraron en la memoria de trabajo, la complejidad de cada producción u otros criterios. Muchos motores permiten a los desarrolladores de reglas seleccionar entre diferentes estrategias de resolución de conflictos o encadenar varias estrategias.
La resolución de conflictos no está definida como parte del algoritmo Rete, pero se utiliza junto con él. Algunos sistemas de producción especializados no realizan la resolución de conflictos.
Ejecución de la producción
Tras resolver el conflicto, el motor inicia la primera instancia de producción, ejecutando una lista de acciones asociadas a ella. Estas acciones actúan sobre los datos representados por la lista WME de la instancia de producción.
Por defecto, el motor continuará ejecutando cada instancia de producción en orden hasta que todas se hayan ejecutado. Cada instancia de producción se ejecutará solo una vez, como máximo, durante cualquier ciclo de coincidencia-resolución-acción. Esta característica se denomina refracción . Sin embargo, la secuencia de ejecuciones de instancias de producción puede interrumpirse en cualquier etapa mediante cambios en la memoria de trabajo. Las acciones de las reglas pueden contener instrucciones para afirmar o retirar WME de la memoria de trabajo del motor. Cada vez que una instancia de producción realiza uno o más de estos cambios, el motor entra inmediatamente en un nuevo ciclo de coincidencia-resolución-acción. Esto incluye las "actualizaciones" de los WME que se encuentran actualmente en la memoria de trabajo. Las actualizaciones se representan retirando y volviendo a afirmar el WME. El motor realiza la coincidencia de los datos modificados, lo que, a su vez, puede resultar en cambios en la lista de instancias de producción en la agenda. Por lo tanto, después de que se hayan ejecutado las acciones para una instancia de producción específica, las instancias previamente activadas pueden haberse desactivado y eliminado de la agenda, y pueden haberse activado nuevas instancias.
Como parte del nuevo ciclo de coincidencia-resolución-acción, el motor resuelve los conflictos en la agenda y luego ejecuta la primera instancia actual. El motor continúa generando instancias de producción e iniciando nuevos ciclos de coincidencia-resolución-acción hasta que no queden más instancias de producción en la agenda. En ese momento, se considera que el motor de reglas ha finalizado su trabajo y se detiene.
Algunos motores admiten estrategias de refracción avanzadas en las que ciertas instancias de producción ejecutadas en un ciclo anterior no se vuelven a ejecutar en el nuevo ciclo, aunque todavía figuren en la agenda.
Es posible que el motor entre en bucles infinitos en los que la agenda nunca llega al estado vacío. Por este motivo, la mayoría de los motores admiten verbos de "detención" explícitos que se pueden invocar desde las listas de acciones de producción. También pueden ofrecer detección automática de bucles, en la que los bucles infinitos se detienen automáticamente después de un número determinado de iteraciones. Algunos motores admiten un modelo en el que, en lugar de detenerse cuando la agenda está vacía, el motor entra en un estado de espera hasta que se afirman nuevos hechos externamente.
En cuanto a la resolución de conflictos, la activación de instancias de producción no es una característica del algoritmo Rete. Sin embargo, sí es una característica fundamental de los motores que utilizan redes Rete. Algunas de las optimizaciones que ofrecen las redes Rete solo son útiles en escenarios donde el motor realiza múltiples ciclos de coincidencia, resolución y ejecución.
Cuantificaciones existenciales y universales
Las pruebas condicionales se utilizan con mayor frecuencia para realizar selecciones y uniones en tuplas individuales. Sin embargo, al implementar tipos de nodos beta adicionales, las redes Rete pueden realizar cuantificaciones . La cuantificación existencial implica comprobar la existencia de al menos un conjunto de WME coincidentes en la memoria de trabajo. La cuantificación universal implica comprobar que un conjunto completo de WME en la memoria de trabajo cumple una condición dada. Una variante de la cuantificación universal podría comprobar que un número determinado de WME, extraído de un conjunto de WME, cumple con ciertos criterios. Esto podría consistir en comprobar un número exacto o un número mínimo de coincidencias.
La cuantificación no está implementada universalmente en los motores Rete y, donde sí lo está, existen varias variantes. Una variante de cuantificación existencial, denominada negación , cuenta con amplio soporte, aunque no universal, y se describe en documentos fundamentales. Las condiciones y conjunciones negadas existencialmente implican el uso de nodos beta especializados que comprueban la inexistencia de WME coincidentes o conjuntos de WME. Estos nodos propagan listas de WME solo cuando no se encuentra ninguna coincidencia. La implementación exacta de la negación varía. En un enfoque, el nodo mantiene un contador simple en cada lista de WME que recibe de su entrada izquierda. El contador especifica el número de coincidencias encontradas con los WME recibidos de la entrada derecha. El nodo solo propaga listas de WME cuyo contador es cero. En otro enfoque, el nodo mantiene una memoria adicional en cada lista de WME recibida de la entrada izquierda. Estas memorias son una forma de memoria beta y almacenan listas de WME para cada coincidencia con los WME recibidos en la entrada derecha. Si una lista WME no tiene ninguna lista WME en su memoria, se propaga por la red. En este enfoque, los nodos de negación generalmente activan directamente otros nodos beta, en lugar de almacenar su salida en una memoria beta adicional. Los nodos de negación proporcionan una forma de « negación como fallo ».
Cuando se modifica la memoria de trabajo, una lista WME que antes no coincidía con ninguna WME ahora puede coincidir con WME recién identificadas. En este caso, la lista WME propagada y todas sus copias extendidas deben eliminarse de las memorias beta en la red. El segundo método descrito anteriormente se utiliza a menudo para implementar mecanismos eficientes de eliminación de listas WME. Al eliminar las listas WME, las instancias de producción correspondientes se desactivan y se eliminan de la agenda.
La cuantificación existencial se puede realizar combinando dos nodos beta de negación. Esto representa la semántica de la doble negación (por ejemplo, "Si NO NO hay ningún WME coincidente, entonces..."). Este es un enfoque común en varios sistemas de producción.
Indexación de memoria
El algoritmo Rete no exige ningún enfoque específico para la indexación de la memoria de trabajo. Sin embargo, la mayoría de los sistemas de producción modernos proporcionan mecanismos de indexación. En algunos casos, solo se indexan las memorias beta, mientras que en otros, la indexación se utiliza tanto para las memorias alfa como para las beta. Una buena estrategia de indexación es un factor clave para determinar el rendimiento general de un sistema de producción, especialmente al ejecutar conjuntos de reglas que dan como resultado una coincidencia de patrones altamente combinatoria (es decir, un uso intensivo de nodos de unión beta) o, para algunos motores, al ejecutar conjuntos de reglas que realizan un número significativo de retracciones de WME durante múltiples ciclos de coincidencia-resolución-acción. Las memorias a menudo se implementan utilizando combinaciones de tablas hash, y los valores hash se utilizan para realizar uniones condicionales en subconjuntos de listas de WME y WME, en lugar de en todo el contenido de las memorias. Esto, a su vez, suele reducir significativamente el número de evaluaciones realizadas por la red Rete.
Eliminación de WME y listas de WME
Cuando un WME se retira de la memoria de trabajo, debe eliminarse de todas las memorias alfa en las que esté almacenado. Además, las listas de WME que contienen el WME deben eliminarse de las memorias beta, y las instancias de producción activadas para estas listas de WME deben desactivarse y eliminarse de la agenda. Existen varias variantes de implementación, incluyendo la eliminación basada en árboles y la eliminación basada en coincidencias. En algunos casos, se puede utilizar la indexación de memoria para optimizar la eliminación.
Manejo de condiciones OR
Al definir producciones en un conjunto de reglas, es común permitir que las condiciones se agrupen mediante un conector OR . En muchos sistemas de producción, esto se gestiona interpretando una única producción que contiene múltiples patrones con OR como el equivalente a múltiples producciones. La red Rete resultante contiene conjuntos de nodos terminales que, en conjunto, representan producciones individuales. Este enfoque impide cualquier forma de cortocircuito de las condiciones con OR. También puede, en algunos casos, provocar la activación de instancias de producción duplicadas en la agenda cuando el mismo conjunto de WME coincide con múltiples producciones internas. Algunos motores proporcionan deduplicación de agenda para solucionar este problema.
Diagrama
El siguiente diagrama ilustra la topología básica de Rete y muestra las asociaciones entre los diferentes tipos de nodos y las memorias.

- La mayoría de las implementaciones utilizan nodos de tipo para realizar la primera fase de selección en los elementos de la memoria de trabajo de tuplas. Los nodos de tipo pueden considerarse nodos de selección especializados, ya que permiten diferenciar entre los distintos tipos de relaciones de tuplas.
- El diagrama no ilustra el uso de tipos de nodos especializados, como los nodos de conjunción negada. Algunos motores implementan varias especializaciones de nodos diferentes para ampliar la funcionalidad y maximizar la optimización.
- El diagrama ofrece una representación lógica de la red neuronal. Las implementaciones pueden diferir en detalles físicos. En particular, el diagrama muestra entradas ficticias que proporcionan activaciones correctas al inicio de las ramas del nodo beta. Los motores pueden implementar otros enfoques, como adaptadores que permiten que las memorias alfa realicen activaciones correctas directamente.
- El diagrama no ilustra todas las posibilidades de compartición de nodos.
Para obtener una descripción más detallada y completa del algoritmo Rete, consulte el capítulo 2 de Production Matching for Large Learning Systems de Robert Doorenbos (véase el enlace a continuación).
Alternativas
Red Alfa
Una posible variante consiste en introducir memorias adicionales para cada nodo intermedio en la red de discriminación. Esto aumenta la sobrecarga de la red, pero puede tener ventajas en situaciones donde se añaden o eliminan reglas dinámicamente, facilitando así la modificación dinámica de la topología de la red de discriminación.
Doorenbos describe una implementación alternativa. [ 5 ] En este caso, la red de discriminación se reemplaza por un conjunto de memorias y un índice. El índice puede implementarse mediante una tabla hash . Cada memoria almacena WME que coinciden con un único patrón condicional, y el índice se utiliza para referenciar las memorias según su patrón. Este enfoque solo es práctico cuando los WME representan tuplas de longitud fija y la longitud de cada tupla es corta (por ejemplo, 3-tuplas). Además, el enfoque solo se aplica a patrones condicionales que realizan pruebas de igualdad con respecto a valores constantes . Cuando un WME ingresa a la red, el índice se utiliza para localizar un conjunto de memorias cuyo patrón condicional coincide con los atributos del WME, y este se agrega directamente a cada una de estas memorias. En sí misma, esta implementación no contiene nodos de una entrada. Sin embargo, para implementar pruebas de desigualdad, la red puede contener redes adicionales de nodos de una entrada por las que se pasan los WME antes de colocarlos en una memoria. Alternativamente, las pruebas de desigualdad pueden realizarse en la red beta descrita a continuación.
Red Beta
Una variante común consiste en crear listas enlazadas de tokens, donde cada token contiene un único WME. En este caso, las listas de WME para una coincidencia parcial se representan mediante la lista enlazada de tokens. Este enfoque puede ser mejor porque elimina la necesidad de copiar listas de WME de un token a otro. En cambio, un nodo beta solo necesita crear un nuevo token para almacenar el WME que desea agregar a la lista de coincidencia parcial y, a continuación, enlazar el nuevo token con un token padre almacenado en la memoria beta de entrada. El nuevo token ahora forma la cabecera de la lista de tokens y se almacena en la memoria beta de salida.
Los nodos beta procesan tokens. Un token es una unidad de almacenamiento dentro de una memoria y también una unidad de intercambio entre memorias y nodos. En muchas implementaciones, los tokens se introducen en las memorias alfa, donde se utilizan para almacenar WME individuales. Estos tokens se transfieren posteriormente a la red beta.
Cada nodo beta realiza su trabajo y, como resultado, puede crear nuevos tokens para almacenar una lista de WME que representan una coincidencia parcial. Estos tokens extendidos se almacenan en las memorias beta y se transmiten a los nodos beta subsiguientes. En este caso, los nodos beta suelen transmitir listas de WME a través de la red beta copiando las listas de WME existentes de cada token recibido en nuevos tokens y, posteriormente, añadiendo más WME a las listas como resultado de una unión u otra acción. Los nuevos tokens se almacenan en la memoria de salida.
Consideraciones diversas
Aunque no está definido por el algoritmo Rete, algunos motores ofrecen funcionalidades extendidas para un mayor control del mantenimiento de la veracidad . Por ejemplo, cuando se encuentra una coincidencia para una producción, esto puede resultar en la afirmación de nuevos WME que, a su vez, coinciden con las condiciones de otra producción. Si un cambio posterior en la memoria de trabajo invalida la primera coincidencia, es posible que esto implique que la segunda también sea inválida. El algoritmo Rete no define ningún mecanismo para definir y gestionar automáticamente estas dependencias lógicas de veracidad . Sin embargo, algunos motores admiten funcionalidades adicionales que permiten el mantenimiento automático de dichas dependencias. En este caso, la retractación de un WME puede conllevar la retractación automática de otros WME para mantener las afirmaciones lógicas de veracidad.
El algoritmo Rete no define ningún método de justificación. La justificación se refiere a los mecanismos comúnmente requeridos en sistemas expertos y de decisión, donde, en su forma más simple, el sistema informa cada una de las decisiones internas utilizadas para llegar a una conclusión final. Por ejemplo, un sistema experto podría justificar la conclusión de que un animal es un elefante informando que es grande, gris, tiene orejas grandes, trompa y colmillos. Algunos motores proporcionan sistemas de justificación integrados junto con su implementación del algoritmo Rete.
Este artículo no ofrece una descripción exhaustiva de todas las posibles variaciones o extensiones del algoritmo Rete. Existen otras consideraciones e innovaciones. Por ejemplo, los motores pueden proporcionar soporte especializado dentro de la red Rete para aplicar el procesamiento de reglas de coincidencia de patrones a tipos y fuentes de datos específicos, como objetos programáticos , datos XML o tablas de datos relacionales . Otro ejemplo se refiere a las funciones adicionales de sellado de tiempo que proporcionan muchos motores para cada WME que ingresa a una red Rete, y el uso de estos sellos de tiempo junto con estrategias de resolución de conflictos. Los motores presentan una variación significativa en la forma en que permiten el acceso programático al motor y a su memoria de trabajo, y pueden extender el modelo Rete básico para admitir formas de procesamiento paralelo y distribuido.
Optimización y rendimiento
En la literatura académica se han identificado y descrito varias optimizaciones para Rete. Sin embargo, algunas de ellas solo se aplican en escenarios muy específicos y, por lo tanto, suelen tener poca o ninguna aplicación en un motor de reglas de propósito general. Además, se han formulado algoritmos alternativos como TREAT, desarrollado por Daniel P. Miranker [ 6 ] , LEAPS y Design Time Inferencing (DeTI), que pueden proporcionar mejoras adicionales en el rendimiento.
El algoritmo Rete es adecuado para escenarios donde se utiliza el encadenamiento hacia adelante y la inferencia para calcular nuevos hechos a partir de hechos existentes, o para filtrar y descartar hechos con el fin de llegar a una conclusión. También se aprovecha como un mecanismo razonablemente eficiente para realizar evaluaciones altamente combinatorias de hechos donde se deben realizar numerosas uniones entre tuplas de hechos. Otros enfoques para realizar la evaluación de reglas, como el uso de árboles de decisión o la implementación de motores secuenciales, pueden ser más apropiados para escenarios simples y deben considerarse como posibles alternativas.
El rendimiento de Rete también depende en gran medida de las decisiones de implementación (independientemente de la topología de la red ), una de las cuales (el uso de tablas hash) conlleva mejoras importantes. La mayoría de las comparaciones y pruebas de rendimiento disponibles en la web están sesgadas de una u otra forma. Por mencionar solo un sesgo frecuente y un tipo de comparación injusta: 1) el uso de problemas de juguete como los ejemplos de Manners y Waltz; estos ejemplos son útiles para estimar propiedades específicas de la implementación, pero pueden no reflejar el rendimiento real en aplicaciones complejas; 2) el uso de una implementación antigua; por ejemplo, las referencias en las siguientes dos secciones (Rete II y Rete-NT) comparan algunos productos comerciales con versiones totalmente obsoletas de CLIPS y afirman que los productos comerciales pueden ser órdenes de magnitud más rápidos que CLIPS; esto es olvidar que CLIPS 6.30 (con la introducción de tablas hash como en Rete II) es órdenes de magnitud más rápido que la versión utilizada para las comparaciones (CLIPS 6.04).
Variantes
Red II
En la década de 1980, Charles Forgy desarrolló un sucesor del algoritmo Rete llamado Rete II . [ 7 ] A diferencia del Rete original (que es de dominio público), este algoritmo no fue divulgado. Rete II afirma tener un mejor rendimiento para problemas más complejos (incluso órdenes de magnitud [ 8 ] ), y está implementado oficialmente en CLIPS/R2, una implementación en C/++ y en OPSJ, una implementación en Java desde 1998. Rete II proporciona una mejora de rendimiento de aproximadamente 100 a 1 orden de magnitud en problemas más complejos, como lo demuestran las pruebas de rendimiento de KnowledgeBased Systems Corporation [ 9 ] .
Rete II se caracteriza por dos áreas de mejora: optimizaciones específicas relacionadas con el rendimiento general de la red Rete (incluido el uso de memorias hash para aumentar el rendimiento con conjuntos de datos más grandes) y la inclusión de un algoritmo de encadenamiento hacia atrás diseñado para ejecutarse sobre la red Rete. El encadenamiento hacia atrás por sí solo puede explicar los cambios más drásticos en las pruebas comparativas entre Rete y Rete II. Rete II está implementado en el producto comercial Advisor de FICO, anteriormente llamado Fair Isaac [ 10 ].
Jess (al menos en las versiones 5.0 y posteriores) también añade un algoritmo comercial de encadenamiento hacia atrás sobre la red Rete, pero no se puede decir que implemente completamente Rete II, en parte debido a que no hay una especificación completa disponible públicamente.
Red III
A principios de la década de 2000, Charles Forgy desarrolló el motor Rete III en colaboración con ingenieros de FICO. El algoritmo Rete III, que no es Rete-NT, es la marca registrada de FICO para Rete II y se implementa como parte del motor FICO Advisor. Básicamente, es el motor Rete II con una API que permite el acceso al motor Advisor, ya que este último puede acceder a otros productos de FICO. [ 11 ]
Rete-NT
En 2010, Forgy desarrolló una nueva generación del algoritmo Rete. En una prueba comparativa de InfoWorld , el algoritmo fue considerado 500 veces más rápido que el algoritmo Rete original y 10 veces más rápido que su predecesor, Rete II. [ 12 ] Este algoritmo ahora está licenciado a Sparkling Logic, la empresa a la que Forgy se unió como inversor y asesor estratégico, [ 13 ] [ 14 ] como motor de inferencia del producto SMARTS.
Rete-OO
Considerando que Rete tiene como objetivo admitir lógica de primer orden (básicamente sentencias if-then-else ), Rete-OO [ 15 ] tiene como objetivo proporcionar un sistema basado en reglas que admita incertidumbre (donde la información para tomar una decisión es incompleta o inexacta). Según la propuesta del autor, la regla " si Peligro entonces Alarma " se mejoraría a algo como " dada la probabilidad de Peligro, habrá una cierta probabilidad de oír una Alarma " o incluso " cuanto mayor sea el Peligro, más fuerte debería sonar la Alarma ". Para ello, extiende el lenguaje Drools (que ya implementa el algoritmo Rete) para que admita lógica probabilística , como lógica difusa y redes bayesianas .
Véase también
Referencias
- ↑ Charles, Forgy (1982). "Rete: Un algoritmo rápido para el problema de coincidencia de patrones de muchos patrones/muchos objetos". Inteligencia artificial . 19 : 17–37 . doi : 10.1016/0004-3702(82)90020-0 .
- ^ "¡Algoritmo Rete desmitificado! - Parte 1" por Carole-Ann Matignon
- ↑ Ian Wright; James Marshall. "El núcleo de ejecución de RC++: RETE* Un Rete más rápido con TREAT como caso especial" (PDF) . Archivado del original (PDF) el 25 de julio de 2004. Recuperado el 13 de septiembre de 2013 .
- ↑ Anurag Acharya; Milind Tambe (1993). "Collection Oriented Match" (PDF) . Actas de la segunda conferencia internacional sobre gestión de la información y el conocimiento - CIKM '93 . CIKM '93 Actas de la segunda conferencia internacional sobre gestión de la información y el conocimiento. págs. 516–526 . doi : 10.1145/170088.170411 . ISBN 0897916263. S2CID 5159932 . Archivado del original (PDF) el 18-03-2012.
- ↑ Emparejamiento de producción para grandes sistemas de aprendizaje de la colección de informes técnicos de SCS, Escuela de Ciencias de la Computación, Universidad Carnegie Mellon
- ↑ http://dl.acm.org/citation.cfm?id=39946 "TREAT: un nuevo y eficiente algoritmo de emparejamiento para sistemas de producción de IA"
- ↑ RETE2 de Tecnologías de Sistemas de Producción
- ↑ Comparación de CLIPS/R2 con Production Systems Technologies
- ↑ KBSC
- ↑ "¿Qué es Rete III? - Blog de Gestión de Decisiones" . Archivado del original el 8 de agosto de 2014. Consultado el 5 de agosto de 2014 .
- ↑ "¿Qué es Rete III? - Blog de Gestión de Decisiones" . Archivado del original el 8 de agosto de 2014. Consultado el 5 de agosto de 2014 .
- ↑ Owen, James (2010-09-20). "El motor de reglas más rápido del mundo | Sistemas de gestión de reglas de negocio" . InfoWorld . Recuperado el 2012-04-07 .
- ↑ "Es oficial, el Dr. Charles Forgy se une a Sparkling Logic como asesor estratégico" . PR.com. 31 de octubre de 2011. Consultado el 7 de abril de 2012 .
- ↑ "Dr. Charles Forgy, PhD" . www.sparklinglogic.com . Consultado el 7 de abril de 2012 .
- ↑ Sottara, Davide; Mello, Paola ; Proctor, Mark (2010). "Un motor Rete-OO configurable para el razonamiento con diferentes tipos de información imperfecta" . IEEE Transactions on Knowledge and Data Engineering . 22 (11): 1535– 1548. Bibcode : 2010ITKDE..22.1535S . CiteSeerX 10.1.1.713.3826 . doi : 10.1109/TKDE.2010.125 . S2CID 18895309. Archivado del original (PDF) el 10 de enero de 2022. Recuperado el 10 de enero de 2022 .
Enlaces externos
- Algoritmo Rete explicado por Bruce Schneier, Dr. Dobb's Journal (enlace roto)
- Adaptación de la producción para grandes sistemas de aprendizaje – R Doorenbos Descripción detallada y accesible de Rete, que también describe una variante llamada Rete/UL, optimizada para grandes sistemas (PDF)
- Según las reglas (Una breve introducción de Cut-the-knot )
- Introducción al algoritmo Rete
- Sistemas expertos
- Coincidencia de patrones