Pergunta

Eu estou projetando um sistema de avaliação de regra que precisa lidar com um banco de dados fato e de certas regras sobre o banco de dados. Atualmente, temos uma versão modificada da RETE que funciona parcialmente certo com alguns inconvenientes.

O problema é que as regras não limitam a correspondências exatas, mas eles também devem desigualdade apoio (como em menos de) e outros tipos de cálculos fuzzy.

Os exemplos, suponha que você tenha este fatos

(Salário John 58000) (Salário Sara 78000) (Employee John) (Boss Sara) (Casado John Sara) (Works John Stackoverflow)

você pode ter uma regra que diz:

(Salário? W <60000) / \ (Married? W) / \ (Works? W Stackoverflow) ==> Whatever

Obviamente, o resultado será provocando a regra com um? W valor de "John", mas a maneira que nós estamos fazendo isso agora é por looping através de cada elemento na base de fatos que coincide com o início da primeira expressão (Salário XX ) e, em seguida, fazendo a comparação e armazenando os resultados na base de facto, auto. Por exemplo, após a primeira passagem você terá o seguinte item adicionado à base fato:

(Salário John 58000 <60000)

e uma vez que é feita de executar a junta no caminho RETE habitual. Dessa forma, ele ocupa muito espaço na base de verdade, especialmente porque regra pode se referir a qualquer número e então você tem esses fatos "calculados", desde que a regra está ativo.

Por outro lado, você pode aplicar várias regras com a primeira expressão e você pode continuar usando o algoritmo de correspondência padrão para acionar as regras.

Alguém sabe de quaisquer padrões, referências ou métodos que lidam com este tipo de comportamento? Os saltos habituais, trata, algoritmos RETE apenas lidar com (tanto quanto eu sei) "exata" correspondente.

A propósito, este é C # .NET.

Foi útil?

Solução

CLIPS apoiou elementos condicionais durante o tempo que eu estive ciente disso - pelo menos 15 anos. Confira o guia básica de programação para CLIPS e este CLIPS tutorial para exemplos. Você pode olhar (ou modificar) a fonte clips gratuitamente.

CLIPS usa prefixo notação, para que o seu exemplo pode condicional olhar como:

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

Outras dicas

Tanto quanto eu entendo o problema, todas as regras fuzzy dividir valor inteiro ou ponto flutuante varia em um número limitado de subranges. Por exemplo, se um salário é comparado com 58000, 60000, 78000 valores, você tem 4 faixas:. <58000, 58000-60000, 60000-78000,> 78000

Se for esse o caso, talvez você possa redefinir suas variáveis ??para ser inteiros que são ou 0,1,2,3, e, assim, converter as regras de desigualdade com as regras de igualdade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top