Algorytm RetePlus
RetePlus jest trybem wykonywania reguł w oparciu o algorytm Rete. Opiera się na pamięci roboczej i agendzie, a także obsługuje negatywne wzorce, powiadamianie obiektów i obiekty logiczne.
RetePlus to rozszerzenie Decision Server oparte na algorytmie Rete. W trybie RetePlus wykonywanie reguł korzysta ze środowiska opartego na pamięci roboczej i agendzie.
Pamięć robocza i porządek obrad
W trybie wykonywania RetePlus mechanizm reguł działa z pamięcią roboczą i agendą, dodając instancje reguł do wykonania, gdy spełnione są warunki.
Pamięć robocza
W trybie wykonywania RetePlus mechanizm reguł na serwerze Decision Server jest sparowany z pamięcią roboczą. Pamięć robocza zawiera wszystkie obiekty znajdujące się w powiązanym obiekcie Engine . Pamięć roboczą można zmodyfikować, dodając instrukcję w części działania reguły lub za pomocą aplikacyjnego interfejsu programistycznego (API). W ten sposób mechanizm reguł jest świadomy obiektów znajdujących się w pamięci roboczej i powiązanych z nimi obiektów. Mechanizm reguł może używać tylko obiektów, które są dostępne z pamięci roboczej.
Plan
agenda to miejsce, w którym Serwer decyzyjny przechowuje reguły, których wzorce są zgodne. Każda reguła wprowadzana do porządku obrad jest tworzona, a jej instancja staje się instancją reguły. Patrz sekcja Instancje reguł.
W porządku obrad są przechowywane instancje reguł, które kwalifikują się do rund. Jeśli porządek obrad jest pusty, wykonanie nie ma żadnego skutku. Instancje reguł umieszczone w porządku dziennym są następujące: zakwalifikowane. Często, w porządku dziennym, kwalifikuje się kilka zasad. W związku z tym mechanizm reguł musi mieć pewien sposób na podjęcie decyzji, która szczególna zasada w porządku dziennym powinna zostać uruchomiona.
W porządku dziennym instancje reguł są uporządkowane zgodnie z trzema kryteriami, które określają regułę, która powinna być uruchamiana jako pierwsza. Dodatkowe sterowanie wykonywaniem jest oferowane wraz z implementacją bardziej złożonych funkcji, patrz sekcja Powiadomienia o obiektach.
- Refrakcja
Instancja reguły, która została uruchomiona, nie może zostać ponownie wstawiona do porządku dziennego, jeśli nie wystąpił żaden nowy fakt, to znaczy, jeśli żaden z obiektów zgodnych z regułą nie został zmodyfikowany, lub jeśli żaden nowy obiekt nie jest zgodny z regułą.
Zasada refrakcji wymusza, że dla danej krotki tworzona jest tylko jedna instancja reguły. Ponieważ jednostka danych dla cyklu mechanizmu jest pamięcią roboczą, mechanizm może łatwo zarejestrować wszystkie możliwe krotki i sprawdzić, czy istnieje tylko jedna instancja reguły dla każdej krotki.
Na przykład należy wziąć pod uwagę następujący zestaw reguł:
class Person { Person(int age, boolean sick); boolean sick; int age; } rule incrementAge { when { p: Person(!sick; age < 50); } then { p.age += 1; update p; } rule cure { when { p: Person(sick); } then { p.sick = false; update p; }Jeśli obiekt
Person(18,true)zostanie wstawiony do pamięci roboczej, to w zasadzie refrakcji zostanie utworzony następujący ślad wykonania:cureincrementAge
Istnieje możliwość dodania właściwości powtarzalnej w regule
incrementAge:rule incrementAge { property com.ibm.rules.engine.repeatable=true; when { p: Person(!sick; age < 50); } then { p.age += 1; }Jeśli obiekt
Person(18,true)zostanie wstawiony do pamięci roboczej, to właściwość powtarzalna tworzy następujące dane śledzenia wykonania:cureincrementAgeincrementAgeincrementAge...incrementAgeDopóki warunek
age < 50nie ma wartości false.
- Powtarzalne reguły
- Aby złamać zasadę refrakcji, można użyć właściwości reguły boolowskiej com.ibm.rules.engine.repeatable. W silniku decyzyjnym należy użyć tej właściwości w celu oznaczenia zestawów reguł, które mają być powtarzalne.
- Jeśli reguła nie jest powtarzalna, zasada refrakcji uniemożliwia ponowne opublikowanie instancji reguły do porządku obrad.
- Jeśli reguła jest powtarzalna, może zostać wstawiona ponownie jako instancja reguły w porządku dziennym, jeśli modyfikacja wystąpi w odniesieniu do jej obiektów warunków.
- Aktualność
Jeśli dwie instancje reguł mają ten sam priorytet, reguła, która jest zgodna z najnowszym obiektem (ostatnio wstawiony, zmodyfikowany lub ponownie śledzony obiekt) jest uruchamiana jako pierwsza.
Priorytet i aktualność są używane do rozstrzygania konfliktów, gdy kilka instancji reguł jest kandydatami do wykonania w tym samym czasie. Jeśli po użyciu wszystkich określonych metod rozwiązywania konfliktów kandydaci pozostają kandydaci, wówczas mechanizm używa wewnętrznych metarułów; zapewnia to, że zawsze następuje ta sama sekwencja wykonywania reguł, biorąc pod uwagę te same warunki.
Przykład reguły wykonania reguły
W poniższym przykładzie reguły technicznej przedstawiono kolejność uruchamiania reguł:
rule init {
when {
angel();
}
then {
insert clown();
insert dascyllus();
}
};
rule last {
priority = -100;
when {
dascyllus();
}
then {
System.out.println("last");
}
};
rule first {
priority = 100;
when {
angel();
clown();
dascyllus();
}
then {
System.out.println("first");
}
};
rule second {
priority = 0;
when {
angel();
dascyllus();
clown();
}
then {
System.out.println("second");
}
};
rule third {
priority = 0;
when {
angel();
clown();
dascyllus();
}
then {
System.out.println("third");
}
};
Załóżmy, że obiekt angel został wstawiony z aplikacji przy użyciu interfejsu API i dlatego został wstawiony do pamięci roboczej i że uruchamiamy wszystkie reguły, które mogą być uruchamiane.
Poniżej znajduje się kolejność uruchamiania reguł:
Reguła
init: Ponieważ obiektangelzostał wstawiony z aplikacji, regułainitjest jedyną regułą, która może zostać uruchomiona. Wstawia on obiektyclown, a następnie obiektdascyllusdo pamięci roboczej. Najnowszym obiektem jest więcdascyllus.Reguła
first: ta reguła jest uruchamiana przed regułąsecond. Najbardziej aktualny obiekt zgodny z tymi dwoma regułami jest taki sam. Jednak pierwszy obiekt ma wyższy priorytet niż drugi, który określa ich kolejność wykonywania.Reguła
second: ta reguła jest uruchamiana przed regułąthird. Drugi i trzeci reguły mają ten sam priorytet, ale obiektdascyllusjest bardziej aktualny niż obiektclown.Reguła
third: ta reguła jest uruchamiana przed regułąlast. Mimo że obiektdascyllusjest nowszy niżclown, regułathirdma wyższy priorytet niż regułalast.last.
Instancje reguł
Instancja reguły jest dodawana do porządku dziennego, gdy obiekty w pamięci roboczej spełniają warunek tej reguły.
Zastanówmy się nad następującą zasadą techniczną:
rule rule1 {
when {
Fish(color == green; type == shark);
Fish(type == trigger);
}
then {...}
};
Następujące instancje reguł zostaną umieszczone w porządku dziennym:
| Reguła | Reguła | Reguła | Reguła |
|---|---|---|---|
| rule1(A, C) | rule1(A, D) | rule1(B, C) | rule1(B, D) |
W tym przykładzie można zauważyć, że instancja reguły jest pojęciem dynamicznym: instancja reguły jest tworzona przez dowolną kombinację obiektów w pamięci roboczej, które są zgodne z wzorcami określonymi w regule. Z kolei reguła jest pojęciem statycznym.
Wzorce negatywne
Standardowe warunki reguły mogą być opisane jako egzystencjalne, w tym sensie, że można je dopasować za pomocą jednego lub kilku obiektów, które rzeczywiście istnieją. W trybie wykonywania RetePlus istnieje komplementarna koncepcja znana jako wzorce negatywne. Aby wyrazić nieistnienie określonego obiektu w pamięci roboczej, należy umieścić słowo kluczowe not przed warunkiem, w którym znajduje się obiekt, jak pokazano poniżej:
not Fish(type==eel);
Ten ujemny wzorzec powoduje pomyślne dopasowanie, ponieważ nie istnieje żaden obiekt pasujące do odpowiadającego mu wzorca dodatniego:
Fish(type==eel);
I odwrotnie, ten negatywny wzór:
not Fish(type==angel);
nie powoduje pomyślne dopasowanie z prostego powodu, dla którego istnieje obiekt zgodny z odpowiednim wzorcem:
Fish(type==angel);
Powiadomienia o obiektach
W trybie wykonywania RetePlus dostępne są instrukcje sterowania poszczególnymi operacjami:
Wstawienie obiektu
Instrukcja insert umożliwia utworzenie nowego obiektu i wstawienie go do pamięci roboczej. Po tym słowie kluczowym występuje nazwa klasy oraz wartości atrybutów obiektu, który ma zostać utworzony.
Poniżej przedstawiono przykład, który obejmuje utworzenie nowego obiektu Course , którego atrybuty department i number przyjmują wartości odpowiednio History i 324:
insert Course(History,324);
Istnieją dwie możliwości przetwarzania operacji insert :
Obiekt znajduje się już w pamięci roboczej. W tym przypadku operacja wstawiania jest równoznaczna z aktualizacją.
Obiekt nie znajduje się w pamięci roboczej. W tym przypadku obiekt jest wstawiany do pamięci roboczej, a demon wstawiania odpowiedniej klasy i jego nadklas, jeśli istnieje, jest wywoływany, a porządek obrad jest aktualizowany.
Ponowienie obiektu
Instrukcja retract umożliwia usunięcie z pamięci roboczej obiektu, który jest powiązany ze zmienną reguły.
W poniższym przykładzie operacja podstawowa retract usuwa obiekt powiązany ze zmienną ?c :
rule RemoveCourse {
when {
?c: Course(department == History; number == 254);
}
then {
retract ?c;
}
};
Demon retract odpowiedniej klasy, jeśli istnieje, jest wywoływany, a porządek obrad jest odpowiednio aktualizowany. Ponowne śledzenie obiektu z pamięci roboczej może spowodować utratę przez obiekt logiczny jednego lub kilku jego uzasadnień.
Aktualizacja obiektu
Gdy obiekt jest modyfikowany przez program Java™, modyfikacje nie są widoczne w produkcie Decision Server. Oznacza to, że dane obsługiwane przez produkt Decision Server nie będą spójne z nową treścią zmodyfikowanego obiektu.
Aby uniknąć niespójności, instrukcja update powinna zostać wywołana dla takiego obiektu. Ta instrukcja umożliwia serwerowi decyzyjnym aktualizowanie struktur wewnętrznych zgodnie z nową treścią zmodyfikowanego obiektu.
W następującej regule pierwsze działanie modyfikuje atrybut liczbowy. Następnie operacja podstawowa update jest wywoływana w celu poinformowania serwera Decision Server o tym, że obiekt został zmodyfikowany.
rule NumberingUpdate {
when {
?c: Course(department equals "history"; number > 300);
}
then {
?c.updateNumbering(); // This call modifies ?c
update ?c;
}
};
Jeśli produkt modifynie jest używany, należy użyć operacji podstawowej update , aby poinformować serwer decyzyjny o tym, że obiekty zostały zmodyfikowane. Rezygnacja z powiadomienia Decision Server o modyfikacjach prowadzi do niespójnych stanów.
Operacja sieciowa
Sieć RetePlus może zminimalizować liczbę reguł i warunków:
Operacja sieci RetePlus
Siatka RetePlus indeksuje reguły tak, aby zminimalizować liczbę reguł i warunków, które muszą być wartościowane za każdym razem, gdy pamięć robocza zostanie zmieniona. Sieć minimalizuje liczbę ocen, dzieląc się testami między regułami i przyrostowo propagować zmiany. Po zakończeniu wszystkich testów sieć wyznacza regułę.
W większości przypadków wykonywanie reguły modyfikuje pamięć roboczą. Obiekty w pamięci roboczej przywoływane przez te reguły mogą być wstawiane, usuwane i modyfikowane. Sieć przetwarza zmiany, o których mowa w wyniku wykonania reguły, i tworzy nowy zestaw reguł do wykonania.
Gdy w pamięci roboczej wystąpi zmiana, może się zdarzyć, że dwie rzeczy mogą się zdarzyć, w zależności od rodzaju zmiany:
Jeśli istnieje wstawianie obiektu do pamięci roboczej (dodatniej), reguła może zostać wykonana.
Jeśli istnieje usunięcie obiektu z pamięci roboczej (ujemnej), reguła musi zostać usunięta z porządku obrad. Porządek obrad to miejsce, w którym utrzymany jest obecny zbiór zasad, które mają być wykonane.
Proces ten jest cyklicznie powtarzany do momentu, aż w porządku dziennym nie zostanie pozostawiona żadna kolejna instancja reguły.
Warunek not zwraca wartość true w przypadku warunku prostego, jeśli pamięć robocza nie zawiera żadnego obiektu, który może być zgodny z warunkiem.
Przykład sieci RetePlus
Aby zilustrować nasz opis sieci RetePlus, skorzystamy z trywialnej reguły filter , napisanej w języku reguł, która odnosi się do klas o nazwach A, Bi C:
rule filter {
when {
A (a1==3; ?x:a2);
B (b1==2; ?y:b2; b3==?x);
C (c1==?y);
}
then {
System.out.println("filter");
}
}
Atrybuty klasy są następujące:
Klasa
Ama dwa atrybuty o nazwacha1ia2.Klasa B ma trzy atrybuty o nazwach
b1,b2ib3.Klasa
Cma jeden atrybut o nazwiec1.
Załóżmy, że pamięć robocza zawiera następujące obiekty:
A( a1=3 a2=10 )
B( b1=2 b2=4 b3=10 )
B( b1=2 b2=7 b3=10 )
C( c1=4 )
Struktura sieci RetePlus
Sieć RetePlus może być reprezentowana jako wykres złożony z trzech stref:
- Drzewo dyskryminacji
Dyskryminacja drzewo to proces dopasowywania wzorca, który wykonuje testy. Testy te są reprezentowane przez diamentowe kształty w górnej części sieci. Testy dotyczą klas obiektów i wartości ich atrybutów. Dane wejściowe dla tego drzewa składają się z tokenów reprezentujących każdy z bieżących obiektów w pamięci roboczej.
Gdy wzorzec dotyczy tylko jednego obiektu i jego atrybutów, jest on powtarzany jako test dyskryminacji. Gdy jest to kombinacja, jest ona nazywana łączeniem; te pojawiają się w dolnej części wykresu.
- Węzły alfa
Węzeł alfa jest tworzony na następnym poziomie sieci, dla każdego tokenu, który przekazuje testy drzewa dyskryminacji. Każdy węzeł składa się z jednego lub kilku leksemów, reprezentowanych przez okrągłe zakręcone prostokąty (na rysunku znajdują się trzy węzły alfa). Jeden węzeł alfa zawiera dwa leksemy klasy B. Pozostałe dwa węzły zawierają tylko jeden znacznik klasy-odpowiednio-tokeny klasy A i klasy C.
- Testy i krotki
Trzecia strefa sieci jest zgodna z tokenami kilku klas obiektów. Wynikowe węzły są nazywane krotkami, które będą składać się z kilku tokenów. Test równości między atrybutami
a2ib3powoduje powstanie węzła składanego z dwóch par leksemów, a test między atrybutamib2ic1następnie odfiltrowuje triplet leksemów. W sieci RetePlus często odwołujemy się do krotek tego typu jako węzłów join .
Dodawanie obiektów
Aby zademonstrować ten pomysł w sieci RetePlus, przypuśćmy, że dodatkowy obiekt zostanie wstawiony do pamięci roboczej. Dodany obiekt jest klasy C, a wartość jego atrybutu c1 to 7.
C( c1=7 )
Na tym etapie, gdy wszystkie testy węzłów są przeprowadzane, tylko trzeci test C (c1==?y); (class
of object = C) jest spełniony. Testy węzłów podrzędnych są kontynuowane w miarę, jak token jest zstępujący przez sieć.
W tym miejscu nie ma węzła podrzędnego w drzewie dyskryminacji. Z tego powodu obiekt jest przechowywany bezpośrednio w węźle alfa.
Gdy token osiągnie drugi węzeł łączenia B (b1==2; ?y:b2; b3==?x), test jest przeprowadzany między każdym obiektem B par zapisanych obok pamięci węzła łączenia i obiektem C zawartym w znaczniku, który właśnie dotarł do węzła łączenia. Test jest spełniany dla obiektu B drugiej pary. W związku z tym możemy kontynuować i utworzyć triplet utworzony przez drugą parę i obiekt w tokenie.
Tworząc ten tryplet, w rzeczywistości zstąpimy po całej sieci, a nowa instancja reguły filter może zostać wykonana.
Usunięcie obiektu
Załóżmy, że teraz usuwamy obiekt, który właśnie dodaliśmy do pamięci roboczej.
Postęp leksem przez drzewo dyskryminacji jest taki sam, jak w przypadku dodawania obiektów, ale pojaw się ujemnego tokenu w węźle alfa powoduje usunięcie obiektu zawartego w tokenie.
Gdy token dociera do drugiego węzła łączenia, wszystkie trójki zawierające obiekt w tokenie są usuwane, a token kontynuuje jego postęp w sieci.
Podobnie jak w przypadku dodawania obiektów, węzeł reguły jest osiągalny. Instancja reguły filter , której obiekty spełniają warunki odpowiadające obiektom w tokenie, są usuwane z porządku obrad.