1. INSTALASI SOFWARE
Sistem yang digunakan ialah Python 2.7 dan paket yang dibutuhkan yaitu:
1. numpy
2. scipy
3. matplotlib
4. skfuzzy
Masukkan perintah berikut di baris perintah untuk menginstal perangkat lunak numpy,
scipy, dan matplotlib.
sudo apt-get update
sudo apt-get install python-numpy
Catatan : numpy mungkin sudah diinstal, jadi semua yang Kita lihat ketika perintah
ini dijalankan adalah bahwa versi terbaru diinstal.
Rules
TABEL ALGORITMA FL
Langkah Nama Deskripsi
1 Inisialisasi Definisikan variabel dan istilah linguistic
2 Inisialisasi Membuat fungsi keanggotaan
3 Inisialisasi Membuat set aturan
Ubah data input menjadi set fuzzy menggunakan fungsi
4 Fuzzifikasi
keanggotaan
Mengevaluasi set fuzzy sesuai dengan aturan yang
5 Kesimpulan
ditetapkan
6 Pengumpulan Gabungkan hasil dari setiap evaluasi aturan
7 Defuzzifikasi Konversi fuzzy set ke nilai output yang memiliki nilai
Jumlah tip juga tunduk pada istilah linguistik fuzzy. Ini adalah istilah yang digunakan
untuk jumlah tip:
Rendah
Sedang
Tinggi
Harus ada skala numerik bagi pengguna untuk menilai kualitas layanan dan kualitas
makanan. Skala 0 hingga 10 baik untuk kebanyakan orang, di mana 0 adalah yang
terburuk dan 10 adalah yang terbaik. Output tip juga harus memiliki skala numerik.
Ini diatur pada 0 hingga 26 untuk mewakili skala yang sesuai untuk persentase tip
normal. Semua skala numerik ini mewakili input atau output renyah atau tidak fuzzy
untuk fungsi keanggotaan, yang akan dibahas pada bagian berikutnya.
4. Inisialisasi : Membuat Fungsi Keanggotaan
Fungsi keanggotaan digunakan dalam langkah fuzzifikasi FL dan defuzzifikasi.
Fungsi-fungsi ini memetakan nilai input non-fuzzy ke variabel linguistik fuzzy untuk
fuzzifikasi, dan memetakan variabel fuzzy ke nilai output non-fuzzy untuk
defuzzifikasi. Pada dasarnya, fungsi keanggotaan mengkuantifikasi istilah linguistik.
Catatan : bahwa daftar segmen kode ini memerlukan inisialisasi tambahan sebelum
dapat dijalankan. bahwa kode tambahan ditampilkan dalam daftar segmen kode
berikutnya.
Untuk menguji algoritme, mari kita asumsikan bahwa kualitas makanan dihargai 6,5
dan layanan 9,8. Segmen kode berikut menghitung enam derajat keanggotaan untuk
setiap variabel input dan fungsi keanggotaan:
qual_level_lo = fuzz.interp_membership(x_qual, qual_lo, 6.5)
qual_level_md = fuzz.interp_membership(x_qual, qual_md, 6.5)
qual_level_hi = fuzz.interp_membership(x_qual, qual_hi, 6.5)
serv_level_lo = fuzz.interp_membership(x_serv, serv_lo, 9.8)
serv_level_md = fuzz.interp_membership(x_serv, serv_md, 9.8)
serv_level_hi = fuzz.interp_membership(x_serv, serv_hi, 9.8)
Operasi atau diterapkan untuk aturan 3, seperti halnya untuk aturan 1. Tetapi dalam
kasus ini, ada persimpangan pasti dengan fungsi keanggotaan yang hebat dan
menakjubkan. Gambar 5. menunjukkan fungsi keanggotaan makanan dan layanan
setelah flattop tetapi sebelum digabungkan.
Gambar 6. Gabungan fungsi keanggotaan sangat enak, luar biasa, dan tinggi
Segmen kode berikut menerapkan aturan dan menggabungkan fungsi keanggotaan.
Apply rule 1
# The 'or' operator means to take the maximum by using the
'np.max' function
active_rule1 = np.fmax(qual_level_lo, serv_level_lo)
# Next, flattop the corresponding output
# Combine with low tip membership function using `np.fmin`
tip_activation_lo = np.fmin(active_rule1, tip_lo) # Removed
entirely to 0
# Rule 2 connects acceptable service to medium tipping
# No flat topping needed as there is only one input membership
function
# However, the tip membership must be combined using an 'and'
or 'np.fmin' function
tip_activation_md = np.fmin(serv_level_md, tip_md)
# Rule 3 connects amazing service or great food with high
tipping
active_rule3 = np.fmax(qual_level_hi, serv_level_hi)
tip_activation_hi = np.fmin(active_rule3, tip_hi)
Pada titik ini, semua aturan telah diterapkan pada fungsi keanggotaan keluaran. Sekarang
tinggal menggabungkan semuanya. Dalam terminologi FL, ini dikenal sebagai agregasi, yang
merupakan langkah 6 dalam algoritma FLS.
Bagian ini melengkapi proyek logika tip fuzzy. Yang tersisa untuk dilakukan adalah
memuat dan menjalankan kode berikut, yang dinamai tipping.py. Masukkan yang
berikut ini untuk menjalankan program:
sudo python tipping.py
Kita harus menutup setiap plot setelah tampaknya melanjutkan ke plo berikutnya.
tipping.py listing
import numpy as np
import skfuzzy as fuzz
import matplotlib.pyplot as plt
# Generate universe variables
# * Quality and service on subjective ranges [0, 10]
# * Tip has a range of [0, 25] in units of percentage points
x_qual = np.arange(0, 11, 1)
x_serv = np.arange(0, 11, 1)
x_tip = np.arange(0, 26, 1)
# Generate fuzzy membership functions
qual_lo = fuzz.trimf(x_qual, [0, 0, 5])
qual_md = fuzz.trimf(x_qual, [0, 5, 10])
qual_hi = fuzz.trimf(x_qual, [5, 10, 10])
serv_lo = fuzz.trimf(x_serv, [0, 0, 5])
serv_md = fuzz.trimf(x_serv, [0, 5, 10])
serv_hi = fuzz.trimf(x_serv, [5, 10, 10])
tip_lo = fuzz.trimf(x_tip, [0, 0, 13])
tip_md = fuzz.trimf(x_tip, [0, 13, 25])
tip_hi = fuzz.trimf(x_tip, [13, 25, 25])
# Visualize these universes and membership functions
fig, (ax0, ax1, ax2) = plt.subplots(nrows=3, figsize=(8, 9))
ax0.plot(x_qual, qual_lo, 'b', linewidth=1.5, label='Bad')
ax0.plot(x_qual, qual_md, 'g', linewidth=1.5, label='Decent')
ax0.plot(x_qual, qual_hi, 'r', linewidth=1.5, label='Great')
ax0.set_title('Food quality')
ax0.legend()
ax1.plot(x_serv, serv_lo, 'b', linewidth=1.5, label='Poor')
ax1.plot(x_serv, serv_md, 'g', linewidth=1.5,
label='Acceptable')
ax1.plot(x_serv, serv_hi, 'r', linewidth=1.5, label='Amazing')
ax1.set_title('Service quality')
ax1.legend()
ax2.plot(x_tip, tip_lo, 'b', linewidth=1.5, label='Low')
ax2.plot(x_tip, tip_md, 'g', linewidth=1.5, label='Medium')
ax2.plot(x_tip, tip_hi, 'r', linewidth=1.5, label='High')
ax2.set_title('Tip amount')
ax2.legend()
# Turn off top/right axes
for ax in (ax0, ax1, ax2):
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()
plt.tight_layout()
plt.show()
# Calculate degrees of membership
# The exact values 6.5 and 9.8 do not exist on our universes
# Use fuzz.interp_membership to determine values
qual_level_lo = fuzz.interp_membership(x_qual, qual_lo, 6.5)
qual_level_md = fuzz.interp_membership(x_qual, qual_md, 6.5)
qual_level_hi = fuzz.interp_membership(x_qual, qual_hi, 6.5)
serv_level_lo = fuzz.interp_membership(x_serv, serv_lo, 9.8)
serv_level_md = fuzz.interp_membership(x_serv, serv_md, 9.8)
serv_level_hi = fuzz.interp_membership(x_serv, serv_hi, 9.8)
# Apply the rules, Rule 1 concerns bad food OR service.
# The OR operator means we take the maximum of these two.
active_rule1 = np.fmax(qual_level_lo, serv_level_lo)
# Now we apply this by clipping the top off the corresponding output
# membership function with `np.fmin`
tip_activation_lo = np.fmin(active_rule1, tip_lo) # removed
entirely to 0
# Rule 2 is a straight if ... then construction
# if acceptable service then medium tipping. This is an AND operator
# We take the minimum for an AND operator
tip_activation_md = np.fmin(serv_level_md, tip_md)
# For rule 3 we connect high service OR high food with high tipping
active_rule3 = np.fmax(qual_level_hi, serv_level_hi)
tip_activation_hi = np.fmin(active_rule3, tip_hi)
tip0 = np.zeros_like(x_tip)
# Visualize these rule applications
fig, ax0 = plt.subplots(figsize=(8, 3))
ax0.fill_between(x_tip, tip0, tip_activation_lo, facecolor='b',
alpha=0.7)
ax0.plot(x_tip, tip_lo, 'b', linewidth=0.5, linestyle='--', )
ax0.fill_between(x_tip, tip0, tip_activation_md, facecolor='g',
alpha=0.7)
ax0.plot(x_tip, tip_md, 'g', linewidth=0.5, linestyle='--')
ax0.fill_between(x_tip, tip0, tip_activation_hi, facecolor='r',
alpha=0.7)
ax0.plot(x_tip, tip_hi, 'r', linewidth=0.5, linestyle='--')
ax0.set_title('Output membership activity')
# Turn off top/right axes
for ax in (ax0,):
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()
plt.tight_layout()
plt.show()
# Aggregate all three output membership functions together
# This aggregation uses OR operators, hence the maximum is found
aggregated = np.fmax(tip_activation_lo, np.fmax(tip_activation_
md, tip_activation_hi))
# Calculate defuzzified result using the method of centroids
tip = fuzz.defuzz(x_tip, aggregated, 'centroid')
# display the tip percentage on the console
print tip
# Value needed for the next plot
tip_activation = fuzz.interp_membership(x_tip, aggregated, tip)
# Visualize the final results
fig, ax0 = plt.subplots(figsize=(8, 3))
ax0.plot(x_tip, tip_lo, 'b', linewidth=0.5, linestyle='--', )
ax0.plot(x_tip, tip_md, 'g', linewidth=0.5, linestyle='--')
ax0.plot(x_tip, tip_hi, 'r', linewidth=0.5, linestyle='--')
ax0.fill_between(x_tip, tip0, aggregated, facecolor='Orange',
alpha=0.7)
ax0.plot([tip, tip], [0, tip_activation], 'k', linewidth=1.5,
alpha=0.9)
ax0.set_title('Aggregated membership and result (line)')
# Turn off top/right axes
for ax in (ax0,):
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()
plt.tight_layout()
plt.show()
Gambar 7. adalah tampilan pertama yang ditunjukkan pada monitor. Ini menunjukkan
ketiga fungsi keanggotaan: kualitas makanan, kualitas layanan, dan jumlah tip.
Gambar 7. Tiga fungsi keanggotaan
Gambar 9. menunjukkan tampilan berikutnya: hasil agregasi pos untuk semua fungsi
keanggotaan yang diproses. Selain itu, ada garis yang menunjukkan output crisp untuk
persentase tip yang dihasilkan dari proses defuzzifikasi.
Gambar 9. Posting Hasil Agregasi Dan Defuzzifikasi
Gambar 10. menunjukkan tampilan teks untuk persentase tip, yang berasal dari
pernyataan dalam program.
Pada bagian ini, saya membahas modifikasi pada program Python untuk membuatnya
lebih mudah digunakan dan secara signifikan lebih portabel. Modifikasi utama adalah
untuk menanyakan pengguna tentang kualitas makanan dan layanan, daripada
memiliki nilai statis, yang merupakan kasus untuk proyek awal. Modifikasi ini cukup
mudah dan terdiri dari menciptakan dua variabel untuk menahan tingkat kualitas
makanan dan layanan, dan dua pernyataan masukan untuk memasukkan data ke dalam
program. Kode tambahan atau yang dimodifikasi adalah sebagai berikut:
food_qual = raw_input('Rate the food quality, 0 to 10')
service_qual = raw_input('Rate the service quality, 0 to 10')
qual_level_lo = fuzz.interp_membership(x_qual, qual_lo,
float(food_qual))
qual_level_md = fuzz.interp_membership(x_qual, qual_md,
float(food_qual))
qual_level_hi = fuzz.interp_membership(x_qual, qual_hi,
float(food_qual))
serv_level_lo = fuzz.interp_membership(x_serv, serv_lo,
float(service_qual))
serv_level_md = fuzz.interp_membership(x_serv, serv_md,
float(service_qual))
serv_level_hi = fuzz.interp_membership(x_serv, serv_hi,
float(service_qual))
Heat/cool
Command
Target room No change
temperature FLS Heat Pump Room
Room Temperature
Mari tentukan suhu (t) sebagai variabel input yang asli untuk mewakili suhu ruangan
yang sedang dipanaskan atau didinginkan. Umumnya, orang menggunakan istilah
panas dan dingin sebagai kualifikasi suhu kamar. Istilah-istilah ini, serta yang terkait,
dapat dikembangkan menjadi seperangkat istilah linguistik.
Ekspresi ini untuk T (t) mewakili fungsi dekomposisi untuk variabel input t. Setiap
anggota set dekomposisi linguistik ini mewakili atau dikaitkan dengan kisaran suhu
numerik. Misalnya, dingin bisa berkisar antara 40 ° F hingga 60 ° F, sedangkan panas
mungkin berkisar 70 ° F hingga 90 ° F. Istilah linguistik lain dapat dengan mudah
mengisi rentang intervensi jika diputuskan bahwa 20 ° F adalah nilai interval yang
sesuai.
Gambar 12. Fungsi keanggotaan suhu kamar dan target
Dalam hal ini, suhu kamar apa pun dapat dimiliki oleh satu atau dua kelompok,
tergantung pada nilainya. Gambar 13. menunjukkan bahwa suhu ruangan 65 ° F
memiliki nilai keanggotaan 0,5 dalam fungsi keanggotaan yang nyaman, serta 0,5
dalam fungsi keanggotaan dingin. Suhu kamar tepatnya 70 ° F memiliki nilai
keanggotaan 1,0 dan hanya dalam fungsi keanggotaan yang nyaman.
Berikut ini adalah beberapa contoh aturan untuk menentukan perintah kontrol
berdasarkan suhu ruangan dan target.
jika (suhu kamar dingin) dan (suhu target nyaman), maka perintahnya adalah
panas.
jika (suhu kamar panas) dan (suhu target nyaman), maka perintahnya dingin.
jika (suhu kamar nyaman) dan (suhu target nyaman), maka perintahnya tidak
berubah
Ada enam aturan yang diperlukan untuk mengakomodasi semua kombinasi suhu ruang
berpotongan dan istilah linguistik suhu target yang memerlukan tindakan. Aturan
untuk tidak ada perubahan diabaikan. Ini aturannya.
jika suhu kamar dingin dan suhu target nyaman, maka suhu perintah adalah
panas.
jika suhu kamar dingin dan suhu target panas, maka perintahnya adalah panas
jika suhu kamar nyaman dan suhu target dingin, maka perintahnya dingin.
jika suhu kamar nyaman dan suhu target adalah panas, maka perintahnya adalah
panas
jika suhu kamar panas dan suhu target dingin, maka perintahnya dingin
jika suhu kamar panas dan suhu target nyaman, maka perintahnya dingin
10. Fuzzifikasi
Segmen kode berikut ini mengatur rentang variabel input dan fungsi keanggotaan.
import numpy as np
import skfuzzy as fuzz
# Generate universe variables
# * room and target temperature range is 50 to 90
# * same for the output control variable
x_room_temp = np.arange(50, 91, 1)
x_target_temp = np.arange(50, 91, 1)
x_control_temp = np.arange(50, 91, 1)
# Generate fuzzy membership functions
room_temp_lo = fuzz.trimf(x_qual, [50, 50, 70])
room_temp_md = fuzz.trimf(x_qual, [50, 70, 90])
room_temp_hi = fuzz.trimf(x_qual, [70, 90, 90])
target_temp_lo = fuzz.trimf(x_serv, [50, 50, 70])
target_temp_md = fuzz.trimf(x_serv, [50, 70, 90])
target_temp_hi = fuzz.trimf(x_serv, [50, 90, 90])
control_temp_lo = fuzz.trimf(x_tip, [50, 50, 70])
control_temp_md = fuzz.trimf(x_tip, [50, 70, 90])
control_temp_hi = fuzz.trimf(x_tip, [70, 90, 90])
Sekarang ke langkah inferensi di mana semua aturan diterapkan dan fungsi keanggotaan
digabungkan.
11. Kesimpulan
Segmen kode berikut menerapkan enam aturan dan menggabungkan semua fungsi
keanggotaan:
# Apply rule 1: if room_temp is cold and target temp is
comfortable then command is heat
# The 'and' operator means to take the minimum by using the
'np.fmin' function
active_rule1 = np.fmin(room_temp_level_lo, target_temp_level_md)
# Combine with hi control membership function using `np.fmin`
control_activation_1 = np.fmin(active_rule1, control_temp_hi)
# Next go through all five remaining rules
#Apply rule 2: if room_temp is cold and target temp is hot then
command is heat
active_rule2 = np.fmin(room_temp_level_lo, target_temp_level_hi)
# Combine with hi control membership function using `np.fmin`
control_activation_2 = np.fmin(active_rule2, control_temp_hi)
#Apply rule 3: if room_temp is comfortable and target temp is
cold then command is cool
active_rule3 = np.fmin(room_temp_level_md, target_temp_level_lo)
# Combine with lo control membership function using `np.fmin`
control_activation_3 = np.fmin(active_rule3, control_temp_lo)
#Apply rule 4: if room_temp is comfortable and target temp is
heat then command is heat
active_rule4 = np.fmin(room_temp_level_md, target_temp_level_hi)
# Combine with hi control membership function using `np.fmin`
control_activation_4 = np.fmin(active_rule4, control_temp_hi)
#Apply rule 5: if room_temp is hot and target temp is cold then
command is cool
active_rule5 = np.fmin(room_temp_level_hi, target_temp_level_lo)
# Combine with lo control membership function using `np.fmin`
control_activation_5 = np.fmin(active_rule5, control_temp_lo)
#Apply rule 6: if room_temp is hot and target temp is
comfortable then command is cool
active_rule6 = np.fmin(room_temp_level_hi, target_temp_level_md)
# Combine with lo control membership function using `np.fmin`
control_activation_6 = np.fmin(active_rule6, control_temp_lo)
12. Pengumpulan
Pernyataan agregasi panjang karena enam nilai aktivasi kontrol.
13. Defuzzifikasi
Metode centroid akan diterapkan untuk proyek ini seperti yang dilakukan untuk
proyek sebelumnya.
print control_value