Anda di halaman 1dari 6

Contoh Penerapan Fuzzy Logic - Metode Tsukamoto menggunakan Matlab Bagi anda yang mempelajari tentang Artificial Intelligence

pada pokok bahasan Fuzzy Logic, ada tiga metode yang sering digunakan dalam menyelesaikan masalah dengan menggunakan konsep fuzzy logic, yaitu: (1) Metode Tsukamoto; (2) Metode Mamdani; (3) Metode Sugeno. Pada kesempatan ini, saya akan menerapkan metode Tsukamoto untuk menyelesaikan sebuah contoh masalah sederhana menggunakan aplikasi Matlab. Sebagaimana kita ketahui bahwa Matlab tidak menyediakan metode ini (Tsukamoto) pada toolbox fuzzy, maka kita akan mencobanya dengan koding. Prosedur Fuzzy Logic: 1. 2. 3. 4. Fuzzifikasi; Pembentukan Rule Mesin Inferensi Defuzzifikasi Membuat fungsi untuk fuzzifikasi Buatlah sebuah fungsi di Matlab, misalnya diberi nama "Fuzzifikasi.m". Fungsi ini saya buat karena metode Tsukamoto tidak didukung oleh Matlab dan untuk digunakan dalam menyelesaikan prosedur fuzzifikasi. Berikut ini adalah kodingnya. function [fuzzy] = Fuzzifikasi(crispX, maxX, minX, apa) switch apa case 'turun' fuzzy = (maxX-crispX)/(maxX-minX); case 'naik' fuzzy = (crispX-minX)/(maxX-minX); case 'turunS' fuzzy = 2*((maxX-crispX)/(maxX-minX))^2; case 'naikS' fuzzy = 1-2*((maxX-crispX)/(maxX-minX))^2; otherwise fuzzy = 0.0; end end Membuat Fungsi untuk Pembentukan Rule dan Mesin Inferensi Buatlah lagi sebuah fungsi di Matlab, misalnya diberi nama "RuleDanMesinInferensi.m". Fungsi ini saya buat karena metode Tsukamoto tidak didukung oleh Matlab dan untuk digunakan dalam menyelesaikan prosedur pembentukan rule dan mesin inferensi. Berikut ini adalah kodingnya. function [crispX, fuzzyX] = RuleDanMesinInferensi(fuzzyTemp1, fuzzyTemp2, minX, maxX, apa, operatorX) if (fuzzyTemp1 > 0) && (fuzzyTemp2 > 0) switch operatorX

case 'AND' if fuzzyTemp1 < fuzzyTemp2 fuzzyX = fuzzyTemp1; else fuzzyX = fuzzyTemp2; end case 'OR' if fuzzyTemp1 > fuzzyTemp2 fuzzyX = fuzzyTemp1; else fuzzyX = fuzzyTemp2; end end switch apa case 'turun' crispX = maxX-((maxX-minX)*fuzzyX); % fuzzyX=(Max-crispX)/(MaxMin) case 'naik' crispX = minX+((maxX-minX)*fuzzyX); % fuzzyX=(crispX-Min)/(MaxMin) end else fuzzyX = 0.0; crispX = 0; end end Contoh Kasus Buatlah sebuah script di Matlab, misalnya diberi nama "TsukamotoFuzzyLogic.m" kemudian silahkan simak keterangan-keterangan pada koding berikut ini. %TINGGI BADAN --> Pendek - Sedang - Tinggi x=0:0.1:200; y1=trapmf(x,[0 0 100 140]); y2=trimf(x,[125 150 175]); y3=trimf(x,[160 200 200]); figure(1); plot(x,y1,x,y2,x,y3); %Fuzzifikasi: crisp=165; [fuzzyPendek] = Fuzzifikasi(0,0,0,'-'); %karena 165 gak menyentuh golongan pendek max=175; min=150; [fuzzySedang] = Fuzzifikasi(crisp,max,min,'turun'); %panggil function Fuzzifikasi max=200; min=160; [fuzzyTinggi] = Fuzzifikasi(crisp,max,min,'naik'); %title n label title('TINGGI BADAN'); xlabel('Y1=Pendek(100-140); Y2=Sedang(125-175); Y3=Tinggi(160-200)'); ylabel('FUZZY'); %teks

