To jest stara wersja strony!
LAB: Regułowe systemy ekspertowe
Celem ćwiczenia jest zapoznanie się z regułową reprezentacją wiedzy i systemami ekspertowymi, które je wykorzystują.
1 Wstęp
W systemie ekspertowym można wyróżnić następujące elementy:
baza wiedzy, czasami dzielona na: właściwą bazę wiedzy (czyli tą którą system dysponuje stale, od początku/uruchomienia) i bazę faktów, które system odkrywa, dostaje, wypracowuje,
mechanizm wnioskujący, który przeprowadza właściwy proces wnioskowania, tj. odnajduje rozwiązanie/odpowiedź
mechanizm wyjaśniający, dlaczego jest to odpowiedź poprawna/dopuszczalna,
interfejs użytkownika, pozwalający na komunikację z systemem.
Rysunek 1: Struktura Systemu Ekspertowego.
2 CLIPS
Rodzina
-
Po ściągnięciu pliku należy zawartą w nich wiedzę wczytać do bazy wiedzy a następnie uruchomić wnioskowanie przy pomocy komendy:
clips -f family1.clp
Po poprawnym załadowaniu na ekranie powinna ukazać się lista zdefiniowanych faktów.
Tutaj także warto zwrócić uwagę czy nie wystąpiły jakieś błędy.
W CLIPS-ie mamy dostępne wnioskowanie w przód, a więc na podstawie istniejących faktów sprawdzane będą warunki reguł i te reguły, których warunki są spełnione zostaną uruchomione. Cykl ten powtarza się aż do momentu kiedy żadna reguła nie zostanie uruchomiona. Informacją wejściową dla algorytmu wnioskowania w przód jest zbiór faktów w bazie wiedzy.
Aby reguła opisująca dziecko mogła zostać uruchomiona należy zdefiniować regułę dodającą do bazy wiedzy fakt mówiący kto jest rodzicem kogo (zmiana bazy wiedzy spowoduje uruchomienie kolejnego cyklu wnioskowania):
(defrule rodzic
(or (mama ?x ?y) (tata ?x ?y))
=>
(assert (rodzic ?x ?y))
)
Uruchom wnioskowanie ponownie i odpowedz na pytania:
Ile teraz jest faktów w bazie CLIPS-a?
Jakie są aktywacje reguł w CLIPS-ie przed rozpoczęciem wnioskowania (rezultat wywołania funkcji (agenda)
)?
Dlaczego wśród nich nie ma reguł definiujących dziecko?
Zadanie 1
Rozbuduj bazę reguł dodając do niej reguły definiujące relacje rodzinne takie jak
Truth maintenance
Truth Maintenance System w systemach regułowych jest odpowiedzialny za utrzymanie spójności wiedzy w nich zawartych.
Niespójność może być różna: niespójność logiczna wiedzy, niespójność materialna (w odniesieniu do interpretacji wiedzy w przyjętym świecie).
Czym różnią się te rodzaje niespójności
Które z nich mogą wystąpić w systemach produkcyjnych
![:?:](/lib/images/smileys/icon_question.gif)
-
Otwórz i zapoznaj się z jego zawartością. Zwróć uwagę na:
Uruchom ściągnięty plik. Aby łatwiej było przeglądać rezultaty wyświetlane podczas uruchomienia, można użyć następującej komendy
clips -f family2.clp | less
Zaobserwuj jak zwiększany jest wiek poszczególnych osób oraz zidentyfikuj moment kiedy dodawany jest fakt typu bilet
. Jakiego typu i dla kogo ten bilet jest dodawany
Zadanie 1
Zdefiniuj regułę przyznaj-bilet::bilet-dorosly
w analogiczny sposób jak zdefiniowana została reguła przyznaj-bilet::bilet-uczen
.
Uruchom otrzymany model i zaobserwuj jakie bilety istnieją w bazie wiedzy na końcu procesu wnioskowania.
Jak wyjaśnić taki rezultat
![:?:](/lib/images/smileys/icon_question.gif)
Czy baza wiedzy w takim wypadku jest spójna
![:?:](/lib/images/smileys/icon_question.gif)
Zadanie 2
Popraw otrzymany model poprzez zastosowanie mechanizmu Truth Maintenance System
Jaka konstrukcje języka CLIPS umożliwia jego wykorzystanie
![:?:](/lib/images/smileys/icon_question.gif)
Po poprawnym zastosowaniu mechanizmu na końcu wnioskowania powinien być dokładnie jeden fakt opisujący bilet dla każdej osoby.
Wśród wyświetlanych wiadomości wskaż miejsca, gdzie usuwane są niepotrzebne bilety.
3 Drools (dla zainteresowanych)
Model systemu PLOC
Celem systemu jest określenie wysokości składki ubezpieczenia na podstawie danych wejściowych. Danymi wejściowymi dla systemu są dane na temat kierowcy: wiek, okres posiadania prawo jazdy, liczba wypadków w ostatnim roku, dotychczasowa klasa ubezpie- czeniowa. Kolejnym elementem istotnym przy wyliczaniu składki ubezpieczenia są dane na temat pojazdu: pojemność silnika, wiek samochodu, liczba miejsc, badanie techniczne. Ostatnim elementem są zniżki oraz zwyżki za: liczbę rat, inne ubezpieczenia, ciągłość ubezpieczenia, liczbę samochodów ubezpieczonych. Wyliczenie składki ubezpieczenia przebiega w trzech etapach. Pierwszym etapem jest ustalenie stawki podstawowej na podstawie pojemności samochodu. Dane o wysoko- ści składki podstawowej są podane dla rejestracji w Szczecinie. Drugim etapem jest tzw. tabela bonus malus. Zawarte w niej są zniżki i zwyżki wynikające z bezszkodowego prze- biegu ubezpieczenia. Towarzystwa ubezpieczeniowe udzielają maksymalnie 60 % zniżki z tego tytułu. Za każdy bezszkodowy 12 miesięczny okres ubezpieczenia, klient przesuwa się o jedną klasę w dół tabeli. Trzecim etapem jest uwzględnienie pozostałych zniżek i zwyżek m.in. za wiek, dodatkowe ubezpieczenia itp.
Kompletna lista reguł:
pl-oc.pdf
Uruchomienie modelu
-
W celu uruchomienia bazy wiedzy zapisanej w ściągniętym pliku, uruchamiamy narzędzie Eclipse i tworzymy nowy projekt:
Tworzymy nowy projekt File
⇒ New
⇒ Project…
.
Na liście odnajdujemy pozycję Drools
i ją rozwijamy.
Wybieramy Drools Project
Klikamy Next >
W kolejnym korku kreatora podajemy nazwę projektu np. DroolsTest
.
Klikamy Next >
W kolejnym kroku pozostawiamy zaznaczone tylko dwie pierwsze opcje.
Klikamy Next >
W kroku Drools Runtime
z listy Generate code compatible with:
wybieramy Drools 5.1 or above
.
Klikamy Finish
W worksspace pojawia się nam nowy projekt do którego dodajemy klasy pozwalające na uruchomienie projektu:
Rozwijamy drzewo projektu DroolsTest
⇒ src
⇒ main
⇒ java
⇒ com
⇒ sample
.
Klikamy na plik *.java
. W tym pliku:
Usuwamy definicję klasy Message
Usuwamy w funkcji main
wszystkie linie, które korzystają z instancji tej klasy.
Zmieniamy nazwę pliku z regułami z Sample.drl
na ploc-drools.drl
.
Do głównej klasy dodajemy definicję typu enumerowanego:
public enum PaymentType {
single, instalments
}
Rozwijamy drzewo projektu DroolsTest
⇒ src
⇒ main
⇒ rules
.
Usuwamy plik Sample.drl
.
W miejsce usuniętego pliku dodajemy wcześniej ściągnięty plik ploc-drools.drl
:
Klikamy prawym przyciskiem na pobrany plik i wybieramy Kopiuj
.
Klikamy prawym przyciskiem na katalog rules
i menu kontekstowego wybieramy opcję Wklej
.
Wybieramy polecenie Run as
⇒ Java application
.
Jeżeli wszystko przebiegło pomyślnie to w konsoli środowiska Eclipse powinny pojawić się komunikaty generowane przez reguły.
Zadania
Zadanie 1
Wśród uruchamianych reguł można zauważyć, że atrybut DriverClass
klasy Driver
jest zwiększany wielokrotnie:
Czy jest to poprawne zachowanie
![:?:](/lib/images/smileys/icon_question.gif)
Jeżeli nie, to dlaczego i jakie powinno być poprawne
![:?:](/lib/images/smileys/icon_question.gif)
Jak sprawić aby tylko jedna z tych reguł została uruchomiona
Wskazówka: poczytaj o możliwych atrybutach reguł i spróbuj znaleźć ten który pozwoli osiągnąć żądany efekt: atrybuty reguł
Zadanie 2
Model bazy wiedzy jest niekompletny i zawiera tylko część reguł z modułu base-charge-modifiers
(agenda-group „base-charge-modifiers”
).
Na podstawie definicji innych reguł dopisz 4 ostatnie reguły podwyższające cenę ubezpieczenia zawarte w pliku pl-oc.pdf tzn.:
liczba miejsc pojazdu (6-9): +20%,
brak wałnego badania technicznego: +20%,
opłata na 2 raty: +10%,
brak zaświadczenia o przebiegu ubezpieczenia: +60%.
Zadanie 3
Dopisz regułę, która po przyznaniu wszystkich zniżek i zwyżek obliczy wartość końcową polisy ubezpieczenia.
Zdefiniuj tą regułę jako element modułu calculation
(agenda-group „calculation”).
W definicji reguły można wykorzystać element accumulate
.
Reguła ta ma zapisywać wartość polisy w polu Value
obiektu typu Result
.
Reguła powinna wyświetlać finalną wartość do zapłaty.
Poprawna wartość, jaka powinna zostać obliczona to: 865.95
.
Zadanie 4*
Spróbuj zdefiniować powyższą regułę bez użycia accumulate
.