Diplomski Rad - Fuzzy Logika

Embed Size (px)

Citation preview

  • Katedra za raunarsku tehniku i informatikuElektrotehniki fakultetUniverzitet u Beogradu

    Softverski sistem za simulaciju algoritama fuzzy logike

    Mentor:dr Boko Nikoli

    Student:Saa Bodiroa

    04/0272

    Beograd, oktobar 2009.

  • SadrajUvod.................................................................................................................................................................1

    Opis dokumenta...........................................................................................................................................1Osnovno o teoriji fuzzy skupova..................................................................................................................1Osnovno o fuzzy logici.................................................................................................................................2

    1. Zahtevi za izradu sistema.............................................................................................................................31.1. Opis jezika Fuzzy Control Language....................................................................................................3

    1.1.1. Opis funkcija lanstva...................................................................................................................41.1.2. Opis metoda defazifikacije............................................................................................................51.1.3. Opis metoda agregacije................................................................................................................61.1.4. Opis metoda aktivacije..................................................................................................................61.1.5. Opis metoda akumulacije.............................................................................................................71.1.6. Opis bloka pravila i pravila............................................................................................................7

    1.2. Opis Jave i korienih biblioteka...........................................................................................................81.2.1. Opis biblioteke ANTLR i alata ANTLRworks.................................................................................91.2.2. Opis JFreeChart biblioteke.........................................................................................................10

    2. Rad softverskog sistema.............................................................................................................................122.1. Pokretanje simulatora.........................................................................................................................122.2. Inicijalizacija simulatora......................................................................................................................122.3. Uitavanje opisa sistema....................................................................................................................13

    2.3.1. Osnovni nain uitavanja opisa sistema.....................................................................................132.3.2. Napredni nain uitavanja opisa sistema....................................................................................13

    2.4. Kretanje kroz simulaciju......................................................................................................................142.5. Naknadna podeavanja simulacije.....................................................................................................142.6. uvanje simulacije..............................................................................................................................152.7. Prijava greaka...................................................................................................................................15

    3. Realizacija sistema.....................................................................................................................................163.1. Parsiranje ulazne datoteke.................................................................................................................16

    3.1.2. Obrada podataka o aktivaciji.......................................................................................................183.2. Osnovne klase za rad sa fuzzy logikom..............................................................................................20

    3.2.1. Izraunavanje pravila..................................................................................................................224. Zakljuak.....................................................................................................................................................24

    4.1. Mogua unapreenja..........................................................................................................................24Literatura.........................................................................................................................................................25

  • Uvod

    Opis dokumenta

    Tema rada je softverski sistem za simulaciju algoritama fuzzy logike. U samom dokumentu prikazan je postupak implementacije i korienja sistema, i zakljuci do kojih se dolo u toku izrade.

    U uvodu su date osnovne informacije o fuzzy logici i teoriji fuzzy skupova. Data je osnovna teorijska podloga i objanjena je primena fuzzy logike u raznim sistemima.

    U drugom poglavlju su izneti zahtevi za izradu sistema i tehnologija koja je koriena za njegovu realizaciju.

    U treem poglavlju su detaljno prikazani rad i mogunosti sistema.

    U etvrtom poglavlju su detaljno prikazani implementacija sistema i reenje odabranih problema do kojih se dolo u toku realizacije.

    U petom poglavlju su izneti zakljuci do kojih se dolo u toku realizacije i ta je naueno. Takoe su predloene i mogunosti za budue nadogradnje sistema.

    Osnovno o teoriji fuzzy skupova

    Teoriju fuzzy skupova je zapoeo Lotfi A. Zadeh, kao proirenje teorije skupova. U klasinoj teoriji skupova jedan element ili pripada ili ne pripada skupu. U teoriji fuzzy skupova, jedan element ima stepen pripadnosti skupu (eng. degree of membership).

    Stepen pripadnosti je iskazan funkcijom lanstva (eng. membership function).

    Fuzzy skup je par (A, m), gde je A skup, a m:A[0,1] funkcija lanstva koja vri preslikavanje skupa A u realan broj iz opsega [0,1].

    Za element iji je stepen pripadnosti 0 kae se da uopte ne pripada skupu, dok za element sa stepenom pripadnosti 1 kae se da skroz pripada skupu.

    Fuzzy skup (A, m) se definie nad klasinim skupom X. To znai da svaki element xX ima stepen pripadnosti fuzzy skupu A, koji je odreen funkcijom lanstva m. Na primer, skup X moe da predstavlja temperaturu, dok fuzzy skup A predstavlja visoku temperaturu. Funkcijom lanstva m se odreuje da li neka konkretna temperatura pripada skupu visoke temperature.

    1

  • Osnovno o fuzzy logici

    Fuzzy logika je vievrednosna logika. Proistekla je iz teorije fuzzy skupova.

    Fuzzy logika ne znai da je u pitanju neprecizna logika. Termin fuzzy oznaava da logika opisuje neprecizne pojmove, poput ljudskog znanja. ovek koristi lingvistike pojmove za opisivanje stvari. Na primer, neka osoba moe opisati temperaturu od 28.6 kao visoku, to je iroka i slabo definisana kategorija. Sa druge strane, senzor moe da izmeri temperaturu precizno i odredi da iznosi, na primer, 28.6. Fuzzy logika je zasluna za mapiranje precizne vrednosti, kao to je 28.6, u neprecizan pojam, kao to je skup visoka temperatura.

    U fuzzy logici, stepen istinitosti (eng. degree of truth) ili lanstva (eng. degree of membership) predstavlja stepen pripadnosti elementa odreenom fuzzy skupu. Ova dva termina e biti veoma koriena u ovom radu, i bie korieni kao sinonimi.

    2

  • 1. Zahtevi za izradu sistemaSistem je izraen kao deo veeg projekta simulatora za predmet Ekspertski sistemi, realizovanog na Elektrotehnikom fakultetu Univerziteta u Beogradu. Ovaj projekat predstavlja edukacioni sistem koji je namenjen studentima, da bi lake savladali gradivo koje je predvieno programom predmeta Ekspertski sistemi.

    U ovom poglavlju e biti izneen opis jezika koji je korien za opis sistema. Takoe e biti opisana i koriena tehnologija, i bie izneti razlozi za izbor odreene tehnologije.

    1.1. Opis jezika Fuzzy Control Language

    Da bi bilo mogue opisati sistem, postojala je potreba da se usvoji format za specifikaciju sistema. Za to je usvojen Fuzzy Control Language (u daljem tekstu FCL), koji je detaljno opisan u specifikaciji IEC 1131-7 CD1. Fuzzy logika primenjena u kontroli sistema se naziva fuzzy kontrola. FCL slui da opie ulaz i izlaz, kao i rad jednog sistema, koji koristi fuzzy kontrolu.

    Jedna tipina FCL datoteka sadri vie blokova. Osnovni blok je funkcijski blok, kojih moe da ima vie. Zbog mogunosti postojanja vie funkcijskih blokova, potrebno je da se svaki blok imenuje. Osnova implementiranog sistema podrava paralelni rad sa vie funkcijskih blokova, ali simulator koristi samo jedan funkcijski blok, i to prvi definisani.

    FUNCTION_BLOCK Fblok1

    ...

    END_FUNCTION_BLOCK

    FUNCTION_BLOCK Fblok2

    ...

    END_FUNCTION_BLOCK

    Unutar jednog funkcijskog bloka se nalazi vie podblokova:

    Blok sa ulaznim promenljivama, ili injenicama, slui za deklaraciju svih ulaznih promenljivih i njihovih tipova, koji mogu biti celobrojni (kljuna re INTEGER) ili realni (kljuna re REAL). U simulatoru se koriste samo realne promenljive.

    U sledeem primeru dat je tipini izgled ovog bloka:

    VAR_INPUT

    temp: REAL;

    ...

    END_VAR

    Blok sa izlaznim promenljivama ima isti format kao blok sa ulaznim promenljivama

    VAR_OUTPUT

    3

  • brzina: REAL;

    ...

    END_VAR

    Fuzzify blok slui za definisanje fuzzy skupova nad ulaznim promenljivama, i opciono za definisanje

    FUZZIFY

    TERM hladno := funkcija lanstva;

    ...

    END_FUZZIFY

    Defuzzify blok slui za definisanje fuzzy skupova nad izlaznim promenljivama, kao i podrazumevane vrednosti, metoda defazifikacije (eng. defuzzification), i opciono opsega promenljive.

    DEFUZZIFY

    TERM spora := funkcija lanstva;

    ...

    METHOD := metod defazifikacije;

    DEFAULT := 0;

    [RANGE := (donja .. gornja);]

    Blok pravila, kojih moe da bude vie, slui za definisanje seta fuzzy pravila, koji slue za kontrolu, kao i metoda akumulacije i agregacije. Ako postoje izlazne promenljive koje nisu diskretne, potrebno je definisati i metod aktivacije. Zbog mogunosti postojanja vie pravila, potrebno je da se definie i ime bloka pravila. Osnova implementiranog sistema podrava postojanje vie blokova pravila, ali simulator koristi samo prvi definisani blok.

    RULEBLOCK BlokPravila1

    [ACT : metod aktivacije;]

    ACCU : metod akumulacije;

    (AND | OR) : metod agregacije;

    RULE 1 : IF ... THEN ... [ WITH ... ];

    ...

    END_RULEBLOCK

    1.1.1. Opis funkcija lanstvaFunkcije lanstva se definiu preko znaajnih taaka. Postoje sledee funkcije:

    Singleton predstavlja funkciju koja ima vrednost 1 u definisanoj taki x na x-osi, i 0 u svim ostalim. Ova funkcija se moe koristiti samo za izlazne promenljive, i postoji da bi pojednostavila proces defazifikacije. Definie se sa

    TERM imeFunkcije := x;

    Trougaona funkcija je funkcija koja ima vrednost 0 na segmentima gde je x < x1 i x > x3, na segmentu x1 x < x2 linearno raste, na segmentu x2 < x x3 linerano opada, i ima maksimum u taki x = x2. Definie se sa

    4

  • TERM imeFunkcije := (x1, y1), (x2, y2), (x3, y3);

    Trapezoidna funkcija je funkcija koja ima vrednost 0 na segmentima gde je x < x1 i x > x4, na segmentu x1 x < x2 linearno raste, na segmentu x3 < x x4 linerano opada, i na segmentu x2 x x3 ima maksimum. Definie se sa

    TERM imeFunkcije := (x1, y1), (x2, y2), (x3, y3), (x4, y4);

    Ramena (eng. shoulder) funkcija je funkcija koja ima vrednost y1 za x x1, vrednost y2 za x x2, i linearno raste na segmentu x1 < x < x2. Definie se sa

    TERM imeFunkcije := (x1, y1), (x2, y2);

    1.1.2. Opis metoda defazifikacijeProces dobijanja konkretne (eng. crisp) vrednosti naziva se koncentracija, ili defazifikacija. Postoji vie metoda defazifikacije, od kojih IEC 1131-7 CD1 specificira svega par. To su:

    COG Centar gravitacije. Rauna se na osnovu sledee formule:

    U=Min

    Max

    u udu

    Min

    Max

    u du

    COGS Centar gravitacije, ako su izlazne promenljive diskretne. Rauna se na osnovu sledee formule:

    U=i=1

    p

    [u ii]

    i=1

    p

    [i]

    COA Centar povrine. Rauna se na osnovu sledee formule:

    U=u ' ,Min

    u '

    udu=u '

    Max

    udu

    RM Desni maksimum. Rauna se na osnovu sledee formule:

    U=sup u ' ,u ' = supu[Min , Max ]

    u

    LM Levi maksimum. Rauna se na osnovu sledee formule:

    U=inf u ' ,u ' = supu[Min , Max ]

    u

    U prethodnim formulama, oznaka U predstavlja rezultat defazifikacije, u je izlazna

    5

  • promenljiva, p je broj singltona, je akumulirana funkcija lanstva, i je indeks, Min i Max su gornji i donji limit za defazifikaciju, respektivno, sup je supremum, a inf je infinum.

    1.1.3. Opis metoda agregacijeAgregacija je postupak evaluacije poduslova, odnosno raunanje lanstva za konkretnu ulaznu promenljivu u poduslovima, i agregiranje tih lanstva u jednu vrednost, koja izraava istinitost celog uslova. Specifikacija FCL-a izlae po tri metoda za agregaciju AND i OR veza poduslova, i date su u parovima da bi se zadovoljio De Morganov zakon. Te metode su:

    Za OR maksimum (kljuna re MAX), a za AND minimum (kljuna re MIN), odnoso kao formula:

    OR : f 1x ,2x =Max 1 x ,2x ,AND : f 1 x ,2x =Min1x ,2 x

    Za OR ASUM (kljuna re ASUM), a za AND proizvod, odnosno kao formula:

    OR : f 1x ,2x =1x 2x 1 x2x ,AND : f 1 x ,2x =1 x2 x

    Za OR ograniena suma (BSUM), a za AND ograniena razlika (BDIF), odnosno kao formula:

    OR : f 1x ,2x =Min 1,1x 2x ,AND : f 1 x ,2x =Max 0,1x 2x 1

    U prethodnim formulama f 1x ,2 x predstavlja funkciju za raunanje agregacije, 1x predstavlja vrednost lanstva prvog od poduslova, a 2x vrednost lanstva

    drugog od poduslova.

    1.1.4. Opis metoda aktivacijeAktivacija je proces kojim se formira funkcija lanstva za izlaznu promenljivu na osnovu vrednosti istinitosti uslova. Specifikacija FCL-a izlae dva metoda za aktivaciju, i to:

    Metod minimuma (kljuna re MIN), to znai da se funkcija lanstva aktiviranog skupa dobija kao minimum vrednosti istinitosti uslova i vrednosti funkcije lanstva konkretnog skupa nad izlaznom promenljivom, odnosno kao formula:

    f 1x ,2 x=Min1x ,2 x

    Metod proizvoda (kljuna re PROD), to znai da se funkcija lanstva aktiviranog skupa dobija kao proizvod vrednosti istinitosti uslova i vrednosti funkcije lanstva

    6

  • konkretnog skupa nad izlaznom promenljivom, odnosno kao formula:

    f 1x ,2 x=1 x2 x

    U prethodnim formulama f 1x ,2 x oznaava funkciju lanstva aktiviranog skupa, 1x oznaava vrednost istinitosti uslova, i 2x oznaava vrednost funkcije

    lanstva konkretnog skupa nad izlaznom promenljivom.

    1.1.5. Opis metoda akumulacijeAkumulacija je proces kojim se od aktiviranih skupova nad izlaznim promenljivama dobijaju akumulirane funkcije lanstva, po jedna za svaki skup nad izlaznim promenljivama. Specifikacija FCL-a izlae tri metoda za akumulaciju, i to:

    Maksimum (kljuna re MAX) se rauna kao maksimum svih aktiviranih funkcija lanstva nad jednim skupom nad izlaznom promenljivom, odnosno kao formula

    f 1x ,2 x , ,nx =Max 1x ,2 x , ,n x

    Ograniena suma (kljuna re BSUM) se rauna kao maksimum vrednosti 1 i sume svih aktiviranih funkcija lanstva nad jednim skupom nad izlaznom promenljivom, odnosno kao formula

    f 1x ,2 x , ,nx =Max1,i=1

    n

    i x

    Normalizovana suma (kljuna re NSUM) se rauna kao razlomak sume svih aktiviranih funkcija lanstva nad jednim skupom nad izlaznom promenljivom, i maksimuma vrednosti 1 i sume svih aktiviranih funkcija lanstva nad jednim skupom nad izlaznom promenljivom, odnosno kao formula

    f 1x ,2 x , ,nx =i=1

    n

    i x

    Max 1,i=1

    n

    i x

    1.1.6. Opis bloka pravila i pravilaPravila unutar FCL datoteke su podeljena po blokovima pravile, zato to je nekad potrebno podeliti vie pravila u razliite module. Svaki blok pravila je identifikovan jedinstvenim imenom.

    Pravila se navode unutar bloka pravila, i svako je identifikovano sa jedinstvenim brojem. Pravilo se sastoji iz dva dela: uslova i posledica. Uslov je sainjen od vie poduslova, koji

    7

  • su vezani AND i OR operacijama. Poduslov ima oblik lingvistika_promenljiva IS lingvistiki_opis, gde je lingvistika promenljiva jedna od ulaznih promenljiva, a lingvistiki skup je jedan skup definisan nad tom promenljivom. Poduslov moe da bude i negacija, kada ima oblik lingvistika_promenljiva IS NOT lingvistiki_opis. Negacija ima za efekat drugaiju funkciju lanstva. Ako je funkcija lanstva skupa lingvistiki_opis f x , tada je funkcija lanstva negiranog poduslova f ' x=1 f x . Drugi nain modifikovanja poduslova je koristei priloge, i to:

    vrlo (kljuna re VERY) je prilog kojim se postie koncentracija. Odreen je formulom

    CON x =2x

    neto (kljuna re SOMEWHAT) je prilog kojim se postie dilatacija. Odreen je formulom

    DIL x =12 x

    zaista (kljuna re INDEED) je prilog kojim se postie intenzifikacija. Odreen je formulom

    INT x ={22x ,0x 0.512 1x 2 ,0.5x1} ekstremno (kljuna re EXTREMLY) je slian prilogu vrlo, samo se u formuli

    vrednost lanstva na trei stepen

    EXT x =3x

    Posledice su navedene u THEN delu pravila, i odvojene su zarezima. Mogue je definisati i faktor teine, kojim se mnoi vrednost poslediice. Teinski faktor se navodi kljunom reju WITH i predstavlja realni broj izmeu 0 i 1.

    1.2. Opis Jave i korienih bibliotekaSoftverski sistem je implementiran u programskom jeziku Java. Prednosti izbora Jave su u tome to je razvoj sistema olakan time to ve postoji dobar broj biblioteka, koje su prilino stabilne. Dalje, Java je podrana na vie platformi, to znai da je sistem portabilan.

    Kao manu, mogli bismo da navedemo to da Java ne prevodi kd do mainskog jezika, to je ini malo sporijom u odnosu na jezike poput C-a i C++-a. Dodue, u dananje vreme brzina procesora i koliina raspoloive operativne memorije rastu, tako da ovo predstavlja sve manju zamerku.

    8

  • 1.2.1. Opis biblioteke ANTLR i alata ANTLRworksANTLR (Another Tool for Language Recognition) je top-down generator parsera. On koristi LL(*) parsiranje (Left-to-Right konzumiranje tokena, Leftmost derivation, k lookahead tokena). Ulaz generisanog parsera je FCL datoteka, a izlaz je apstraktno sintaksno stablo.

    Postoji par razloga zato je izabran ANTLR, a ne JFlex + CUP. Prvi je da je datoteka sa opisom gramatike itljivija i jasnija. Unutar nje se definiu svi tokeni, terminalni simboli, kao i gramatika pravila u EBNF notaciji. Nije postojala potreba za pisanjem dodatnog koda, jer je obilazak stabla prilino jednostavno.

    Drugi razlog je da nema eksplozije klasa, zbog postojanja apstraktnog sintaksnog stabla. Kao povratni rezultat, parser vraa koreni vor stabla. Nije korien projektni uzorak Posetilac, jer svaki vor poseduje tekstualni opis, na osnovu kod se utvrivala potrebna akcija (pandan visit() metodama u Posetiocu).

    Dodatni razlozi su da postoji opirna dokumentacija za rad sa ANTLR-om i ANTLRworks-om, aktivno se razvija i danas, program i biblioteka su relativno popularni.

    ANTLRworks je grafiko okruenje koje olakava generisanje datoteka sa gramatikom. Ovaj program sadri ureiva datoteke, interpretator, debager, i grafiki prikaz generisanog apstraktnog sintaksnog stabla, to se ispostavilo izuzteno korisnim u toku pisanja gramatike.

    Gramatika jezika, i spisak terminala i tokena su dati u okviru jedne datoteke, koja ima sledei uopteni format:

    grammar ImeGramatike;

    options {

    output = AST;

    ...

    }

    tokens {

    EOF;

    ...

    }

    // Lexer

    ACCU : ('A'|'a')('C'|'c')('C'|'c')('U'|'u');

    ...

    // Parser

    main : f = fcl -> ^(FCL $f);

    fcl : (function_block)+;

    function_block : FUNCTION_BLOCK^ (ID)? (declaration)*

    9

  • END_FUNCTION_BLOCK!;

    ...

    Znak '->' oznaava prepisivanje pravila. To govori da e, u sluaju prvog gramatikog pravila main, u AST-u postojati vor, koji e biti opisan tokenom FCL, i kao svoje dete sadrae objekat f, koji predstavlja vor generisan na osnovu pravilla fcl.

    Znak '^' oznaava da je potrebno koristiti dati pojam kao opis vora.

    Znak '!' oznaava da se dati token ne ukljuuje u AST.

    ANTLR je slobodan softver, izdat je pod BSD licencom.

    1.2.2. Opis JFreeChart bibliotekeJFreeChart je biblioteka koja slui za iscrtavanje grafika. Ova biblioteka ima podrku za prikaz velikog broja razliitih tipova grafika. To znai da je kasnije lako da se doda neki drugi tip grafika, ako se vidi da postoji potreba za tim. Dodatno, pokazalo se da je iscrtavanje grafika prilino jednostavno koristei ovu biblioteku. Na primer, da bi se nacrtao dvodimenzionalni grafik neke funkcije dovoljan je sledei kod:

    XYSeriesCollection dataset = new XYSeriesCollection();

    for (int i = 0; i < brojFunkcija; i++) {

    XYSeries serie = new XYSeries();

    for (int j = 0; j < brojTacaka; j++) {

    double x = ..., y = ...;

    serie.add(x, y);

    }

    }

    JFreeChart chart = ChartFactory.createXYLineChart(ime, // naziv

    labelaXOsa, // oznaka x-ose

    labelaYOsa, // oznaka y-ose

    dataset, // niz sa skupovima taaka na grafiku

    PlotOrientation.VERTICAL, // orijentacija grafika

    true, // prikazivanje legende

    true, // korienje tooltip-ova

    false); // Configure chart to generate URLs?

    Prikaz grafika se radi tako to se vodi skup taaka grafika. Take se povezuju pravom linijom i tako se iscrtava grafik. U prikazanom kodu, XYSeries je klasa koja slui za uvanje taaka na grafiku. Nove take se dodaju pomou metode add(double, double). XYSeriesCollection je klasa koja uva niz objekata klase XYSeries. Ovo omoguava da se na jednom panelu prikae vie grafika odjednom. Sam panel za iscrtavanje grafika se iscrtava tako to se pozove metoda fabrike grafika ChartFactory.createXYLineChart(String, String, String, XYDataset, PlotOrientation, boolean, boolean, boolean). Ova metoda vraa objekat klase JFreeChart, koji je mogue direktno dodati u neki drugi grafiki kontejner.

    10

  • JCommon je biblioteka na koju se oslanja JFreeChart, i sadri neke osnovne klase za grafiki prikaz.

    Pored ove biblioteke, isprobana je i biblioteka Plot, ali se ispostavilo da su njene mogunosti oskudnije, i samim tim je tee raditi sa njom. Na primer, dok JFreeChart podrava imenovanje osa i celog grafika (to je korieno u ovom sistemu), Plot nema date mogunosti. Iz tog razloga, i ve spomenutog jednostavnijeg rada, izabran je JFreeChart za korienje u ovom sistemu.

    Kao i ANTLR, JFreeChart i JCommon su slobodan softver. Obe biblioteke su izdate pod GNU LGPL licencom.

    11

  • 2. Rad softverskog sistemaU ovom poglavlju bie izneen rad softverskog sistema. italac e imati priliku da se podrobnije upozna sa mogunostima simulatora za fuzzy logiku, i kako da ga koristi da bi produbio znanje iz ove oblasti.

    2.1. Pokretanje simulatoraPokretanje simulatora se vri iz komandnog terminala, putem sledee komande

    cd putanja/do/simulatora

    java -jar simulator.jar

    ili putem dvoklika na simulator.jar arhivu. Za pokretanje je potrebno da bude instalirana Java verzija 5 ili via.

    2.2. Inicijalizacija simulatoraNakon to je simulator pokrenut, korisniku je prikazan glavni ekran simulatora. Klikom na ikonicu Izaberi..., ili odabirom unosa Izaberi... u meniju Simulator, korisniku se prua izbor eljenog simulatora. Ovde je potrebno odabrati Fuzzy logika iz padajueg menija. Nakon potvrde odabira, korisnik ima ekran kao na slici 2.1.

    12

    Slika 2.1: Glavni simulator

  • Ovde se vidi da je glavna povrina podeljena na levi i desni deo.

    U levom delu se nalaze, odozgo nadole, tri celine. Prva celina je tekstualna povrina u kojoj se nalazi ispisan sadraj FCL datoteke. To omoguava korisniku da uporedi delove opisa sa grafikim prikazom. Ispod se nalazi deo za podeavanje vrednosti ulaznih promenljivih. Da bi sistem mogao da radi potrebno je podesiti vrednosti za sve ulazne promenljive. U sluaju unete pogrene vrednosti poruka o greci e biti ispisana ispod polja za unos vrednosti. Sledea celina je teksutalna povrina za ispis statusnih poruka. Ovde se ispisuju poruke o podeenim vrednostima ulaznih promenljiva, o izvrenim pravilima, i o defazifikaciji izlaznih promenljiva. Poruke o izvrenim pravilima sadre poruku o vrednosti lanstva poduslova pravila, o primenjenim algoritmima za AND i OR operatore, i vrednosti istinitosti uslova (agregirana vrednost svih poduslova). U sluaju da pravilo nije aktivirano, umesto vrednosti istinitosti pisae poruka koja obavetava korisnika da pravilo nije aktivirano.

    Sa desne strane panela nalaze se tri povrine za prikaz grafika. Prva povrina predstavlja funkcije lanstva skupova nad ulaznim promenljivama, druga funkcije lanstva skupova nad izlaznim promenljivama, i trea akumulirane funkcije lanstva i defazifikovane vrednosti datih akumuliranih funkcija. Zbog nemogunosti prikaza svih grafika istovremeno, reeno je da se grafici unutar ove tri celine prikazuju u okviru listova (eng. tab). Svaki tab ima ime, koje predstavlja ime odreene promenljive.

    2.3. Uitavanje opisa sistemaUnutar sistema su realizovana dva naina za uitavanje opisa sistema, to su osnovni i napredni.

    2.3.1. Osnovni nain uitavanja opisa sistemaOsnovni nain koristi poznat koncept arobnjaka (eng. wizard) za generisanje FCL datoteke. Korisnik se na intuitivan nain vodi kroz set prozora, unutar kojih korisnik definie ulazne i izlazne promenljive, skupove nad njima, kao i njihove funkcije lanstva, koriene algoritme za agregaciju, aktivaciju i akumulaciju, i pravila. Takoe postoji mogunost brisanja nekog od malopre navedenih podataka, tako da se mogue greke lako ispravljaju.

    Da bi se osigurala ispravnost generisane FCL datoteke, u toku unosa podataka vri se i provera, te se korisnik spreava da nastavi dalje, u sluaju da nisu uneti svi potrebni podaci, ili da su neki od podataka neispravnog formataa.

    2.3.2. Napredni nain uitavanja opisa sistemaNapredni nain uitavanja podrazumeva da korisnik ve ima opis sistema sauvan u FCL datoteci.

    13

  • Da bi se uitao opis potrebno je da se klikne na ikonicu Uitaj..., ili na istoimeni unos u meniju Simulator. Ovim se pokree dijalog za odabir datoteke, gde je potrebno pronai odgovarajuu FCL datoteku. U sluaju da je datoteka neispravna, korisniku e biti prikazan prozor sa porukama o grekama.

    Nakon uitavanja opisa na ovaj, ili osnovni nain, vri se prikaz grafika funkcija lanstva skupova nad ulaznim i izlaznim promenljivama.

    Dalje je potrebno da se podese vrednosti ulaznih promenljivih, kao to je reeno u odeljku 2.2. Nakon to se podese sve vrednosti, korisnik se obavetava o tome i tad se omoguava korienje strelica za kretanje kroz simulaciju, kao i unosi u meniju Simulacija.

    2.4. Kretanje kroz simulacijuKretanje kroz simulaciju je realizovano koristei standardne operacije koraka napred i nazad, kao i mogunost skakanja na kraj i na poetak simulacije. Takoe postoje istoimeni unosi u meniju Simulacija. Da bi se spreile neregularne situacije, poput pokuaja kretanja unazad na samom poetku simulacije, vri se dinamiko aktiviranje i deaktiviranje ikonica i unosa u meniju za kretanje kroz simulaciju.

    Simulacija je podeljena na dve grupe koraka. Prva grupa koraka predstavlja izraunavanje ostvarenosti pravila. Ovo ukljuuje agregaciju i aktivaciju. Korisnik se obavetava o vrednosti istinitosti svakog poduslova, i ako je neki vrednost istinitosti vea od nula, onda se obavetava i o tome da je dato pravilo aktivirano, odnosno da je istinitost posledica vea od nule.

    Nakon to se proe kroz sva pravila, vri se akumulacija i prikaz akumuliranih funkcija za izlazne promenljive. Takoe se u ovom koraku radi i defazifikacija, to se prikazuje korisniku u naslovu grafika, kao jedna konkretna vrednost.

    2.5. Naknadna podeavanja simulacijeZa naknadna podeavanja simulacije, koristi se isti arobnjak koji je korien i u osnovnom nainu uitavanja opisa sistema. Jedina razlika je u tome da, poto je sistem ve uitan, korisniku se odmah vri prikaz svih postojeih promenljivih, skupova i funkcija lanstva.

    Zbog ove reupotrebe koda, da bi se izvrila izmena nekog dela sistema, potrebno je prvo ukloniti dati deo (na primer, skup nad promenljivom), pa ponovo dodati. Nakon to se proe kroz sve korake arobnjaka, korisniku se vri prikaz novoopisanog sistema.

    Treba napomenuti i da osnova sistema podrava rad sa vie simulacija odjednom. Ovo oznaava da bi bilo jednostavno proiriti simulator tako da promena trenutne simulacije

    14

  • zapravo kreira novu. To bi pojednostavilo uporeivanje izgleda sistema sa dva slina opisa.

    2.6. uvanje simulacijeZbog jednostavnosti koraka simulatora, nije bilo potrebe za prevelikim proirenjem datoteke za uvanje opisa sistema.

    Koristi se ve postojea datoteka sa opisom sistema u FCL-u, i samo se dodatno uvaju podeene promenljive i trenutni broj koraka.

    Ovo znai da se prilikom uitavanja sistema, u sluaju da postoje snimljene vrednosti promenljivih, odmah podeavaju date promenljive i skae na sauvan korak.

    2.7. Prijava greakaKonzistentnost sistema je realizovana proverom korisnikovog unosa. U sluaju da korisnik proba da unese podatak koji je pogrean, on e biti obaveten o tome putem statusne poruke o greci. Ona se prikazuje u okviru labela, koje su postavljene u blizini polja za unos podataka.

    Da bi vizuelno bila uoljivija, greke se prijavljuju tekstom crvene boje. Ovo je tipian nain obavetavanja korisnika, to znai da bi trebalo da korisniku bude i lako uoljiv i jasan.

    15

  • 3. Realizacija sistemaImplementacija sistema raena je u razvojnom okruenju Netbeans 6.7.1, koje prua prijatan rad sa programskim jezikom Java.

    3.1. Parsiranje ulazne datotekeDa bi se napravio opisani sistem, potrebno je prvo parsirati ulaznu FCL datoteku. Ovo se radi koristei parser, koji je generiso ANTLR.

    Klase za rad sa sistemom se nalaze unutar paketa fuzzy.sistem. Zbog zahteva GUI-ja simulatora, klasa fuzzy.sistem.Sistem implementira interfejs glavni.Simulacija, koji je realizovan u okviru drugog diplomskog rada. Ovaj interfejs deklarie metode za kretanje kroz simulaciju i za uitavanje i snimanje simulacije.

    Klasa fuzzy.sistem.Sistem se koristi za uitavanje opisa sistema i za generisanje potrebnih struktura podataka, koje e biti kasnije opisane. Pozivom metode obradiFCLFajl(String) vri se parsiranje ulaznog fajla. U nastavku je dat prikaz te metode:

    public void obradiFCLFajl(String fileName) throws IOException,

    LoseKoordinateXException, LosFormatFCLException {

    try {

    losFajl = false;

    this.fajl = fileName;

    CommonTree ast = getAst(fileName);

    ArrayList fbovi = initBazaPravila(ast);

    osveziDomene(fbovi);

    if (fbovi.size() > 0) {

    simulacija = new Simulacija(fbovi.get(0));

    simulacije.add(simulacija);

    } else {

    throw new ParseException("", 0);

    }

    } catch (RecognitionException ex) {

    losFajl = true;

    } catch (ParseException ex) {

    losFajl = true;

    }

    }

    Metoda obradiFCLFajl(String) kao parametar prima putanju do FCL datoteke, koja se uva za kasnije korienje u atributu fajl. Bulova promenljiva losFajl se koristi da bi se indiciralo korisniku da ima problema sa uitanim fajlom.

    Kao rezultat poziva metode getAst(String) dobija se AST, koje se uva u objektu ast. Klasa CommonTree predstavlja klasu koja uva koreni vor stabla, i realizovana je u okviru

    16

  • biblioteke ANTLR.

    Generisano stablo se prosleuje metodi initBazaPravila(CommonTree), koja na osnovu imena vorova poziva odgovarajue initX(...) metode, kojim se generiu ostali delovi sistema.

    U nastavku je prikazan kd metode getAst(String):

    public CommonTree getAst(String filename) throws IOException,

    RecognitionException, ParseException {

    CharStream cs = new ANTLRFileStream(filename);

    FCLLexer lex = new FCLLexer(cs);

    CommonTokenStream tokens = new CommonTokenStream();

    tokens.setTokenSource(lex);

    FCLParser parser = new FCLParser(tokens);

    final FCLParser.main_return parserResult = parser.main();

    final CommonTree ast = (CommonTree) parserResult.getTree();

    if (ast == null) {

    // line is empty

    throw new ParseException("", 0);

    }

    return ast;

    }

    Ovo je tipian kod za rad sa parserom, koji je generisan koristei ANTLR. Prvo je potrebno kreirati objekat klase ANTLRFileStream, ako se ulazni opis ita iz datoteke, odnosno ANTLRStringStream, ako se ulazni opis uitava iz Stringa. Dalje se vri inicijalizacija objekta klase leksikog analizatora FCLLexer, kojem se prosleuje malopre kreirani objekat klase ANTLRFileStream. Izlaz leksikog analizatora predstavlja niz tokena, koji se dobijaju iz objekta klase CommonTokenStream. Ovaj objekat predstavlja parametar koji se prosleuje parseru.

    Dalje je potrebno definisati koreni vor apstraktnog sintaksnog stabla. Klasa FCLParser sadri javne potklase, koje slue za uvanje rezultata parsiranja. U ovom sluaju, polazni vor je main, pa se i rezultat uva u objektu klase FCLParser.main_return. AST se dobija pozivanjem metode getTree().

    Ovako dobijeno stablo se prosleuje metodi initBazaPravila(CommonTree), kao to je ve reeno. U nastavku je dat kd te metode:

    public ArrayList initBazaPravila(CommonTree ast)

    throws LoseKoordinateXException, LosFormatFCLException {

    int idx = -1;

    for (int i = 0; i < ast.getChildCount(); i++) {

    Tree dete = ast.getChild(i);

    if (dete.getText().equalsIgnoreCase("FUNCTION_BLOCK")) {

    funkcijskiBlokovi.add(

    new FunkcijskiBlok(dete.getChild(0).getText()));

    idx++;

    17

  • initFunctionBlock(dete, funkcijskiBlokovi.get(idx));

    }

    }

    return funkcijskiBlokovi;

    }

    Ovde vidimo osnovni nain obrade generisanog stabla. Uporeivanjem opisa vora vidi se koji je vor u pitanju, i onda se poziva odgovarajua initX(...) metoda. U ovom sluaju, ako je ime vora FUNCTION_BLOCK, onda se poziva u niz funkcijskiBlokovi dodaje novi objekat klase FunkcijskiBlok, i poziva se metod initFunctionBlock(CommonTree, FunkcijskiBlok). Ovde se vidi ono to je ranije u tekstu spomenuto kao prednost ANTLR-a, a to je da ne postoji eksplozija klasa. Svi vorovi su objekti klase CommonTree. Moe da se uspostavi analogija sa visit() metodama iz projektnog uzora Posetilac. Dok se u projektnom uzorku poziva visit() metod, koji kao parametar prima objekat odreene klase, ovde se poziva initX(...) metod, kojem prosleujemo objekat klase CommonTree.

    Kao to se vidi, ova metoda kao rezultat vraa niz funkcijskih blokova, od kojih je svaki inicijalizovan pozivom metoda initFunctionBlock(CommonTree, FunkcijskiBlok). Ve je spomenuto u radu da osnova sistema podrava rad sa vie funkcijskih blokova, to je u ovom delu i pokazano.

    Dakle, klasa fuzzy.sistem.Sistem sadri vie metoda initX(...), od kojih se svaka poziva kad se naleti na odreeni vor. Na primer, kad se doe do vora koji predstavlja koreni vor za blok pravila, bie pozvana metoda initRuleBlock(CommonTree, FunkcijskiBlok, boolean). Osnovna struktura metoda initX(...) je sledea:

    private Rezultat initX(Parameter param) {

    // inicijalizacija potrebnih lokalnih promenljivih za metod

    Rezultat rezultat = ...;

    ...

    if (...) {

    // poziv druge konkretne init metode

    initX1(...);

    } else if (...) {

    // ili, ako nije potreban poziv, uradi neku konkretnu akciju

    // uglavnom kad se doe do listova

    rezultat = ...;

    return rezultat;

    }

    // ostale else if grane

    ...

    return rezultat;

    }

    3.1.2. Obrada podataka o aktivaciji

    U odeljku 1.1. Opis jezika Fuzzy Control Language pokazano je da se algoritam

    18

  • akumulacije definie odvojeno globalno za sva pravila. Za razliku od objekata koji su potrebni za agregaciju i akumulaciju, objekat za aktivaciju treba da uva i neke privatne atribute, koji su zasebni za svako pravilo, to e biti detaljnije objanjeno u odeljku 3.2.Osnovne klase za rad sa fuzzy logikom. To znai da je za svako pravilo morao da bude kreiran po jedan objekat odgovarajue klase, koja je izvedena iz klase Aktivacija. Prirodno reenje je bilo da se upotrebni projektni uzorak Fabrika. U metodu initRuleBlock(Tree, FunkcijskiBlok, boolean) se definie objekat apstraktne klase FabrikaAktivacija.

    private void initRuleBlock(Tree cvorRuleBlock, FunkcijskiBlok

    funkcijskiBlok, boolean error) {

    fabrikaAktivacija = null;

    for (int k = 1; k < cvorRuleBlock.getChildCount(); k++) {

    if (...)

    ...

    else if

    (cvorRuleBlock.getChild(k).getText().equalsIgnoreCase("ACT")) {

    fabrikaAktivacija =

    initRuleBlockAct(cvorRuleBlock.getChild(k), error);

    }

    ...

    else if

    (cvorRuleBlock.getChild(k).getText().equalsIgnoreCase("RULE")){

    initRuleBlockRule(cvorRuleBlock.getChild(k), bp,

    funkcijskiBlok, fabrikaAktivacija);

    }

    }

    }

    Metod initRuleBlockAct(CommonTree, boolean) kao rezultat vraa objekat klase FabrikaAktivacija. Unutar njega se uporeuje sadraj prosleenog vora i kreira konkretan objekat jedne od fabrikih klasa. Taj objekat se prosleuje metodu initRuleBlockRule(CommonTree, BazaPravila, FunkcijskiBlok, FabrikaAktivacija).

    Ovim je reen problem kreiranja potrebnih klasa. U jednom metodu se vri kreiranje fabrike, koja se posle koristi u drugom metodu da bi se kreirali konkretni objekti.

    Kreiranje fabrike se radi sledeim delom kda metoda initRuleBlockAct(CommonTree, boolean):

    FabrikaAktivacija fabrikaAktivacija = null;

    if(cvorRuleBlockAct.getChild(0).getText().equalsIgnoreCase("MIN"))

    {

    fabrikaAktivacija = new FabrikaAktivacijaMin();

    } else if

    (cvorRuleBlockAct.getChild(0).getText().equalsIgnoreCase("PROD"))

    {

    fabrikaAktivacija = new FabrikaAktivacijaProd();

    }

    return fabrikaAktivacija;

    19

  • Konkretni objekti aktivacija se dobijaju pozivom metoda kreirajAktivaciju():

    Aktivacija aktivacija = fabrikaAktivacija.kreirajAktivaciju();

    3.2. Osnovne klase za rad sa fuzzy logikomOsnova celog sistema predstavlja skup klasa koje implementiraju algoritme fuzzy logike. One su rasporeene u sledeim paketima:

    Paket fuzzy.baza sadri klase koje implementiraju osnovne delove koji se javljaju u tipinom FCL opisu. Ove klase uvaju opisanu strukturu, i implementiraju osnovne algoritme, poput onih za raunanje istinitosti poduslova.

    Paket fuzzy.agregacija sadri klase koje implementiraju potrebne algoritme za agregaciju. Postoji apstraktna klasa fuzzy.agregacija.Agregacija iz koje su izvedene sve ostale.

    Paket fuzzy.aktivacija sadri klase koje implementiraju algoritam aktivacije pravila. Kako se korieni algoritam aktivacije definie van dela gde si i koristi, ovde je iskorien projektni uzorak Fabrika, to je detaljno objanjeno u prethodnom odeljku.

    Paket fuzzy.akumulacija sadri klase koje implementiraju algoritme akumulacije.

    Paket fuzzy.clanstvo sadri klase koje implementiraju algoritme za izraunavanje vrednosti lanstva, odnosno istinitosti.

    Paket fuzzy.koncentracija sadri klase koje implementiraju algoritme za defazifikaciju, odnosno koncentraciju izlaznih promenljiva.

    Paket fuzzy.exception sadri klase za izuzetke, koji se koriste za prijavu neregularnosti prilikom izvravanja ili podeavanja sistema.

    Prvo e biti obraeni paketi koji sadre klase sa algoritmima za agregaciju, aktivaciju, akumulaciju, funkcije lanstva i koncentraciju, pa e tek onda biti objanjen bazni paket, jer on podrazumeva nain rada prethodnih paketa.

    Klase za agregaciju i akumulaciju rade na slinom principu. Dovoljno je instancirati jedan objekat te klase, poto se konkretno raunanje vri nad prosleenim parametrima, te nije potrebno uvati nikakve podatke u okviru atributa.

    Za razliku od te dve grupe klasa, klase za aktivaciju rade malo drugaije. Aktivacija sadri dva privatna atributa, a to su funkcija lanstva i vrednost istinitosti. Funkcija lanstva predstavlja funkciju lanstva odreenog skupa nad jednom izlaznom promenljivom. Svaki objekat aktivacije odgovara jednom objektu posledice. Na primer, za objekat koji predstavlja posledicu brzina IS mala, postojae jedan objekat aktivacije koji e imati funkciju lanstva

    20

  • skupa mala nad izlaznom promenljivom brzina. Nakon to se izrauna istinitost uslova nekog pravila, vrednost istinitosti aktivacije se podeava na istu vrednost. Koristei ta dva podatka, metod getVrednostNa(double) moe da izrauna vrednost koju aktivirana posledica ima na nekoj koordinati, izraenoj realnim parametrom koji se prosleuje metodu getVrednostNa.

    Funkcija lanstva sadri niz koordinata na x i y osama. Vrednost funkcije za konkretnu koordinatu na x osi se rauna funkcijom izraunaj. Ako je u pitanju trougaona ili trapezoidna funkcija, tada se vrednost interpolira na osnovu niza koordinata na x i y osama. Na primer, unutar trougaone funkcije lanstva, vrednost se rauna sledeim delom kda:

    if (vrednost tackeX.get(0) && vrednost < tackeX.get(1)) {

    return (1 / (tackeX.get(1) - tackeX.get(0))) * (vrednost -

    tackeX.get(0));

    } else if (vrednost == tackeX.get(1)) {

    return tackeY.get(1);

    } else if (vrednost > tackeX.get(1) && vrednost < tackeX.get(2)) {

    return (-1 / (tackeX.get(2) - tackeX.get(1))) * (vrednost -

    tackeX.get(1)) + 1;

    } else {

    return 0;

    }

    Dati segment koda funkcionie tako da ako je zadata vrednost manja ili jednaka od prve take na x-osi, ili vea ili jednaka od poslednje, tada ona ima vrednost 0. Ako se taka nalazi izmeu prve i poslednje koordinate na x-osi, tada se njena vrednost interpolira koristei jednainu prave na osnovu dve take. Na slian nain se rauna i vrednost u sluaju trapezoidne funkcije.

    Defazifikacija se rauna tako to se objektu koncentracije prosledi objekat koji rauna akumulaciju, i promenljiva za koju se radi defazifikacija.

    akumulacija.setAktivacije(promenljiva.getAktivacije());

    double korak = (promenljiva.getDomenMax() -

    promenljiva.getDomenMin()) / brojKoraka;

    double trenutna = promenljiva.getDomenMin();

    double suma1 = 0, suma2 = 0;

    for (int i = 0; i < brojKoraka; i++, trenutna += korak) {

    suma1 += akumulacija.getVrednostNa(trenutna) * trenutna;

    suma2 += akumulacija.getVrednostNa(trenutna);

    }

    return suma1 / suma2;

    Prikazani segment kda radi defazifikaciju primenom algoritma centar gravitacije. Za integraciju se koristi sumiranje na odreenom broju koraka, koji je u programu definisan da bude 1000. Korak se odreuje kao duina domena promenljive, podeljen sa brojem koraka.

    21

  • Na kraju se vraa defazifikovana vrednost.

    Unutar paketa fuzzy.baza nalaze se sledee klase:

    FunkcijskiBlok sadri sve potrebne podatke koje opisuju jedan funkcijski blok, a to su: svi definisani blokovi pravila, sve izlazne i ulazne promenljive i svi skupovi nad izlaznim i ulaznim promenljivama. Takoe implementira i skup standardnih get/set metoda, koje olakavaju dodavanje i izbacivanje podataka.

    Promenljiva je klasa koja uva ime promenljive, domen promenljive, podrazumevanu vrednost, njenu konkretnu vrednost koju podeava korisnik i definisane skupove nad tom promenljivom. Zbog toga to se defazifikacija rauna nad jednom izlaznom promenljivom, onda se uva i niz aktiviranih funkcija lanstva. uva se i objekat za koncentraciju, koji se koristi da bi se izraunala koncentrisana, odnosno defazifikovana vrednost. Postoji i bulova promenljiva koja govori da li je promenljiva izlazna ili ne, i da li je diskretna ili ne. Diskretna promenljiva oznaava da skupovi definisani nad njom moraju biti tipa singlton, ili neke druge diskretne funkcije lanstva u sluaju da se implementira.

    Pravilo uva podatke o pravilu, a to su njegovo ime, koje je predstavljeno brojem, uslov i posledice, kao i aktivacije. Aktivacije odgovaraju posledicama.

    3.2.1. Izraunavanje pravilaIzraunavanje pravila se sastoji iz dva dela. Prvi deo je izraunavanje vrednosti istinitosti uslova, to se vri pozivom metoda uslov.izracunaj().

    double rezultat = uslov.izracunaj();

    Nakon toga se ta vrednost postavlja u svim objektima aktivacija. Kao to je malopre spomenuto, ovi objekti odgovaraju posledicama.

    for (Aktivacija a : aktivacije) {

    a.setVrednostOstvarenosti(rezultat);

    }

    Metod izracunaj() klase Uslov je deklarisana u interfejsu IUslov. Ovaj interfejs implemenitraju dve klase, ve spomenuta klasa Uslov i klasa Poduslov. Klasa Uslov uva dva lana, tj. dva poduslova, i objekat agregacije. Njen metod izracunaj() je sledei:

    if (agregacija != null) {

    return agregacija.izracunaj(clan1, clan2);

    } else {

    return clan1.izracunaj();

    }

    Ovde se vidi da ako je objekat agregacije definisan, to znai da postoje dva lana. U tom sluaju se poziva metod izracunaj() objekta agregacije, koji primenjuje jedan od definisanih

    22

  • algoritama agregacije (u zavisnosti od podeavanja), i rauna agregiranu vrednost od dva lana. U sluaju da je objekat agregacije nedefinisan, onda postoji samo jedan lan u uslovu. Tada se vrednost istinitosti rauna pozivom metoda izracunaj() datog objekta.

    U principu, uslov ini jedno stablo objekata, koje moe da ima samo koren, u sluaju kad ceo uslov ini samo jedan poduslov, a moe i da bude kompleksnije stablo, u sluaju nekog veeg uslova, koje sadri vie poduslova povezanih AND i OR operatorima

    Specifikacijom FCL-a OR operator ima nii prioritet od AND operatora. Problem prioriteta je reen tako to gramatika definie dva pravila za uslov.

    condition : subcondition_and ((OR^) subcondition_and)*;

    subcondition_and : subcondition ((AND^) subcondition)*;

    Zbog naina izraunavanja uslova (a to je rekurzivno sputanje, poevi od korena uslova), prvo e se izvriti raunanje poduslova koji su vezani operatorom AND, pa tek onda onih poduslova vezanih operatorom OR. Time je ouvan korektan prioritet operatora.

    Nakon to je izraunata vrednost istinitosti uslova, vri se aktiviranje posledica, akumulacija i koncentracija. Ovo se zapravo radi unutar poziva metoda koncentracija() klase Koncentracija. U odeljku 3.2. Osnovne klase za rad sa fuzzy logikom prikazan je rad ovog metoda. Treba napomenuti da se u okviru tog metoda vri poziv metoda getVrednostNa(double) klase Akumulacija, koji dalje vri poziv metoda getVrednostNa(double) klase Aktivacija. Ovo pokazuje da se ova tri koraka izravaju u drugom delu izvravanja pravila.

    23

  • 4. ZakljuakU okviru rada, bilo je potrebno realizovati simulator algoritama fuzzy logike, koji e biti ukljuen u vei edukacioni sistem za predmet Ekspertski sistemi. Konkretno su realizovani:

    Osnova sistema, koja prua osnovne algoritme i strukture podataka za rad sa fuzzy logikom, tanije sa sistemom koji se definie koristei Fuzzy Control Language, jezik za opis sistema kontrolisanih pomou fuzzy logike.

    Leksiki analizator i parser, koje je generisao programski alat ANTLR (ANother Tool for Language Recognition). Ulaz ANTLR-a predstavlja datoteka sa opisom gramatike FCL-a. Izlaz predstavlja implementirani parser u Javi. Izlaz parsera predstavlja apstraktno sintaksno stablo koje je pogodan ulaz za osnovu sistema.

    Grafiko okruenje, koje se uklapa u grafiko okruenje celog edukacionog sistema, preko implementacije interfejsa zahtevanog od strane grafikog okruenja edukacionog sistema.

    Autor je u toku diplomskog rada imao priliku da proiri iskustvo u radu sa programskim jezikom Java, posebno u oblasti kreiranja grafikih korisnikih interfejsa. Takoe je nauen i rad sa generatorom parsera ANTLR i okruenjem ANTLRworks. Ovo okruenje, kao to je ve reeno, olakava pisanje gramatike za odreeni jezik.

    4.1. Mogua unapreenjaOno to je najuoljivija mogunost za unapreenje je omoguavanje simulatora da paralelno uita vie simulacija, i da omogui korisniku da se kree kroz iste. Kako je ovo ve podrano u okviru osnove sistema, dovoljno je samo prilagoditi grafiki interfejs da moe da interaguje sa vie simulacija, umesto samo sa jednom.

    Drugo poboljanje bi bilo povezivanje osnove sistema sa nekim produkcionim sistemom, tako da se dobije fuzzy produkcioni sistem.

    Na kraju, u osnovi je implementiran skup algoritama propisanih IEC-ovom specifikacijom 1311-7. Unutar fuzzy logike postoji dosta drugih algoritama, koji su opisani u raznoj literaturi, i koji bi se mogli implementirati u okviru sistema, programiranjem odgovarajuih izvedenih klasa. Takoe je prilino jednostavno proiriti parser za ove nove funkcije, to bi se uradilo pisanjem dodatnih gramatikih pravila, generisanjem novog parsera, i implementacijom potrebnih initX() metoda u okviru klase Sistem.

    24

  • Literatura

    25

    UvodOpis dokumentaOsnovno o teoriji fuzzy skupovaOsnovno o fuzzy logici

    1. Zahtevi za izradu sistema1.1. Opis jezika Fuzzy Control Language1.1.1. Opis funkcija lanstva1.1.2. Opis metoda defazifikacije1.1.3. Opis metoda agregacije1.1.4. Opis metoda aktivacije1.1.5. Opis metoda akumulacije1.1.6. Opis bloka pravila i pravila

    1.2. Opis Jave i korienih biblioteka1.2.1. Opis biblioteke ANTLR i alata ANTLRworks1.2.2. Opis JFreeChart biblioteke

    2. Rad softverskog sistema2.1. Pokretanje simulatora2.2. Inicijalizacija simulatora2.3. Uitavanje opisa sistema2.3.1. Osnovni nain uitavanja opisa sistema2.3.2. Napredni nain uitavanja opisa sistema

    2.4. Kretanje kroz simulaciju2.5. Naknadna podeavanja simulacije2.6. uvanje simulacije2.7. Prijava greaka

    3. Realizacija sistema3.1. Parsiranje ulazne datoteke3.1.2. Obrada podataka o aktivaciji

    3.2. Osnovne klase za rad sa fuzzy logikom3.2.1. Izraunavanje pravila

    4. Zakljuak4.1. Mogua unapreenja

    Literatura