Anda di halaman 1dari 4

Bagi anda yang mempelajari tentang Artificial I ntelligence 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. Fuzzifikasi;
2. Pembentukan Rule
3. Mesin Inferensi
4. 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)/(Max-Min)
case 'naik'
crispX = minX+((maxX-minX)*fuzzyX); % fuzzyX=(crispX-Min)/(Max-Min)
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*crispKurus3)+(fuzzyIdeal1*crispIdeal1
)+(fuzzyIdeal2*crispIdeal2)+(fuzzyIdeal3*crispIdeal3)+(fuzzyGemuk1*crispGemuk1)+(fuzzyGemuk2*crispGemuk
2)+(fuzzyGemuk3*crispGemuk3))/(fuzzyKurus1+fuzzyKurus2+fuzzyKurus3+fuzzyIdeal1+fuzzyIdeal2+fuzzyIdeal3+
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.

Anda mungkin juga menyukai