teksPendek = ['Pendek[165]=',num2str(fuzzyPendek)]; teksSedang = ['Sedang[165]=',num2str(fuzzySedang)]; teksTinggi = ['Tinggi[165]=',num2str(fuzzyTinggi)]; text(110,0.8,teksPendek); text(crisp,fuzzySedang,teksSedang); text(crisp,fuzzyTinggi,teksTinggi); grid; %BERAT BADAN --> Ringan - Normal - Berat x = 0:0.1:100; y1 = trapmf(x,[0 0 10 50]); y2 = trimf(x,[25 50 75]); y3 = trapmf(x,[50 90 100 100]); figure(2); plot(x,y1,x,y2,x,y3); %Fuzzifikasi: crisp=55; [fuzzyRingan] = Fuzzifikasi(0,0,0,'-'); %karena 50 gak menyentuh golongan Ringan max=75; min=50; [fuzzyNormal] = Fuzzifikasi(crisp,max,min,'turun'); max=90; min=50; [fuzzyBerat] = Fuzzifikasi(crisp,max,min,'naik'); %titel n label title('BERAT BADAN'); xlabel('Y1=Ringan(10-50); Y2=Normal(25-75); Y3=Berat(50-90)'); ylabel('FUZZY'); teksRingan = ['Ringan[55]=',num2str(fuzzyRingan)]; teksNormal = ['Normal[55]=',num2str(fuzzyNormal)]; teksBerat = ['Berat[55]=',num2str(fuzzyBerat)]; text(10,0.8,teksRingan); text(crisp,fuzzyNormal,teksNormal); text(crisp,fuzzyBerat,teksBerat); grid; %IDEAL BADAN --> Kurus - Ideal - Gemuk x = 0:0.1:10; y1 = trimf(x,[0 1.5 3]); y2 = trimf(x,[3 5 7]); y3 = trimf(x,[7 8.5 10]); figure(3); plot(x,y1,x,y2,x,y3); %Fuzzifikasi Tinggi Badan: crisp=165; [fuzzyPendek] = Fuzzifikasi(0,0,0,'-'); max=175; min=150; [fuzzySedang] = Fuzzifikasi(crisp,max,min,'turun'); max=200; min=160; [fuzzyTinggi] = Fuzzifikasi(crisp,max,min,'naik'); %Fuzzifikasi Berat Badan: crisp=55; [fuzzyRingan] = Fuzzifikasi(0,0,0,'-'); max=75; min=50; [fuzzyNormal] = Fuzzifikasi(crisp,max,min,'turun'); max=90; min=50; [fuzzyBerat] = Fuzzifikasi(crisp,max,min,'naik'); %Pembentukan Rule dan Mesin Inferensi %Diketahui: minKurusNaik = 0; maxKurusNaik = 1.5; minKurusTurun = 1.5; maxKurusTurun = 3; minIdealNaik = 3; maxIdealNaik = 5; minIdealTurun = 5; maxIdealTurun = 7; minGemukNaik = 7; maxGemukNaik = 8.5; minGemukTurun = 8.5; maxGemukTurun = 10; %IF TinggiBadan is Tinggi AND BeratBadan is Ringan THEN IdealBadan is Kurus [crispKurus1, fuzzyKurus1] = RuleDanMesinInferensi(fuzzyTinggi, fuzzyRingan, minKurusNaik, maxKurusNaik, 'naik', 'AND'); %Hitung sj dulu yg naik

