diff --git a/dopasowanie.fcl b/dopasowanie.fcl new file mode 100644 index 0000000..8a9b5bd --- /dev/null +++ b/dopasowanie.fcl @@ -0,0 +1,56 @@ +FUNCTION_BLOCK dopasowanie + +VAR_INPUT + wiek : REAL; + wzrost : REAL; + wartosc_rynkowa: REAL; + czestotliwosc_strzalow: REAL; +END_VAR + +VAR_OUTPUT + dopasowanie : REAL; +END_VAR + +FUZZIFY wiek // Zmienna 'wiek': {'mlody', 'sredni' , 'stary'} + TERM mlody := (0, 1) (25, 1) (30, 0) ; + TERM sredni := (18, 0) (25, 1) (35, 1) (45, 0); + TERM stary := (40, 0) (45, 1); +END_FUZZIFY + +FUZZIFY wzrost // Zmienna 'wzrost': { 'niski', 'sredni', 'wysoki' } + TERM niski := (0, 1) (150, 1) (160, 0) ; + TERM sredni := (160, 0) (170, 1) (180, 0); + TERM wysoki := (175, 0) (190, 1); +END_FUZZIFY + +FUZZIFY wartosc_rynkowa // Zmienna 'wartosc_rynkowa': { 'niska', 'srednia', 'wysoka' } + TERM niska := (0, 1) (0.5, 1) (1, 0) ; + TERM sredna := (0.5, 0) (1, 1) (1.5, 1) (2, 0); + TERM wysoka := (1.75, 0) (2, 1); +END_FUZZIFY + +FUZZIFY czestotliwosc_strzalow // Zmienna 'czestotliwosc_strzalow': { 'mala', 'srednia', 'wysoka' } + TERM mala := (400, 0) (500, 1); + TERM srednia := (150, 0) (200, 1) (350, 1) (500, 0); + TERM wysoka := (0, 1) (150, 1) (200, 0); +END_FUZZIFY + +DEFUZZIFY dopasowanie // Zmienna 'dopasowanie' : {'slabe', 'dobre', 'bardzodobre'} + TERM slabe := (0, 1) (40, 1) (50, 0); + TERM dobre := (40, 0) (50, 1) (60, 1) (80, 0); + TERM bardzodobre := (70, 0) (80, 1); + METHOD : COG; // Metoda defuzyfikacji - 'Center Of Gravity' - 'Sreodka ciezkosci' +END_DEFUZZIFY + +RULEBLOCK No1 + AND : MIN; // Uzycie 'min' jako 'and' (implikuje uzycie 'max' jako 'or' dla zapewnienia praw DeMorgan'a) + ACT : MIN; // Uzycie 'min' jako metody aktywacji + ACCU : MAX; // Metoda agregacji - 'max' + + RULE 1 : IF wiek IS mlody AND wzrost is sredni AND wartosc_rynkowa IS niska AND czestotliwosc_strzalow IS srednia THEN dopasowanie IS dobre; + RULE 3 : IF wiek IS sredni AND wzrost is wysoki AND wartosc_rynkowa IS srednia AND czestotliwosc_strzalow IS wysoka THEN dopasowanie IS bardzodobre; + RULE 4 : IF wiek IS sredni AND wzrost is niski AND wartosc_rynkowa IS srednia AND czestotliwosc_strzalow IS niska THEN dopasowanie IS slabe; +END_RULEBLOCK + +END_FUNCTION_BLOCK + diff --git a/dopasowanie.java b/dopasowanie.java new file mode 100644 index 0000000..57c3ba4 --- /dev/null +++ b/dopasowanie.java @@ -0,0 +1,40 @@ +import net.sourceforge.jFuzzyLogic.FIS; +import net.sourceforge.jFuzzyLogic.FunctionBlock; +import net.sourceforge.jFuzzyLogic.Gpr; +import net.sourceforge.jFuzzyLogic.plot.JFuzzyChart; +import net.sourceforge.jFuzzyLogic.rule.Variable; + +public class dopasowanie { + + public static void main(String[] args) throws Exception { + // Laduje plik 'FCL' + String fileName = "dopasowanie.fcl"; + FIS fis = FIS.load(fileName, true); + if (fis == null) { // Error while loading? + System.err.println("Can't load file: '" + fileName + "'"); + return; + } + + // Pokazuje reguly + FunctionBlock functionBlock = fis.getFunctionBlock(null); + JFuzzyChart.get().chart(functionBlock); + + // Ustawia zmienne wejsciowe + functionBlock.setVariable("wiek", 28); + functionBlock.setVariable("wzrost", 185); + functionBlock.setVariable("wartosc_rynkowa", 2.5); + functionBlock.setVariable("czestotliwosc_strzalow", 165); + + // Uruchamia blok wniskujÄ…cy + functionBlock.evaluate(); + + // Wyswietla wykres + Variable match = functionBlock.getVariable("dopasowanie"); + JFuzzyChart.get().chart(match, match.getDefuzzifier(), true); + Gpr.debug("poor[service]: " + functionBlock.getVariable("wartosc_rynkowa").getMembership("niska")); + + // Wyswietla reguly + System.out.println(functionBlock); + System.out.println("DOPASOWANIE:" + functionBlock.getVariable("dopasowanie").getValue()); + } +}