Logika fuzzy
Logika fuzzy merupakan logika yang digunakan untuk memetakan suatu ruang input ke dalam suatu ruang output, atau logika yang menyatakan tentang suatu nilai abstrak atau semu yang mana memiliki 2 buah nilai sekaligus dalam satu variabel.
contoh penerapan dalam kehidupan sehari hari:
- Manajer pergudangan
- Pelayan restoran
- Penumpang taksi
Fungsi Keanggotaan
1. Representasi linier
Representasi linier merupakan representasi nilai yang menggunakan aturan persamaan garis lurus dengan batasan nilai awal 0 sampai 1 dengan fungsi rumus sebagai berikut :
Diketahui rentang nilai domain suatu data yang menyatakan suhu panas yaitu 20^(o)C sampai 60^(o)C maka apabila 30^(o)C berada di antara rentang nilai domain tersebut berapakah nilai fungsi keanggotaan di suhu 30^(o)C tersebut?
jawab :
dik
suhu 30^(o)C
maka
U(x) = (30-20)/(60-20)
U(x) = (10)/(40)
U(x) = 1/4 = 0,25 derajat keanggotaannya
maka jawaban nya 0,25
2. Diagram segitiga
Pada diagram segitiga ini merupakan suatu fungsi yang memiliki kenaikan dan penurunan dan berbentuk seperti segitiga dengan gambar dan rumusnya:
Dengan contoh soal seperti berikut:
jawab :
dik
a = 20
b = 40
c = 60
maka aturan yang harus digunakan untuk mencari nilai fungsi keanggotaan iyalah:
untuk U(35):
U(35) = (35 - 20) / (40 - 20)
U(35) = (15) / (20)
U(35) = 3/4 = 0,75
untuk U(40):
U(40) = (60 - 55)/(60-40)
U(40) = (15/20)
U(40) = (3/4) = 0,75
maka nilai keanggotaan fungsi nya iyalah U(35) = 0,75 dan U(55) = 0,75
3. Sigmoid logistic
Merupakan aturan grafik yang berbentuk seperti kurfa bell atau mirip seperti grafik distribusi dengan memanfaatkan aturan yang pasti untuk menghitung nilai fungsi keanggotannya iyalah. dengan rumus yang di gunakan :
Diketahui suatu domain himpunan fuzzy sigmoid dengan rentang 20 - 100 maka berapakah nilai fungsi keanggotaan yang terletak di domain 40 dan 70 ?
jawab :
Dik
a = 20
b = 100
maka :
nilai U(40):
U(40) = 2((40 - 20) / (100 - 20))^2
U(40) = 2(20/80)^2
U(40) = 2(1/4)^2
U(40) = 2(1/16)
U(40) = 1/8 = 0,125
nilai U(70):
U(70) = 1-2((100-70)/(100 - 20))^2
U(70) = 1-2(30/80)^2
U(70) = 1 - 2(9/64)
U(70) = 1 - (9/32)
U(70) = 0,71
jadi hasil fungsi keanggotaan nya iyalah U(40) = 0,125 dan U(70) = 0,71
Penerapan logika fuzzy di pemograman python
Pada bagian ini kita akan disugukan dengan sebuah soal yang menggunakan aturan fuzzy dengan penerapan soal yang kita lakukan sebagai berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | """ Sebuah Perusahaan dperakit CPU mempunyai data-data sebagai berikut: a. permintaan terbesar mencapai 1000 unit dan terkecil 200 unit perhari b. Persediaan digudang terbanyak 120 unit dan terkecil 20 unit perhari c. Produksi maksimum 1400 unit dan minimum 400 unit perhari Berapa CPU harus di rakit bila jumlah permintaan 800 unit dan persediaan gudang ada 60 unit, bila proses tersebut di tentukan dengan aturan fuzziy -> if permintaan (Turun) and persediaan(banyak): then produksi (berkurang) -> if permintaan (naik) and persediaan(sedikit): then produksi (bertambah) -> if permintaan (naik) and persediaan(banyak): then produksi (bertambah) -> if permintaan (Turun) and persediaan(sedikit): then produksi (berkurang) """ |
pada gambar di atas merupakan tampilan soal fuzzy dalam memulai menjawabnya pertama kita akan membuat terlebih dahulu fungsi mettod dan atribut yang akan kita pakai yang terdiri dari
1 2 | import skfuzzy as fuzzy import matplotlib.pyplot as plt |
a. skfuzzy
Merupakan libreli khusus untuk melakukan logika fuzzy dengan menggambarkan grafik dan penetapan fungsi keanggotaan .
b. Matploplib
Merupakan libreli khusus untuk melakukan skema grafik yang akan digunakan pada logika fuzzy ini untuk mengambil nilai fungsi keanggotaan sesuai rumus yang kita tentukan.
Selanjutnya kita akan membuat suatu fungsi untuk menggambarkan logika fuzzy nya terlihat dari soal kita mencari grafik permintaan dengan pencapaian terbesar 1000 unit dan terkecil 200 maka gambaran grafiknya berbentuk sigmoid.
sourc code nya :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | def fungsiPermintaan(rang, tetapan, judul, label1, label2): a = fuzzy.pimf(rang, tetapan[0][0], tetapan[0][1], tetapan[0][2], tetapan[0][3]) b = fuzzy.pimf(rang, tetapan[1][0], tetapan[1][1], tetapan[1][2], tetapan[1][3]) fig, pt = plt.subplots(nrows=1, figsize=(6, 3)) pt.plot(rang, a, 'g', linewidth=1.5, label=label1) pt.plot(rang, b, 'r', linewidth=1.5, label=label2) pt.set_title(judul) pt.legend() pt.spines['top'].set_visible(False) pt.spines['right'].set_visible(False) pt.get_xaxis().tick_bottom() pt.get_yaxis().tick_left() plt.axis([0, 1001, 0, 1]) plt.tight_layout() plt.grid() plt.show() return a, b def keanggotaan_permintaan(rang, turun, naik, nilai): _turun = fuzzy.interp_membership(rang, turun, nilai) _naik = fuzzy.interp_membership(rang, naik, nilai) return _turun, _naik |
pada kode di atas sana merupakan aturan untuk menggambarkan diagram sigmoid fuzzy pada fungsi permintaan dan pada fungsi di bawahnya merupakan fungsi keanggotaan_permintaan yang berguna untuk mencari nilai yang ada di dalam domain yang akan di tujukan.
Selanjutnya membuat fungsi persediaan dengan menggunakan grafik trapesium untuk mengambil nilai pada domain yang sudah di tentukan dalam soal persediaannya dengan persediaan maksimum 120 unit, dan persediaan minimumnya 20 maka sourc code nya :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def fungsipersediaan(reng, tepatan, titel, label1, label2): a = fuzzy.trapmf(reng, tepatan[0]) b = fuzzy.trapmf(reng, tepatan[1]) fig, pt = plt.subplots(nrows=1, figsize=(6, 3)) pt.plot(reng, a, 'g', linewidth=1.5, label=label1) pt.plot(reng, b, 'r', linewidth=1.5, label=label2) pt.set_title(titel) pt.legend() pt.spines['top'].set_visible(False) pt.spines['right'].set_visible(False) pt.get_xaxis().tick_bottom() pt.get_yaxis().tick_left() plt.tight_layout() plt.axis([1, 120, 0, 1]) plt.grid() plt.show() return a, b def keanggotaan_persediaan(rang, kecil, banyak, nilai): a = fuzzy.interp_membership(rang, kecil, nilai) b = fuzzy.interp_membership(rang, banyak, nilai) return a, b |
pada sourc code di atas merupakan fungsi dari persediaan dengan memanfaatkan grafik trapesium untuk mengambil perhitungannya, yang mana bentuk penulisannya sama dengan code permintaan.
Selanjutnya membuat fungsi produksi dengan menggunakan grafik trapesium juga untuk mengetahui nilai fungsi keanggotaannya maka kita buat fungsi dengan sourc code nya :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import skfuzzy as fuzzy import matplotlib.pyplot as plt def fungsiperoduksi(reng, tepatan, titel, label1, label2): a = fuzzy.trapmf(reng, tepatan[0]) b = fuzzy.trapmf(reng, tepatan[1]) fig, pt = plt.subplots(nrows=1, figsize=(6, 3)) pt.plot(reng, a, 'g', linewidth=1.5, label=label1) pt.plot(reng, b, 'r', linewidth=1.5, label=label2) pt.set_title(titel) pt.legend() pt.spines['top'].set_visible(False) pt.spines['right'].set_visible(False) pt.get_xaxis().tick_bottom() pt.get_yaxis().tick_left() plt.tight_layout() plt.axis([1, 1600, 0, 1]) plt.grid() plt.show() return a, b |
Maka semua fungsi pun sudah di bentuk kemudian kita akan membuat method mainnya untuk mengeksekusi seluruh fungsi tersebut untuk menganalisa soal yang ada di atas dengan sourc code nya:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | import numpy as np from fuzzy.fuzzyPermintaan import fungsiPermintaan, keanggotaan_permintaan from fuzzy.persediaan import fungsipersediaan, keanggotaan_persediaan from fuzzy.fuzzyProduksi import fungsiperoduksi import os os.system('cls') def range_x(a, b, c): lintasan = np.arange(a, b, c) return lintasan rang_permintaan = range_x(0, 1501, 1) rang_rule_permintaan = np.array([ [0, 1, 200, 1000], [200, 1000, 1401, 1501] ]) turun, naik = fungsiPermintaan( rang_permintaan, rang_rule_permintaan, "Fungsi Permintaan", "Turun", "Naik" ) v_turun, v_naik = keanggotaan_permintaan( rang_permintaan, turun, naik, 800 ) rang_persediaan = range_x(0, 125, 1) rang_rule_persediaan = np.array( [ [0, 1, 20, 100], [20, 100, 120, 124] ] ) kecil, banyak = fungsipersediaan( rang_persediaan, rang_rule_persediaan, 'Tabel Persediaan', 'kecil', 'banyak' ) v_kecil, v_banyak = keanggotaan_persediaan( rang_persediaan, kecil, banyak, 60 ) rang_produksi = range_x(0, 1700, 1) rang_rule_produksi = np.array([ [0, 1, 200, 1200], [400, 1400, 1600, 1669] ]) berkurang, bertambah = fungsiperoduksi( rang_produksi, rang_rule_produksi, 'fungsi produksi', 'berkurang', 'bertambah' ) # pengoprasian fungsi # rumus yang digunakan """ (berkurang) => (1200-x)/(1000) v_turun => (1200-z)/(1000) (v_turun * 1000) => 1200 - z (v_turun * 1000) - 1200 => -z z => 1200 - (v_turun * 1000) ****** (bertambah) => (z - 400)/(1400-400) v_turun*1000 => z-400 z => (v_turun * 1000) + 400 """ nilai1 = min(v_turun, v_banyak) z1 = 1200-(nilai1*1000) # berkurang nilai2 = min(v_naik, v_kecil) # if v_naik and v_kecil: z2 = (nilai2*1000)+400 # bertambah nilai3 = min(v_naik, v_banyak) # if v_naik and v_banyak: z3 = (nilai3*1000)+400 # bertambah nilai4 = min(v_turun, v_kecil) # if v_turun and v_kecil: z4 = 1200-(nilai4*1000) # berkurang hasil_akhir = ((nilai1*z1)+(nilai2*z2)+(nilai3*z3) + (nilai4*z4))/(nilai1+nilai2+nilai3+nilai4) print(v_turun) print(v_naik) print('===========') print(v_kecil) print(v_banyak) print("===========") print('{},{},{},{}'.format(z1, z2, z3, z4)) print("Maka CPU yang harus di rakit iyalah \n: {}".format( int(hasil_akhir))) |
Maka hasil output yang di dapatkan sesuai pogram diatas iyalah :
output 2:
output 4:
Sekian dari saya tentang penyampaian logika fuzzy untuk menyelesaikan permasalahan study kasus pada soal yang telah saya jawab semoga bermanfaat