if (crispKurus1 > minKurusTurun) || (crispKurus1 < maxKurusTurun) %Cari antara naik atau turun [crispKurus1, fuzzyKurus1] = RuleDanMesinInferensi(fuzzyTinggi, fuzzyRingan, minKurusTurun, maxKurusTurun, 'turun', 'AND'); end %IF TinggiBadan is Tinggi AND BeratBadan is Normal THEN IdealBadan is Kurus [crispKurus2, fuzzyKurus2] = RuleDanMesinInferensi(fuzzyTinggi, fuzzyNormal, minKurusNaik, maxKurusNaik, 'naik', 'AND'); if (crispKurus2 > minKurusTurun) || (crispKurus2 < maxKurusTurun) [crispKurus2, fuzzyKurus2] = RuleDanMesinInferensi(fuzzyTinggi, fuzzyNormal, minKurusTurun, maxKurusTurun, 'turun', 'AND'); end %IF TinggiBadan is Sedang AND BeratBadan is Ringan THEN IdealBadan is Kurus [crispKurus3, fuzzyKurus3] = RuleDanMesinInferensi(fuzzySedang, fuzzyRingan, minKurusNaik, maxKurusNaik, 'naik', 'AND'); if (crispKurus3 > minKurusTurun) || (crispKurus3 < maxKurusTurun) [crispKurus3, fuzzyKurus3] = RuleDanMesinInferensi(fuzzySedang, fuzzyRingan, minKurusTurun, maxKurusTurun, 'turun', 'AND'); end %IF TinggiBadan is Pendek AND BeratBadan is Ringan THEN IdealBadan is Ideal [crispIdeal1, fuzzyIdeal1] = RuleDanMesinInferensi(fuzzyPendek, fuzzyRingan, minIdealNaik, maxIdealNaik, 'naik', 'AND'); if (crispIdeal1 > minIdealTurun) || (crispIdeal1 < maxIdealTurun) [crispIdeal1, fuzzyIdeal1] = RuleDanMesinInferensi(fuzzyPendek, fuzzyRingan, minIdealTurun, maxIdealTurun, 'turun', 'AND'); end %IF TinggiBadan is Sedang AND BeratBadan is Normal THEN IdealBadan is Ideal [crispIdeal2, fuzzyIdeal2] = RuleDanMesinInferensi(fuzzySedang, fuzzyNormal, minIdealNaik, maxIdealNaik, 'naik', 'AND'); if (crispIdeal2 > minIdealTurun) || (crispIdeal2 < maxIdealTurun) [crispIdeal2, fuzzyIdeal2] = RuleDanMesinInferensi(fuzzySedang, fuzzyNormal, minIdealTurun, maxIdealTurun, 'turun', 'AND'); end %IF TinggiBadan is Tinggi AND BeratBadan is Berat THEN IdealBadan is Ideal [crispIdeal3, fuzzyIdeal3] = RuleDanMesinInferensi(fuzzyTinggi, fuzzyBerat, minIdealNaik, maxIdealNaik, 'naik', 'AND'); if (crispIdeal3 > minIdealTurun) || (crispIdeal3 < maxIdealTurun) [crispIdeal3, fuzzyIdeal3] = RuleDanMesinInferensi(fuzzyTinggi, fuzzyBerat, minIdealTurun, maxIdealTurun, 'turun', 'AND'); end %IF TinggiBadan is Pendek AND BeratBadan is Berat THEN IdealBadan is Gemuk [crispGemuk1, fuzzyGemuk1] = RuleDanMesinInferensi(fuzzyPendek, fuzzyBerat, minGemukNaik, maxGemukNaik, 'naik', 'AND'); if (crispGemuk1 > minGemukTurun) || (crispGemuk1 < maxGemukTurun) [crispGemuk1, fuzzyGemuk1] = RuleDanMesinInferensi(fuzzyPendek, fuzzyBerat, minGemukTurun, maxGemukTurun, 'turun', 'AND'); end

