Halo Fanbot.
Kalian sudah pernah mendengar Logika Fuzzy?
Logika Fuzzy merupakan suatu logika yang memiliki nilai kesamaran (Fuzzyness) antara nilai benar dan nilai salah. Mungkin lebih jelasnya, Logika Fuzzy merupakan logika yang dapat memperjelas nilai antara benar atau salah.
Logika Fuzzy biasa berfungsi untuk teori kontrol, pengambilan keputusan, dan beberapa bagian dalam sains. Kelebihan dari adanya logika Fuzzy adalah adanya penalaran secara bahasa (linguistic reasoning), sehingga tidak perlu menggunakan persamaan matematik dari obyek yang dikendalikan. Misalnya saja ketika kita ingin membahasakan suatu nilai dari jarak apakah jauh atau dekat, maka dengan logika fuzzy, aturannya bisa menjadi Jauh, sedang, dan dekat. Kemudian kualifikasi range mana yang jauh, sedang, ataupun dekat.
Nah pada bahasan kali ini, kita tidak akan membahas panjang lebar terkait Logika Fuzzy secara teori, namun kita akan membahas terkait penerapan Logika Fuzzy untuk project mikrokontroler, khususnya bagi kalian yang menggunakan Arduino IDE sebagai software pembuatan program.
Belajar Elektronika, Arduino, dan IoT step by step dengan bantuan tangga belajar? Daftar sekarang dan dapatkan PROMO
Metode Logika Fuzzy yang berfungsi untuk program kali ini adalah Mamdani atau Metode Max-Min. Ebrahim Mamdani yang memperkenalkan metode ini pada tahun 1975. Ada beberapa hal yang perlu untuk menentukan hasil dengan metode Mamdani, yaitu:
Pembentukan variabel Input, Output, dan Himpunan
Input merupakan nilai masukan untuk fuzzy, misalnya kita bisa memasukkan nilai jarak, suhu, atau yang lainnya (biasanya yang dapat terbaca oleh sensor analog). Output merupakan nilai keluaran, contohnya seperti servo, kecerahan LED, atau lainnya (biasanya bentuk aktuator analog). Sedangkan untuk himpunan adalah pembagian dari input atau output secara bahasa. contohnya tinggi, sedang, rendah, atau jauh, sedang, dekat.
Fungsi Keanggotaan
Fungsi keanggotaan atau sering kita sebut juga dengan derajat keanggotaan adalah kurva yang menunjukkan pemetaan titik input data ke dalam nilai keanggotaannya.
Aplikasi Operasi Fuzzy
Operasi fuzzy bertugas untuk mengaplikasikan nilai input ke masing-masing pembagian keanggotaan.
Penegasan (defuzzy)
Proses defuzzy adalah proses dari hasil operasi Fuzzy yang kemudian digunakan untuk menentukan output.
4 Hal di atas dapat di terapkan dalam program berikut ini.
#include <Fuzzy.h> Fuzzy *fuzzy = new Fuzzy(); //inisialisasi untuk nama fuzzy void setup() { Serial.begin(9600); //mengaktifkan serial 9600 randomSeed(analogRead(0)); //setting randomSeed FuzzyInput *distance = new FuzzyInput(1); //input fuzzy (pertama) FuzzySet *small = new FuzzySet(0, 20, 20, 40); //nilai FuzzySet input 1 distance->addFuzzySet(small); //memasukkan nilai small FuzzySet *safe = new FuzzySet(30, 50, 50, 70); //nilai FuzzySet input 2 distance->addFuzzySet(safe); //memasukkan nilai safe FuzzySet *big = new FuzzySet(60, 80, 80, 80); //nilai FuzzySet input 3 distance->addFuzzySet(big); //memasukkan nilai big fuzzy->addFuzzyInput(distance); //memasukkan Fuzzy input ke Fuzzy FuzzyOutput *speed = new FuzzyOutput(1); //output fuzzy (pertama) FuzzySet *slow = new FuzzySet(0, 10, 10, 20); //nilai FuzzySet output 1 speed->addFuzzySet(slow); //memasukkan nilai slow FuzzySet *average = new FuzzySet(10, 20, 30, 40); //nilai FuzzySet output 2 speed->addFuzzySet(average); //memasukkan nilai average FuzzySet *fast = new FuzzySet(30, 40, 40, 50); //nilai FuzzySet output 3 speed->addFuzzySet(fast); //memasukkan nilai fast fuzzy->addFuzzyOutput(speed); //memasukkan Fuzzy output ke Fuzzy // membuat FuzzyRule "JIKA distance = small MAKA speed = slow" FuzzyRuleAntecedent *ifDistanceSmall = new FuzzyRuleAntecedent(); ifDistanceSmall->joinSingle(small); FuzzyRuleConsequent *thenSpeedSlow = new FuzzyRuleConsequent(); thenSpeedSlow->addOutput(slow); FuzzyRule *fuzzyRule01 = new FuzzyRule(1, ifDistanceSmall, thenSpeedSlow); fuzzy->addFuzzyRule(fuzzyRule01); // membuat FuzzyRule "JIKA distance = safe MAKA speed = average" FuzzyRuleAntecedent *ifDistanceSafe = new FuzzyRuleAntecedent(); ifDistanceSafe->joinSingle(safe); FuzzyRuleConsequent *thenSpeedAverage = new FuzzyRuleConsequent(); thenSpeedAverage->addOutput(average); FuzzyRule *fuzzyRule02 = new FuzzyRule(2, ifDistanceSafe, thenSpeedAverage); fuzzy->addFuzzyRule(fuzzyRule02); // membuat FuzzyRule "JIKA distance = big MAKA speed = high" FuzzyRuleAntecedent *ifDistanceBig = new FuzzyRuleAntecedent(); ifDistanceBig->joinSingle(big); FuzzyRuleConsequent *thenSpeedFast = new FuzzyRuleConsequent(); thenSpeedFast->addOutput(fast); FuzzyRule *fuzzyRule03 = new FuzzyRule(3, ifDistanceBig, thenSpeedFast); fuzzy->addFuzzyRule(fuzzyRule03); } void loop() { // nilai random int input = random(0, 80); // menuliskan nilai Serial.println("\n\n\nEntrance: "); Serial.print("\t\t\tDistance: "); Serial.println(input); // setting nilai random menjadi input fuzzy->setInput(1, input); // menjalankan fuzzifikasi fuzzy->fuzzify(); // menjadikan nilai output dari hasil defuzzyfikasi float output = fuzzy->defuzzify(1); // menampilkan pada serial monitor Serial.println("Result: "); Serial.print("\t\t\tSpeed: "); Serial.println(output); // update setiap 12 detik delay(12000); } |
baca juga: Platform Keren dan Userfriendly untuk Project IoT. Apalagi Kalau Bukan Blynk
Kita coba jelaskan urutannya ya.
Pembentukan variabel Input, Output, dan Himpunan
Perhatikan program berikut ini.
FuzzyInput *distance = new FuzzyInput(1); //input fuzzy (pertama) FuzzySet *small = new FuzzySet(0, 20, 20, 40); //nilai FuzzySet input 1 distance->addFuzzySet(small); //memasukkan nilai small FuzzySet *safe = new FuzzySet(30, 50, 50, 70); //nilai FuzzySet input 2 distance->addFuzzySet(safe); //memasukkan nilai safe FuzzySet *big = new FuzzySet(60, 80, 80, 80); //nilai FuzzySet input 3 distance->addFuzzySet(big); //memasukkan nilai big fuzzy->addFuzzyInput(distance); //memasukkan Fuzzy input ke Fuzzy |
Program di atas adalah program yang digunakan untuk menentukan input serta himpunannya. Di mana tertulis FuzzyInput(1) sebagai penentuan input pertama. Himpunannya adalah small, safe, dan big. Sedangkan untuk output, perhatikan program di bawah
FuzzyOutput *speed = new FuzzyOutput(1); //output fuzzy (pertama)
Program ini digunakan untuk penentuan output, di bawah program ini juga merupakan himpunan dari output, yaitu slow, average, speed.
Fungsi Keanggotaan
Fungsi keanggotaan dari program di atas ditentukan pada tiap-tiap himpunan yang kemudian menjadi suatu kurva. Perhatikan program berikut.
FuzzySet *small = new FuzzySet(0, 20, 20, 40); //nilai FuzzySet input 1
Nilai [0, 20, 20, 40] merupakan nilai untuk membentuk kurva small. Begitu juga dengan nilai lainnya dari tiap himpunan.
Aplikasi Operasi Fuzzy
Sebelum masuk ke operasi fuzzy, tentunya perlu adanya aturan fuzzy terlebih dahulu. Program untuk mengaturnya adalah bagian ini.
FuzzyRuleAntecedent *ifDistanceSmall = new FuzzyRuleAntecedent();
ifDistanceSmall->joinSingle(small);
FuzzyRuleConsequent *thenSpeedSlow = new FuzzyRuleConsequent();
thenSpeedSlow->addOutput(slow);
FuzzyRule *fuzzyRule01 = new FuzzyRule(1, ifDistanceSmall, thenSpeedSlow);
fuzzy->addFuzzyRule(fuzzyRule01);
Yang dapat diartikan secara garis besar adalah “Jika small, maka slow”, dan beberapa aturan di bawahnya. Kemudian pengeksekusian dilakukan pada void loop dengan menggunakan function fuzzy fuzzy->fuzzify().
Penegasan (defuzzy)
Defuzzifikasi dilakukan pada saat terakhir dengan program float output = fuzzy->defuzzify(1).
Nilai hasil akhir akan ditampilkan ke serial monitor dalam bentuk angka dari input hingga output hasil logika fuzzy.
baca juga: Ide Project IoT Menggunakan Aplikasi Blynk yang Bisa Kamu Coba
Program di atas menggunakan 1 input dan satu output. Selain itu, nilai input juga masih berdasarkan nilai random. Jika teman-teman ingin mengaplikasikan ke project yang sebenarnya, silakan tentukan nilai input, output, dan lainnya.
Mau belajar elektronika dasar? Arduino? atau Internet of Things? Ikuti kursus online Indobot Academy!