Jarosław Kijanowski
Diabeł tkwi w regułach
Streszczenie:
Jeśli jesteś programistą, architektem, czy też analitykiem biznesowym, warto się zapoznać przynajmniej z pierwszym rozdziałem artykułu, ponieważ zawiera on skrócony opis silników reguł, które w znaczący sposób poprawiają czytelność i zwiększają łatwość w zarządaniu, obsłudze oraz konserwacji programów podejmujących decyzje na podstawie stanu zamodelowanej w programie rzeczywistości oraz wydarzających się zdarzeniach.
Artykuł zawiera wstęp do zagadnienia siliników reguł, opis instalacji Eclipse IDE oraz jego konfiguracji wpsarcia dla silnika reguł Drools.
- Silnik reguł
- Drools
- Zalety silnika reguł Drools
- BRMS
- Reguły produkcji a zdarzenia
- Cyt! Uwaga! Zaczynamy!
- Jak to działa?
- Podsumowanie
- Silniki reguł
-
wyznaczaniu zniżek i promocji w sklepach na podstawie ilości wybranych artykułów oraz historii zakupów
-
ustalaniu wysokości kwot polisy ubezpieczeniowej uzależnionej od wieku, okresu posiadania prawa jazdy oraz wartości pojazdu
-
diagnozowaniu chorób
-
wykrywaniu groźby awarii
-
rozwiązywaniu zagadek
- Drools
- Zalety silnika reguł Drools
-
oddzielenie programu od warunków sterujących jego wykonaniem
-
reguły są przechowywane w osobnych plikach
-
reguły mogą być modyfikowane przez różne grupy osób
-
zmiana reguł nie wymaga rekompilacji programu oraz jego ewentualnego ponownego osadzania w kontenerze aplikacji
-
położenie wszystkich reguł w jedym miejscu oznacza prostze zarządzanie elementami sterującymi wykonaniem programu
-
reguły w prosty i przyjazny sposób zastępują zagnieżdżone, złożone bądź liczne konstrukcje typu if - then
-
język reguł nie jest trudny do opanowania
-
dostępne są wtyczki do zintegrowanych środowisk programistycznych, takich jak Eclipse, podpowiadające składnię oraz obrazujące drzewko RETE
-
rozwiązanie problemu nie odbywa się za pomocą skomplikowanego algorytmu, lecz przy użyciu prostych reguł
-
deklaratywny model programowania (declarative programming) pozwala określić CO chcemy rozwiązać, a nie W JAKI SPOSÓB; o to jak problem zostanie rozwiązany, "martwi" się silnik reguł
-
wyrażanie rozwiązania bywa znacznie prostsze przy pomocy reguł, które przeważnie jest zarówno łatwiej zdefiniować jak i odczytać i zrozumieć
-
dostęp do "toku rozumowania" silnika, pozwalający na poznanie przyczyn podjętej decyzji
- BRMS
- Reguły produkcji a zdarzenia
- Cyt! Uwaga! Zaczynamy!
- Jak to działa?
- Podsumowanie
Silnik reguł (rule
engine) to program, który bazując na wiedzy podejmuje decyzje. Wiedza i
decyzje zapisywane są w postaci reguł zwanymi także regułami produkcji
(production rules). Innymi słowy reguły produkcji
skłądają się z warunku oraz akcji, które są uruchamiane, gdy warunki są
prawdziwe. Ponadto istenieje baza faktów, zwana pamięcią roboczą (working
memory), która odwzorowuje obecny stan rzeczywistości. Stan ten może
ulegać zmianie. Istnieje bowiem możliwość dodania, usunięcia bądź
modyfikacji faktów w wyniku uruchomienia akcji reguł. Należy jeszcze
zwrócić uwagę na konflikty, które powstają, gdy w danej chwili
spełnionych jest więcej reguł, niż jedna. Rozwiązaniem jest wówczas
agenda, która ustala porządek szeregując gotowe do uruchomienia akcje.
Jest to niezwykle ważny element silnika reguł, gdyż wywołanie akcji
jednej reguły może spowodować unieważnienie innej reguły wraz z
odpowiadającą jej akcją.
Silnik reguł można zatem zobrazować w następujący sposób:
Silniki reguł najczęscięj wykorzystywane są przy:
Jedną z dostępnych na rynku otwartego oprogramowania
implementacją silnika reguł jest Drools. Jest to biblioteka rozpowszechniana na licencji
Apache zarówno w postaci binariów jak i źródeł. Pobieranie, używanie
jak i rozprowadzanie we własnych aplikacjach jest bezpłatne.
Sercem silnika reguł jest maszyna wnioskująca (inference
engine). Jej zadanie polega na dopasowaniu faktów do reguł (pattern
matching), aby na tej podstawie wyciągnąć wnioski, które skutkują
wywołaniem akcji. Owe dopasowanie realizowane jest przez algorytm RETE,
który został rozszerzony o elementy obiektowości.
Jak już wspomniałem, wiedza zapisywana jest w postaci reguł
produkcji. Reprezentacja wiedzy (knowledge representation), czyli sposób na
udostępnienie silnikowi reguł informacji, odbywa się przy użyciu logiki
pierwszego rzędu (FOL
- first order logic), pozwalającej badać prawdziwość twierdzeń, takich
jak 2 + 3 == 5, czy też klient.wiek > 17.
Podstawowe elementy reguły to warunki oraz akcje:
when
Klient (wiek > 17)
then
System.out.println("Klient jest dorosły.");
Powyższa reguła zostanie spełniona dla wszystkich faktów, które reprezentują klientów pełnoletnich. Porównywalne zapytanie SQL do bazdy danych przechowującej klientów wyglądałoby następująco:
SELECT * from Klienci k WHERE k.wiek > 17
Istnieją dwa sposoby na wyznaczenie prawdziwości reguły, a w
efekcie uruchomienia jej akcji. Wnioskowanie
w przód jest napędzane faktami. Poszukiwane są reguły, których warunki
są prawdziwe dla faktów znajdujących się w pamięci roboczej. Akcje mogą
zmieniać stan pamięci roboczej, co z kolei może spowodować prawdziwość
następnych reguł. Proces dopsaowywania reguł do faktów kończy się w
chwili, gdy nie istnieje ani jedna reguła, której warunek jest
prawdziwy. Wnioskowanie w tył z kolei jest napędzany celami.
Wybierane są te reguły, których akcje można dopsaować, czy też
powiązać, z założonym celem, a następnie sprawdzana jest prawdziwość
tych reguł, czyli obecność potwierdzających faktów.
Zatem silnik reguł należy stosować wówczas, kiedy rozwiązanie problemu wydaje się skomplikowane, algorytm posiada wiele złożonych konstrukcji warunkowych typu if - then, czy też switch. Również w przypadku, gdy logika, na której oparte jest sterowanie programu, jest często zmieniana, lub jest zarządzana przez osoby nie posiadające możliwości, narzędzi, czy też wiedzy dotyczącej rekompilacji programu, stosowanie reguł jest zasadne.
Drools to nie tylko silnik reguł. Otrzymujesz także system zarządzania regułami (Business Rules Management System). Pozwala on na pisanie, zarządzanie oraz przechowywanie reguł a także na tworzenie ich kolejnych wersji. Umożliwia przypisanie poszczególnym użytkownikom ról, w celu wygodnego wdrożenia polityki bezpieczeństwa. Analityk może mieć prawo modyfikacji reguł, podczas gdy programista już tylko prawo do odczytu. BRMS jest zatem centralnym ośrodkiem gromadzenia reguł.
Reguły produkcji to konstrukcje typu warunek (when) - akcja (then). Na przykład, gdy mamy do czynienia z klientem, który posiada prawo jazdy krócej niż 5 lat, to zaproponujemy najdroższą ofertę. Innym typem reguł są zdarzenia (event condition action). Wówczas silnik reguł operuje na wzorcach zdarzeń z którymi porównywane są rejestrowane zdarzenia. Przykładowymi zdarzeniami, na które należy zareagować akcją, może być sprzedanie ostatniej sztuki towaru, czy też awaria sygnalizacji świetlnej. Należy także zwrócić uwagę na sposób uruchomienia akcji obu typów reguł. W przypadku reguł produkcji, to programista wybiera moment, w którym silnik reguł rozpoczyna wykonywanie akcji. Natomiast w przypadku silnika reguł opartego o zdarzenia, to one wyznaczają moment uruchomienia akcji.
... od instalacji środowiska. Wybiorę eclipse'a, ponieważ jest wystarczająco dobry, a ponadto Drools dostarcza wtyczki ułatwiającej pisanie reguł.
Eclipse IDE, Eclipse IDE for Java EE Developers (eclipse-jee-europa-winter-linux-gtk.tar.gz)
Następnie rozpakujemy i uruchomimy eclipse'a. Wybieramy z menu Help -> Software Updates -> Find and install... -> Search for new features to install -> New Remote Site...
URL można znaleźć na stronie domowej Drools w sekcji "Drools IDE Update Site", jest to skrót do wtyczki, np. w przypadku Drools 4.0.7 Eclipse Workbench for Europa 3.3 to http://downloads.jboss.com/drools/updatesite3.3/
Klikamy OK i Finish. Eclipse zgłosi wynik wyszukiwania:
Klikamy Next, przeczytawszy akceptujemy licencję i ostatni raz Finish, w celu pobrania wtyczki. Następnie wyświetlone zostanie okienko, które "gasimy" wciskając "Install all". Zapytawszy o restart eclipse'a wybieramy "Yes", po czym weryfikujemy instalację - pojawienie się nowej ikonki Drools oznacza sukces.
Przyjrzyjmy się pierwszej aplikacji. Klikamy na ikonę "głowki" i wybieramy "New Rule Project".
Podajemy nazwę projektu i wybieramy Finish. Wtyczka zadbała o rozkłąd katalogów oraz dostarczyła niezbędne biblioteki. W celu uruchomienia aplikacji wybieramy plik com.sample.DroolsTest i wciskamy "Shift + Alt + X" a następnie "J". Na ekranie pojawi się:
Hello World
Goodbye cruel world
Przykład został dokładnie opisany w dokumentacji Drools. Całkowicie pominę, co się dzieje w DroolsTest.java, czyli kwestie związane z uruchomieniem silnika reguł oraz wgraniem pliku reguł. Najciekawsza część i tak została umieszczona w regułach, pliku Sample.drl.
W pliku tym znajdują się dwie reguły. Na początku w pamięci roboczej istnieje dokładnie jeden obiekt klasy Message, którego pola message są równe "Hello World", a status wynosi "0". W chwili uruchomienia silnika (fireAllRules() ), wykonywane są wszystkie przez agendę uszeregowane akcje. Należy pamiętać, że reguły sprawdzane są w chwili dodawania obiektów do pamięci roboczej. Reguła pod nazwą "Hello World" jest prawdziwa, ponieważ istnieje w pamięci roboczej obiekt klasy Message, którego pole status wynosi "0". Zatem uruchomiona zostanie akcja tej reguły. W wyniku jej działania, obiekt zostanie zmodyfikowany, zmieni się zarówno pole message, jak i status. Polecenie update() wymusi na silniku reguł ponowne sprawdzenie prawdziwości wszystkich reguł. Tym razem reguła pod nazwą "GoodBye" jest prawdziwa i wykoanana zostanie jej właśnie akcja.
Krótki wstęp do silników reguł oraz przykładowej implementacji Drools przedstawił podstawowe cechy i obszary zastosowań tego typu oporogramowania. W ramach dalszej lektury polecam dokumentację projektu Drools.
Możesz skomentować ten artykuł.