Drools I

UWAGA Ukończenie wszystkich ćwiczeń z tego laboratorium jest konieczne do rozpoczęcia pracy na następnych zajęciach!!!

Aby móc korzystać z Drools w Eclipse należy odpowiednio go skonfigurować. W systemie jest zainstalowana awersja Eclipse z wgraną wtyczką do obsługi Drools, ale konieczne jest ustawienie ścieżki do runtime'u Drools w Eclipse. W tym celu, po uruchomieniu eclipse:

  1. Wejdź w Window→Preferences.
  2. Z drzewka po prawej wybierz Drools/Installed Drools Runtime.
  3. Następnie zaznacz runtime znajdujacy sie na liście i wybierz kliknij na przycisk Edit.
  4. Wskaż katalog drools-runtime znajdujacy siew katalogu /usr/local/eclipse/drools-runtime.
  5. Upewnij się, że runtime jest zaznaczony na liście i uruchom ponownie środowisko.

Wstęp

Utworzenie projektu Drools

  1. Kliknij File→New→Project→Drools→Drools Project
  2. Podaj nazwę projektu i kliknij Next
  3. Zaznacz opcje jak na obrazki i kliknij Next
  4. Upewnij się, że projekt jest związany z jakimś Drools runtime i kliknij Finish.

Struktura projektu Drools

Podział kodu źródłowego

Kod źródłowy projektu Drools dzieli się na dwie części:

  1. Katalog src/main/java gdzie znajduje się kod w języku Java odpowiedzialny za uruchamianie wnioskowania oraz definicje klas wykorzystywanych w bazie wiedzy
  2. Katalog src/main/rules w którym znajdują się definicje reguł i diagramy DroolsFlow.

Podstawowa składnia reguł

Reguły w Drools budowane są według następującego schematu:

rule "NazwaReguły"
  // Opcje charakteryzujace regułę
when
  // Część warunkowa
then
  // Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end

W przykładzie „Hello World” w Eclipse w części warunkowej pojawia się następująca linijka:

m : Message( status == Message.HELLO, myMessage : message )

Należy ją czytać tak: Jeśli w bazie faktów istnieje obiekt klasy Message, taki że jego pole status jest równe polu Message.HELLO, to niech m będize uchwytem do tego obiektu a myMessage uchwytem do pola tego obiektu o nazwie message.

Inaczej mówiąc operator : (dwukropek) działa tutaj podobnie jak operator przypisania a polecenie podobne wywołaniu konstruktora klasy Message jest tak naprawdę instrukcja warunkową.

Uruchomienie wnioskowania w "Hello World"

W pliku DroolsTest.java zamieszczony jest kod odpowiedzialny za stworzenie bazy wiedzy, dodanie faktów i uruchomienie wnioskowania. metoda

private static KnowledgeBase readKnowledgeBase() throws Exception

odpowiedzialna jest za stworzenie bazy wiedzy na podstawie plików z regułami.

Pliki z regułami muszą być przekazane do obiektu KnowledgeBuilderFactory. Odpowiedzialna jest za to następująca linijka:

...
kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
...

