Zadanie z CLIPSa - systemy regułowe
- (język CLIPS)
Zapoznaj się z językiem i systemem CLIPSa, np. przeczytaj oficjalny
tutorial dostępny w necie, oraz
tutaj.
Inny tutorial, napisany przez mojego kolegę z Uniwersytetu Przyrodniczego
po polsku, jest dostępny
tutaj.
Uwaga: tutoriale, tu wymienione i inne, mają w większości na celu prezentację
języka i jego elementów. Większość z nich nie przedstawia dobrego podejścia
metodologicznego budowy systemów eksperckich. Trochę uwag metodologicznych
zawartych jest poniżej.
- (interpretery)
Istnieją dwa znane interpretery CLIPSa. Starszy, o nazwie CLIPS, oryginalny
program z NASA, obecnie dostępny jako open-source, napisany w C i bardzo slabo
ale nadal utrzymywany. Da się go wbudować w inny system jako moduł sztucznej
inteligencji, jak również da się z niego wywoływać obce funkcje. Istnieje
wersja windowsowa typu IDE z okienkowym edytorem i mini systemem uruchomieniowym.
Drugi, nowszy interpreter, o nazwie JESS, napisany w Javie i zapewniającym
integrację w programach Javy, jest produktem komercyjnym. Dostępna jest
30-dniowa wersja darmowa typu demo.
- (wybór tematu)
Wybierz jakieś przykładowe zagadnienie, które można będzie rozwiązywać za
pomocą regułowej bazy wiedzy. Najlepiej, wybierz dziedzinę, w której jesteś
ekspertem, albo coś czym jesteś zafascynowany, hobby, albo przynajmniej temat
na który posiadasz sporą wiedzę, i na jej bazie mógłbyś/mogłabyś doradzać innym.
Na przykład:
- propozycja trasy wycieczki pieszej w określonym rejonie, uwzględniającej
walory krajobrazowe, możliwości uczestników, oraz ograniczenia czasowe i inne,
- zaplanowanie programu ćwiczeń na siłowni, zgodnie z życzeniami i
możliwościami ćwiczącego,
- wybór telefonu komórkowego według profilu użytkownika, i oferty,
alternatywnie: nawigacja satelitarna, CB radio, itp.,
- ogólnie, wybór specjalistycznego sprzętu do jakiegoś przedsięwzięcia,
np. wyprawy wysokogórskiej, zestawu perkusyjnego małej orkiestry, itp.
- opracowanie strategii inwestycyjnej dla klienta, wybór pakietu
inwestycji finansowych, wybór kredytu, albo podjęcie decyzji o kupnie lub
sprzedaży akcji,
- wybór zestawu przedmiotów do egzaminu maturalnego, zgodnie z planowanym
kierunkiem studiów, i predyspozycjami ucznia,
- wybór kierunku studiów,
- wybór przedmiotów do planu studiów,
- planowanie jadlospisu uwzgledniające wymagania żywieniowe klienta,
- wybór menu na przyjęcie z jakiejś ważnej okazji,
- wybór wina dostosowany do menu obiadu,
- wybór nasadzeń dla ogródka domowego,
- itp.
Jeśli nie potrafisz lub nie chcesz użyć dziedziny, z której jesteś
rzeczywistym ekspertem, to temat zadania może dotyczyć jakiejś jedynie
powierzchownie znanej Ci dziedziny, a wiedza być zaczerpnięta z dobrego
podręcznika z tego obszaru. Wtedy scenariusze zadań rozwiązywanych przez
zbudowany system muszą być szczególnie starannie i realistycznie opracowane
(również na podstawie podręcznika), żeby dało się ocenić wartość odpowiedzi i
zakres kompetencji systemu, zarówno ich szerokość jak i głębokość.
Inną możliwością jest znalezienie jakiegoś rzeczywistego eksperta, i
nawiązanie z nim współpracy do realizacji zadania. Ekspertem może być kolega,
mama, albo (nawet) młodszy brat. Jeśli posiada wiedzę i doświadczenie, dzięki
którym może pomóc drugiej osobie rozwiązać jej problem, to jest ekspertem.
Uwaga: trzymaj się z dala od doradztwa przy kupowaniu samochodu.
Kupowanie samochodow ma w sobie coś co nie poddaje się fachowemu doradztwu.
To dotyczy wyboru marki i modelu. Jeśli jednak posiadasz wiedzę, która
pozwala wybrać np. konkretny silnik dla danego modelu Forda lub Vokswagena,
to taka wiedza jest cenna, i wiele osób chętnie z niej skorzysta.
- (zadanie do wykonania)
Napisz system ekspercki w CLIPSie w postaci zbioru reguł, faktów
inicjalizacyjnych, stałych, funkcji pomocniczych, itp. Celem systemu
powinno być rozwiązywanie konkretnych instancji problemów z danej dziedziny.
Uruchom, przetestuj na jakichś bardzo prostych przykładach problemów, potem
spróbuj rozwiązać przykłady trudniejsze.
Pamiętaj, system ekspercki nie musi rozwiązać poprawnie wszystkich przykładów.
Podobnie jak człowiek, może nie znaleźć rozwiązania, lub się pomylić.
Prototypowy system napisany w ciągu kilku dni, na pewno będzie miał luki i
będzie się czasem mylił. Jeśli system myli się dlatego, że brakuje mu
odpowiednich reguł (wiedzy), to wszystko jest w porządku, nie musisz
doprowadzić go do stanu kompletności i 100\% perfekcji. Natomiast jeśli
system posiada właściwe reguły, ale nie używa ich poprawnie, wtedy coś jest
źle w programie, i musisz dalej pracować.
Program tego typu musi powstawać iteracyjnie, w cyklach pisania i testowania.
Nie zwlekaj z testowaniem. Po napisaniu kilku reguł odnoszących się do
jakiejś części zagadnienia, przetestuj je na odpowiednich przykładach.
Rozwijaj system aby uzupełnić go o wiedzę, którą uważasz za niezbędną w
zakresie tego (mikroskopijnego) projektu.
- (uwagi metodologiczne)
Przestrzegaj następujących zasad (warto przeczytać i zweryfikować te zasady
kilka razy w trakcie pisania programu):
- Wiedza powinna mieć charakter regułowy. W wielu dziedzinach, wiedza
ekspercka naturalnie daje sie kodować w postaci zbioru reguł IF-THEN.
Napisanie takiego systemu jest celem tego zadania.
W CLIPSie można również napisać program całkowicie sekwencyjny,
funkcjonalny, albo obiektowy, ale nie o to chodzi. Można również napisać
zestaw reguł w taki sposób, że będą one służyły wyłącznie do wywoływania
funkcji, ale to też jest źle.
- Reguły muszą być budowane modularnie. Każda reguła musi być samodzielną
jednostką, wyraża jakiś fragment wiedzy eksperta o problemie, sprawdza
jakieś znane informacje o problemie, i typowo dodaje mały kawałek dalszej
wiedzy. Jedna reguła nie może odwoływać się jawnie do innych reguł, ani
zależeć od tego czy inna się wykona, albo czy w ogóle istnieje. Oczywiście
zależność między regułami istnieje, ale tylko przez wiedzę o problemie, a
nie, że np. warunkiem w danej regule jest (fakt1 tak) bo wiem, że inna
reguła taki fakt tworzy.
Jeśli reguły układają się w jakąś strukturę logiczna, jak if-then-else,
case, albo coś na kształt drzewa decyzyjnego, to taki program nie powinien
być napisany jako regułowy, lecz zwykły program sekwencyjny wykorzystujący
te struktury sterowania.
Jeśli napisany system działa w kilku fazach, które muszą być wykonywane w
odpowiedniej chronologii, to można użyć modułów CLIPSa by zaimplementować tę
chronologię. Moduły są jakby oddzielnymi systemami z własnymi zbiorami
reguł, pomiędzy którymi można się przełączać (focus) za pomocą zestawu reguł
nadrzędnych.
- W typowym systemie eksperckim reguły stanowią nieuporządkowany zbiór, i
współpracują przez tworzone wyniki pośrednie. Kolejność zapisu reguł w
programie nie ma nic wspólnego z kolejnością ich odpalania (przed każdym
cyklem odpalenia wszystkie reguły są sortowane zgodnie ze strategią systemu).
Nie używaj deklaracji salience (ani sztucznych faktów wymuszających) do
szeregowania kolejności odpalania reguł. CLIPS ma siedem strategii;
domyślną jest depth, ale nie zawsze okazuje się ona optymalna. Jeśli dobrze
napisane reguły odpalają się w niewłaściwej kolejności, to nie zmieniaj
reguł. W pierwszej kolejności spróbuj zmienić strategię. Spróbuj ustawić
strategię mea albo lex (set-strategy mea). Jeśli to nie pomoże to zapytaj o
radę wykładowcy.
- Jak duży powinien być system opracowany w ramach tego zadania? Na to
pytanie nie ma oczywiście jednej dobrej odpowiedzi, to zależy od
zagadnienia. Jednak w wielu przypadkach wygląda to tak, że wstępnie
napisana wersja systemu będzie miała 10-20 reguł, i na takiej bazie wiedzy
można już zacząć testować przykładowe zadania. Praca powinna wtedy iść w
tworzenie różnych przypadków i eksperymentowanie z nimi, aby zweryfikować
poprawność przyjętej reprezentacji. W trakcie tej pracy może powstawać
trochę nowych reguł, ale głównie reguły już istniejące są poprawiane (jeśli
koncepcja była dobra i tylko drobne poprawki), albo gruntownie przepisywane
(jeśli wynikły poważniejsze problemy koncepcyjne).
W efekcie system opracowany w ciągu dwóch tygodni może mieć 20-40 reguł.
Może mieć nawet sporo więcej, ale ważniejsze od liczby reguł jest ogólne
dopracowanie, przygotowanie dobrego, reprezentatywnego zestawu przypadków,
zarowno pozytywnych (poprawnie rozwiązanych) jak i negatywnych (źle lub w
ogóle nierozwiązanych).