Frage

Ich bin der Gestaltung einer Regelauswertung System, das eine Tatsache, Datenbank und bestimmte Regeln über die Datenbank zu handhaben müssen. Wir haben derzeit eine Version von RETE modifiziert, die mit einigen Nachteilen teilweise richtig funktioniert.

Das Problem ist, die Regeln nicht auf exakte Übereinstimmungen beschränkt, sondern sie müssen auch Ungleichheit unterstützen (wie in weniger als) und anderen Arten von Fuzzy-Berechnungen.

Beispiele: Angenommen, Sie diese Fakten haben

(Gehalt John 58000) (Gehalt Sara 78000) (Employee John) (Boss Sara) (Married John Sara) (Works John Stackoverflow)

Sie können eine Regel haben, die sagt:

(Gehalt? W <60000) / \ (Married? W) / \ (Works? W Stackoverflow) ==> Was

Offensichtlich wird das Ergebnis die Regel mit einem? W Wert von „John“ auslösen werden, aber die Art, wie wir das jetzt tun ist durch Schleife Trog jedes Element in der Faktenbasis, die die beggining des ersten Ausdrucks entspricht (Gehalt XX ) und dann den Vergleich machen und die Ergebnisse in der Faktenbasis es sich von selbst zu speichern. Zum Beispiel, nach dem ersten Durchlauf werden Sie den folgenden Artikel der Faktenbasis hinzugefügt haben:

(Gehalt John 58000 <60000)

und einmal, dass gemacht wird Sie führen das auf die übliche Art und Weise RETE verbindet. Auf diese Weise dauert es viel Platz in der Faktenbasis nach oben, besonders weil der Regel auf eine beliebige Anzahl verweisen können und so haben Sie diese „berechnet“ Fakten, solange die Regel aktiv ist.

Auf der anderen Seite Sie mehrere Regeln mit dem ersten Ausdruck anwenden können, und Sie können den Standard-Matching-Algorithmus halten mit den Regeln auszulösen.

Kennt jemand von irgendwelchen Mustern, Referenzen oder Methoden, die diese Art von Verhalten umgehen? Die üblichen LEAPS, TREATS, RETE Algorithmen nur behandeln (soweit ich weiß) "exakt" Matching.

By the way, das ist C # .NET.

War es hilfreich?

Lösung

CLIPS bedingte Elemente für so lange, wie ich es bewusst gewesen bin unterstützt hat - mindestens 15 Jahre. Schauen Sie sich die grundlegende Programmieranleitung für CLIPS und diese CLIPS Tutorial für Beispiele. Sie können sehen (oder modifizieren), um die Clips Quelle kostenlos.

CLIPS verwendet Notation Präfix, so dass Ihr Beispiel bedingte aussehen könnte:

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

Andere Tipps

Soweit ich das Problem zu verstehen, alle Fuzzy-Regeln teilen Integer- oder Gleitkommawert Bereiche in eine begrenzte Anzahl von Teilbereichen auf. Zum Beispiel, wenn ein Gehalt 58000, 60000, 78000 Werte verglichen wird, haben Sie 4 Bereiche:. <58000, 58000 bis 60000, 60000 bis 78000,> 78000

Wenn das der Fall ist, vielleicht können Sie Ihre Variablen neu definieren ganze Zahlen sein, die entweder 0,1,2,3 und damit Ihre Ungleichheit Regeln für die Gleichstellung Regeln umwandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top