Fakty muszą również zostać dodane do bazy faktów (reprezentowanej przez obiekt klasy StatefulKnowledgeSession:

...
 
// stworzenie obiektu-faktu
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
 
// dodanie obiektu-faktu do bazy wiedzy
ksession.insert(message);
...
Ćwiczenie

Uruchom projekt „Hello World”. Zmodyfikuj klasę Message dodaj±c jeszcze jedno pole enumerate o wartości CONVERSATION. Zmodyfikuj regułę Hello tak aby zmieniała status na CONVERSATION. Dopisz regułę odpowiadajacą temu polu. Uruchom projekt.

Cashpoint

Utwórz kolejny projekt analogicznie jak poprzednio, zaznaczając również aby zostały wygenerowane przykłady HelloWorld i DroolsFlow. Następnie postępuj według wskazówek, modyfikując przykładowe pliki.

Opis

System powinien modelować zachowanie typowego bankowemu. Użytkownik podaje bankomatowi swój PIN a następnie może wykonać jedną z następujących operacji:

  1. wypłata gotówki
  2. sprawdzenie salda na koncie

Bankomat ma pewien limit gotówki jaka może wypłacić. Konto użytkownika też ma ograniczone saldo.

Bankomat może odmówić transakcji i zatrzymać kartę po trzech niepoprawnych wpisaniach numeru PIN.

Klasy

Dodaj następujące klasy do swojego projektu do katalogu src/main/java:

Reguły

Zapisz następujące reguły. Umieść je w dwóch plikach: Autoryzacja oraz Akcja.

Aby dodać nowy plik reguł kliknij prawym przyciskiem myszy na nazwę projektu, a następnie New→Other…→Drools/Rule.

  1. Wybierz projekt i katalog w którym ma być umieszczony plik z regułami (<NAZWAPROJEKTU>/src/main/rules),
  2. wpisz nazwę pliku z regułami i nazwę pakietu (com.sample) i kliknij Finish.

Plik: Autoryzacja Napisz reguły sprawdzające poprawność PINu i w razie gdy PIN został wpisany poprawnie ustawiające wartość pola autoryzacja na true. Zakładamy, że pole poprawnyPin,saldo,wpisanaKwota,limitGotowki są polami których wartości są ustalane na razie odgórnie.

Nazwa regułyWarunekAkcja
InvalidPINpoprawnyPIN != wpisanyPIN && iloscProb < 3 iloscProb++
BlockAccountpoprawnyPIN != wpisanyPIN && iloscProb == 3 blokada=true
AuthGrantedpoprawnyPIN == wpisanyPIN && iloscProb < 3 autoryzacja=true

Plik: Akcja Napisz reguły odpowiedzialne za akcje bankomatu:

Nazwa regułyWarunekAkcja
PayOut autoryzacja == true && wybranaAkcja == wyplata && wpisanaKwota ⇐ saldo && wpisanaKwota⇐limitGotowki „Wyplacam pieniadze”
CahspointLimit autoryzacja == true && wybranaAkcja == wyplata && wpisanaKwota ⇐ saldo && wpisanaKwota>limitGotowki „Za malo pieniedzy w bankomacie!”
AccountLimit autoryzacja == true && wybranaAkcja == wyplata && wpisanaKwota > saldo „Za malo srodkow na koncie”
Balance autoryzacja == true && wybranaAkcja == saldo „Twoje saldo to: ”
Unauthorized autoryzacja == false && blokada == true „Brak autoryzacji, blokuje karte”

Sterowanie wnioskowaniem

Zmodyfikuj plik z katalogu src/main/java/ odpowiedzialny za uruchamianie wnioskowania, tak aby oba pliki z regułami zostały dodane do abzy wiedzy. Stwórz obiekty klas Konto i Bankomat i dodaj je do bazy faktów.

Uruchom wnioskowanie. System prawdopodobnie nie będzie działać poprawnie, albo wpadnie w pętle nieskończoną. Podczas wywoływania update silnik wnioskujący przetworzy jeszcze raz wszystkie reguły, łącznie z tą która wywołała update. Taka sytuacja może powodować zapętlenie się wnioskowania jeśli warunki uruchomienia reguł nie zabezpieczają takiej sytuacji w 100%. Aby oznaczyć regułę jako taka, która powinna być przetworzona tylko raz w cyklu wnioskowania, należy dopisać no-loop przed częścią warunkową:

rule "NazwaReguły"
  no-loop
when
  // Część warunkowa
then
  // Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end

Aby wskazać silnikowi wnioskującemu kolejność uruchamiania reguł, można użyć pola salience, określającego priorytet reguły. Im wyższa wartość salience, tym wyższy priorytet. Reguły o wyższym priorytecie uruchamiane są w pierwszej kolejności.

rule "NazwaReguły"
  no-loop
  salience 10
when
  // Część warunkowa
then
  // Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end

Można również korzystać z mechanizmu grupowania reguł w moduły (tutaj agendy). Więcej na ten temat można znaleźć w dokumentacji.

Ćwiczenie

Wykorzystując atrybut salience oraz no-loop popraw działanie systemu ekspertowego.

Konfiguracja Eclipse

Dla chętnych, którzy będą chcieli przyjrzeć się DroolsExpert i DroolsFlow bliżej, poniżej zostały przedstawione zostały kroki konfiguracji Eclipse do współdziałania z pakietem JBoss Rules:

  1. Pobierz Eclipse wersji 3.5 (najnowsza wersja nie działa z Drools 5).
  2. Wejdź w Help→Software updates…→Available Software→Add Site.. i dodaj nowy link http://download.eclipse.org/tools/gef/updates/releases/ a następnie zainstaluj najnowszą wersje Graphical Editing Framework GEF. Na koniec Accept.
  3. Po zainstalowaniu pluginu GEF dodaj kolejną stronę: http://downloads.jboss.com/drools/updatesite3.5/ i zainstaluj pakiet JBoss Rules.
  4. Zbuduj runtime. Wejdź w Window→Preferences→Drools/Installed Drools Runtime. Kliknij Add a następnie Browse i wskaż katalog w którym chcesz przechowywać runtime (najlepiej niech to będzie katalog wewnątrz katalogu clipse o nazwie drools-runtime. Na sam koniec kliknij na Generate New Runtime i po wygenerowaniu i zaakceptowaniu, upewnij sie że runtime jest zaznaczony na liście.

Komentarze

Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab. 8-)

pl/dydaktyka/piw/2010/systemy_ekspertowe/drools_i.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0