%IF TinggiBadan is Pendek AND BeratBadan is Normal THEN IdealBadan is Gemuk [crispGemuk2, fuzzyGemuk2] = RuleDanMesinInferensi(fuzzyPendek, fuzzyNormal, minGemukNaik, maxGemukNaik, 'naik', 'AND'); if (crispGemuk2 > minGemukTurun) || (crispGemuk2 < maxGemukTurun) [crispGemuk2, fuzzyGemuk2] = RuleDanMesinInferensi(fuzzyPendek, fuzzyNormal, minGemukTurun, maxGemukTurun, 'turun', 'AND'); end %IF TinggiBadan is Sedang AND BeratBadan is Berat THEN IdealBadan is Gemuk [crispGemuk3, fuzzyGemuk3] = RuleDanMesinInferensi(fuzzySedang, fuzzyBerat, minGemukNaik, maxGemukNaik, 'naik', 'AND'); if (crispGemuk3 > minGemukTurun) || (crispGemuk3 < maxGemukTurun) [crispGemuk3, fuzzyGemuk3] = RuleDanMesinInferensi(fuzzySedang, fuzzyBerat, minGemukTurun, maxGemukTurun, 'turun', 'AND'); end %Label xlabel('Y1=Kurus(0-3); Y2=Ideal(3-7); Y3=Gemuk(7-10)'); ylabel('FUZZY'); if (crispKurus1 ~= 0) && (fuzzyKurus1 ~= 0.0) teks1 = ['Kurus[',num2str(crispKurus1),']=',num2str(fuzzyKurus1)]; text(crispKurus1,fuzzyKurus1,teks1); end if (crispKurus2 ~= 0) && (fuzzyKurus2 ~= 0.0) teks2 = ['Kurus[',num2str(crispKurus2),']=',num2str(fuzzyKurus2)]; text(crispKurus2,fuzzyKurus2,teks2); end if (crispKurus3 ~= 0) && (fuzzyKurus3 ~= 0.0) teks3 = ['Kurus[',num2str(crispKurus3),']=',num2str(fuzzyKurus3)]; text(crispKurus3,fuzzyKurus3,teks3); end if (crispIdeal1 ~= 0) && (fuzzyIdeal1 ~= 0.0) teks4 = ['Ideal[',num2str(crispIdeal1),']=',num2str(fuzzyIdeal1)]; text(crispIdeal1,fuzzyIdeal1,teks4); end if (crispIdeal2 ~= 0) && (fuzzyIdeal2 ~= 0.0) teks5 = ['Ideal[',num2str(crispIdeal2),']=',num2str(fuzzyIdeal2)]; text(crispIdeal2,fuzzyIdeal2,teks5); end if (crispIdeal3 ~= 0) && (fuzzyIdeal3 ~= 0.0) teks6 = ['Ideal[',num2str(crispIdeal3),']=',num2str(fuzzyIdeal3)]; text(crispIdeal3,fuzzyIdeal3,teks6); end if (crispGemuk1 ~= 0) && (fuzzyGemuk1 ~= 0.0) teks7 = ['Gemuk[',num2str(crispGemuk1),']=',num2str(fuzzyGemuk1)]; text(crispGemuk1,fuzzyGemuk1,teks7); end if (crispGemuk2 ~= 0) && (fuzzyGemuk2 ~= 0.0) teks8 = ['Gemuk[',num2str(crispGemuk2),']=',num2str(fuzzyGemuk2)]; text(crispGemuk2,fuzzyGemuk2,teks8);

end if (crispGemuk3 ~= 0) && (fuzzyGemuk3 ~= 0.0) teks9 = ['Gemuk[',num2str(crispGemuk3),']=',num2str(fuzzyGemuk3)]; text(crispGemuk3,fuzzyGemuk3,teks9); end %Defuzzifikasi Z= ((fuzzyKurus1*crispKurus1)+(fuzzyKurus2*crispKurus2)+(fuzzyKurus3*crispKuru s3)+(fuzzyIdeal1*crispIdeal1)+(fuzzyIdeal2*crispIdeal2)+(fuzzyIdeal3*crispIdeal3) +(fuzzyGemuk1*crispGemuk1)+(fuzzyGemuk2*crispGemuk2)+(fuzzyGemuk3*cris pGemuk3))/(fuzzyKurus1+fuzzyKurus2+fuzzyKurus3+fuzzyIdeal1+fuzzyIdeal2+fu zzyIdeal3+fuzzyGemuk1+fuzzyGemuk2+fuzzyGemuk3); teksTSUKAMOTO = ['TSUKAMOTO [Z] = ',num2str(Z)]; title({'IDEAL BADAN',teksTSUKAMOTO}); grid; Saat script tersebut dijalankan, maka akan tampil hasil seperti pada gambar berikut.

Diposkan 24th June 2012 oleh Azminuddin Azis Lokasi: Semarang, Indonesia Label: Artificial Intellegence (Fuzzy Logic) Soft Computing