Algoritma FIS (Fuzzy Inference System): Tipe Mamdani 4


Algoritma FIS (Fuzzy Inference System) adalah salah satu algoritma yang digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan nilai kinerja karyawan berdasarkan inputan yang ada.
Algoritma ini memiliki beberapa tipe teknik perhitungan yang digunakan, dan salah satu tipe yang digunakan adalah tipe yang ditemukan oleh E.H. Mamdani, oleh karena itu tipe ini dinamakan tipe Mamdani / Fuzzy Mamdani. Karena skrip program yang terlalu kompleks, maka pada kali ini penjelasan hanya akan ditujukan pada bagian inti saja. Tetapi skrip program sudah disertakan di bagian bawah halaman ini agar pembaca dapat mencoba sendiri contoh program untuk kasus ini.



Diasumsikan ada 10 data karyawan yang diketahui datanya, yaitu karyawan A, B, C, D, E, F, G, H, I, J
Masing-masing karyawan memiliki 3 nilai berdasarkan masing-masing kriteria yang ada
Maka tentukan nilai skor akhir dari masing-masing karyawan tersebut
Diasumsikan 10 data tersebut adalah sebagai berikut:

KaryawanJam kerjaJumlah barangJumlah Gagal
Karyawan A45805
Karyawan B50927
Karyawan C43753
Karyawan D37724
Karyawan E39731
Karyawan F48812
Karyawan G35635
Karyawan H42713
Karyawan I40760
Karyawan J43792



Langkah pertama adalah memasukkan data-data yang digunakan.
Contoh data awal adalah sebagai berikut:

Dim data(9)() As Double
data(0) = New Double() {45, 80, 5}
data(1) = New Double() {50, 92, 7}
data(2) = New Double() {43, 75, 3}
data(3) = New Double() {37, 72, 4}
data(4) = New Double() {39, 73, 1}
data(5) = New Double() {48, 81, 2}
data(6) = New Double() {35, 63, 5}
data(7) = New Double() {42, 71, 3}
data(8) = New Double() {40, 76, 0}
data(9) = New Double() {43, 79, 2}

Langkah-langkah penggunaan algoritma ini adalah

* ‘Buat Struktur FIS Mamdani

1. Buat variabel input menurut masing-masing kriteria yang ada
Ada 3 Kriteria yang digunakan, yaitu Jam Kerja, Jumlah Barang, dan Jumlah Barang Gagal
Kemudian Buat fungsi keanggotaan pada masing-masing kriteria

1a. Pada kriteria jam kerja, nilai minimal adalah 35 jam, dan nilai maksimal adalah 50 jam
himpunan fuzzy akan dibagi menjadi 3, yaitu sedikit, sedang, banyak

Dim fvJamKerja As New FuzzyVariable("JamKerja", 35.0, 50.0)
fvJamKerja.Terms.Add(New FuzzyTerm("jk_sedikit", New TriangularMembershipFunction(32.0, 35.0, 38.0)))
fvJamKerja.Terms.Add(New FuzzyTerm("jk_sedang", New TriangularMembershipFunction(36.0, 40.0, 44.0)))
fvJamKerja.Terms.Add(New FuzzyTerm("jk_banyak", New TriangularMembershipFunction(42.0, 48.0, 54.0)))
fisSkor.Input.Add(fvJamKerja)

1b. Pada kriteria jumlah barang, nilai minimal adalah 0 buah, dan nilai maksimal adalah 100 buah
himpunan fuzzy akan dibagi menjadi 4, yaitu sedikit, sedang, banyak, dan sangat banyak

Dim fvJumlahBarang As New FuzzyVariable("JumlahBarang", 0.0, 100.0)
fvJumlahBarang.Terms.Add(New FuzzyTerm("jb_sedikit", New TriangularMembershipFunction(-10.0, 20.0, 40.0)))
fvJumlahBarang.Terms.Add(New FuzzyTerm("jb_sedang", New TriangularMembershipFunction(15.0, 35.0, 55.0)))
fvJumlahBarang.Terms.Add(New FuzzyTerm("jb_banyak", New TriangularMembershipFunction(40.0, 60.0, 80.0)))
fvJumlahBarang.Terms.Add(New FuzzyTerm("jb_sangat_banyak", New TriangularMembershipFunction(65.0, 85.0, 105.0)))
fisSkor.Input.Add(fvJumlahBarang)

1c. Pada kriteria jumlah barang gagal, nilai minimal adalah 0 buah, dan nilai maksimal adalah 10 buah
himpunan fuzzy akan dibagi menjadi 2, yaitu sedikit dan banyak

Dim fvGagal As New FuzzyVariable("Gagal", 0.0, 10.0)
fvGagal.Terms.Add(New FuzzyTerm("bg_sedikit", New TrapezoidMembershipFunction(-0.5, -0.5, 2.5, 5.5)))
fvGagal.Terms.Add(New FuzzyTerm("bg_banyak", New TrapezoidMembershipFunction(4.5, 6.5, 8.5, 10.5)))
fisSkor.Input.Add(fvGagal)

2. Buat variabel output untuk sistem ini
Kriteria hasil adalah nilai skor pada masing-masing data

2a. Nilai skor yang dihasilkan akan memiliki rentang nilai antara 0 sampai dengan 100
himpunan fuzzy akan dibagi menjadi 3, yaitu rendah, sedang, dan tinggi

Dim fvSkor As New FuzzyVariable("Skor", 0.0, 100.0)
fvSkor.Terms.Add(New FuzzyTerm("rendah", New TriangularMembershipFunction(0.0, 20.0, 40.0)))
fvSkor.Terms.Add(New FuzzyTerm("sedang", New TriangularMembershipFunction(25.0, 50.0, 75.0)))
fvSkor.Terms.Add(New FuzzyTerm("tinggi", New TriangularMembershipFunction(60.0, 80.0, 100.0)))
fisSkor.Output.Add(fvSkor)

3. Buat aturan fuzzy yang dibutuhkan
Dalam kasus ini akan dibuat 3 aturan fuzzy, sesuai dengan jumlah nilai kriteria dari variabel output yaitu skor
Aturan yang dibuat adalah:
IF JamKerja sedikit OR JumlahBarang sedikit OR Gagal banyak THEN Skor rendah
IF JamKerja sedang OR JumlahBarang sedang OR JumlahBarang banyak THEN Skor sedang
IF JamKerja banyak OR JumlahBarang sangat_banyak OR Gagal sedikit THEN Skor tinggi

Dim aturan1 As MamdaniFuzzyRule = fisSkor.ParseRule("if (JamKerja is jk_sedikit) or (JumlahBarang is jb_sedikit) or (Gagal is bg_banyak) then Skor is rendah")
Dim aturan2 As MamdaniFuzzyRule = fisSkor.ParseRule("if (JamKerja is jk_sedang) or (JumlahBarang is jb_sedang) or (JumlahBarang is jb_banyak) then Skor is sedang")
Dim aturan3 As MamdaniFuzzyRule = fisSkor.ParseRule("if (JamKerja is jk_banyak) or (JumlahBarang is jb_sangat_banyak) or (Gagal is bg_sedikit) then (Skor is tinggi)")

3a. Hitung nilai fungsi pada gambar awal
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

fcm.nilaiFungsi = fcm.hitungNilaiFungsi()

* Lakukan perhitungan pada semua data (nomor 4 dan 5)

4. Masukkan data input ke dalam masing-masing kritera

Dim dataAwal As New Dictionary(Of FuzzyVariable, Double)()
dataAwal.Add(fvJamKerja, data(i)(0))
dataAwal.Add(fvJumlahBarang, data(i)(1))
dataAwal.Add(fvGagal, data(i)(2))

5. Hitung skor akhir menggunakan metode fuzzy
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim hasil As Dictionary(Of FuzzyVariable, Double) = _fisSkor.HitungFuzzy(dataAwal)

* Fungsi HitungFuzzy adalah inti perhitungan pada algoritma ini. Terdapat 5 langkah penting yang harus dilakukan untuk mendapatkan skor akhir, yaitu:

5a. Lakukan proses Fuzzy-fikasi pada masing-masing inputan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim fuzzifiedInput As Dictionary(Of FuzzyVariable, Dictionary(Of FuzzyTerm, Double)) = Fuzzify(dataAwal)

* Gunakan fungsi ini untuk melakukan Fuzzy-fikasi pada masing-masing input
Pertama-tama lakukan validasi data input yang ada, kemudian masukkan masukkan data tersebut ke dalam diagram fuzzy
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function Fuzzify(dataAwal As Dictionary(Of FuzzyVariable, Double)) As Dictionary(Of FuzzyVariable, Dictionary(Of FuzzyTerm, Double))
	'5a1. Lakukan validasi input
	'Apabila terdapat data yang tidak valid maka tampilkan pesan kesalahan
	Dim msg As String = Nothing
	If Not ValidasiDataAwal(dataAwal, msg) Then Throw New ArgumentException(msg)

	'5a2. Masukkan masing-masing kriteria ke dalam diagram fuzzy dengan batasan himpunan fuzzy yang telah ditentukan sebelumnya
	Dim hasil As New Dictionary(Of FuzzyVariable, Dictionary(Of FuzzyTerm, Double))()
	For Each fv As FuzzyVariable In Input
		Dim hasilFv As New Dictionary(Of FuzzyTerm, Double)()
		For Each term As FuzzyTerm In fv.Terms
			hasilFv.Add(term, term.MembershipFunction.GetValue(dataAwal(fv)))
		Next
		hasil.Add(fv, hasilFv)
	Next

	Return hasil
End Function

5b. Lakukan evaluasi pada masing-masing kondisi dalam input tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim evaluatedConditions As Dictionary(Of MamdaniFuzzyRule, Double) = EvaluasiDaftarKondisi(fuzzifiedInput)

* Gunakan fungsi ini untuk mengevaluasi kondisi pada masing-masing diagram fuzzy
parameter yang digunakan adalah
fuzzifiedInput = data awal dalam bentuk fuzzy
Nilai Pengembalian fungsi adalah hasil evaluasi
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function EvaluasiDaftarKondisi(fuzzifiedInput As Dictionary(Of FuzzyVariable, Dictionary(Of FuzzyTerm, Double))) As Dictionary(Of MamdaniFuzzyRule, Double)
	Dim hasil As New Dictionary(Of MamdaniFuzzyRule, Double)()
	For Each aturan As MamdaniFuzzyRule In Rules
		hasil.Add(aturan, EvaluasiKondisi(aturan.Condition, fuzzifiedInput))
	Next

	Return hasil
End Function

* Gunakan fungsi ini untuk mengevaluasi kondisi fuzzy pada masing-masing diagram fuzzy
parameter yang digunakan adalah
condition = Kondisi yang harus dievaluasi
fuzzifiedInput = Input data setelah mengalami fuzzy-fikasi
Nilai Pengembalian fungsi adalah kondisi fuzzy yang sudah terevaluasi
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Protected Function EvaluasiKondisi(condition As ICondition, fuzzifiedInput As Dictionary(Of FuzzyVariable, Dictionary(Of FuzzyTerm, Double))) As Double
	If TypeOf condition Is Conditions Then
		Dim hasil As Double = 0.0
		Dim daftarKondisi As Conditions = DirectCast(condition, Conditions)

		If daftarKondisi.ConditionsList.Count = 0 Then
			Throw New Exception("Inner exception.")

		ElseIf daftarKondisi.ConditionsList.Count = 1 Then
			hasil = EvaluasiKondisi(daftarKondisi.ConditionsList(0), fuzzifiedInput)

		Else
			hasil = EvaluasiKondisi(daftarKondisi.ConditionsList(0), fuzzifiedInput)
			For i As Integer = 1 To daftarKondisi.ConditionsList.Count - 1
				hasil = EvaluasiKondisiPair(hasil, EvaluasiKondisi(daftarKondisi.ConditionsList(i), fuzzifiedInput), daftarKondisi.Op)
			Next
		End If

		If daftarKondisi.[Not] Then
			hasil = 1.0 - hasil
		End If

		Return hasil

	ElseIf TypeOf condition Is FuzzyCondition Then
		Dim kondisi As FuzzyCondition = DirectCast(condition, FuzzyCondition)
		Dim hasil As Double = fuzzifiedInput(DirectCast(kondisi.Var, FuzzyVariable))(DirectCast(kondisi.Term, FuzzyTerm))

		Select Case kondisi.Hedge
			Case HedgeType.Slightly
				hasil = Math.Pow(hasil, 1.0 / 3.0)
				'Cube root
				Exit Select
			Case HedgeType.Somewhat
				hasil = Math.Sqrt(hasil)
				Exit Select
			Case HedgeType.Very
				hasil = hasil * hasil
				Exit Select
			Case HedgeType.Extremely
				hasil = hasil * hasil * hasil
				Exit Select
			Case Else
				Exit Select
		End Select

		If kondisi.[Not] Then
			hasil = 1.0 - hasil
		End If
		Return hasil

	Else
		Throw New Exception("Internal exception.")
	End If
End Function

5c. Lakukan penerapan kesimpulan pada evaluasi kondisi yang telah dihitung
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim implicatedConclusions As Dictionary(Of MamdaniFuzzyRule, IMembershipFunction) = Implicate(evaluatedConditions)

* Gunakan fungsi ini untuk menerapkan kesimpulan pada evaluasi kondisi yang telah dihitung
parameter yang digunakan adalah
conditions = kondisi pada sebuah aturan
Nilai Pengembalian fungsi adalah kesimpulan yang telah didapatkan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function Implicate(conditions As Dictionary(Of MamdaniFuzzyRule, Double)) As Dictionary(Of MamdaniFuzzyRule, IMembershipFunction)
	Dim conclusions As New Dictionary(Of MamdaniFuzzyRule, IMembershipFunction)()
	For Each aturan As MamdaniFuzzyRule In conditions.Keys
		ConstantMembershipFunction(conditions(aturan)), DirectCast(aturan.Conclusion.Term, FuzzyTerm).MembershipFunction)
		Dim hasilMf As New CompositeMembershipFunction(MfCompositionType.Min, New ConstantMembershipFunction(conditions(aturan)), DirectCast(aturan.Conclusion.Term, FuzzyTerm).MembershipFunction)
		conclusions.Add(aturan, hasilMf)
	Next

	Return conclusions
End Function

5d. Hitung nilai hasil kesimpulan pada kesimpulan yang telah diambil
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim hasilFuzzy As Dictionary(Of FuzzyVariable, IMembershipFunction) = Aggregate(implicatedConclusions)

* Gunakan fungsi ini untuk menghitung nilai hasil kesimpulan
parameter yang digunakan adalah
conclusions = kesimpulan pada masing-masing aturan
Nilai Pengembalian fungsi adalah nilai hasil kesimpulan fuzzy
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function Aggregate(conclusions As Dictionary(Of MamdaniFuzzyRule, IMembershipFunction)) As Dictionary(Of FuzzyVariable, IMembershipFunction)
	Dim hasilFuzzy As New Dictionary(Of FuzzyVariable, IMembershipFunction)()
	For Each fv As FuzzyVariable In Output
		Dim daftarMF As New List(Of IMembershipFunction)()
		For Each aturan As MamdaniFuzzyRule In conclusions.Keys
			If aturan.Conclusion.Var Is fv Then
				daftarMF.Add(conclusions(aturan))
			End If
		Next

		hasilFuzzy.Add(fv, New CompositeMembershipFunction(MfCompositionType.Max, daftarMF))
	Next

	Return hasilFuzzy
End Function

5e. Lakukan proses de-fuzzy-fikasi pada nilai hasil untuk mendapatkan skor akhir
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim hasil As Dictionary(Of FuzzyVariable, Double) = Defuzzify(hasilFuzzy)

* Gunakan fungsi ini untuk melakukan proses de-Fuzzy-fikasi nilai kesimpulan untuk masing-masing aturan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function Defuzzify(fuzzyResult As Dictionary(Of FuzzyVariable, IMembershipFunction)) As Dictionary(Of FuzzyVariable, Double)
	Dim hasil As New Dictionary(Of FuzzyVariable, Double)()
	For Each fv As FuzzyVariable In fuzzyResult.Keys
		hasil.Add(fv, Defuzzify(fuzzyResult(fv), fv.Min, fv.Max))
	Next

	Return hasil
End Function

* Gunakan fungsi ini untuk melakukan proses de-Fuzzy-fikasi nilai kesimpulan untuk masing-masing aturan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Private Function Defuzzify(mf As IMembershipFunction, min As Double, max As Double) As Double
	Dim k As Integer = 50
	Dim [step] As Double = (max - min) / k

	'Hitung titik tengah / pusat dalam integral
	Dim ptLeft As Double = 0.0
	Dim ptCenter As Double = 0.0
	Dim ptRight As Double = 0.0

	Dim valLeft As Double = 0.0
	Dim valCenter As Double = 0.0
	Dim valRight As Double = 0.0

	Dim val2Left As Double = 0.0
	Dim val2Center As Double = 0.0
	Dim val2Right As Double = 0.0

	Dim numerator As Double = 0.0
	Dim denominator As Double = 0.0
	For i As Integer = 0 To k - 1
		If i = 0 Then
			ptRight = min
			valRight = mf.GetValue(ptRight)
			val2Right = ptRight * valRight
		End If

		ptLeft = ptRight
		ptCenter = min + [step] * (CDbl(i) + 0.5)
		ptRight = min + [step] * (i + 1)

		valLeft = valRight
		valCenter = mf.GetValue(ptCenter)
		valRight = mf.GetValue(ptRight)

		val2Left = val2Right
		val2Center = ptCenter * valCenter
		val2Right = ptRight * valRight

		numerator += [step] * (val2Left + 4 * val2Center + val2Right) / 3.0
		denominator += [step] * (valLeft + 4 * valCenter + valRight) / 3.0
	Next

	Return numerator / denominator
End Function

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd66

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.


Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

4 pemikiran di “Algoritma FIS (Fuzzy Inference System): Tipe Mamdani

  • Godya_Aditya

    Selamat sore Admin, saya sudah coba codingnya, tapi error di bagian Import (baris ke-1).
    FuzzyConclusion codingnya ada di bagian mana ya Admin, di post ini dan di source code tidak ada. mohon informasinya, terima kasih

    • pip Penulis

      Baris 1
      Imports FuzzyConclusion = ConsoleApplication1.SingleCondition(Of blablabla
      Mengacu pada kelas Single Condition yang terdapat dibawahnya.

      Permasalahan ini terjadi karena anda berusaha membuka skrip menggunakan proyek bertipe aplikasi form. Skrip ini hanya dapat anda buka menggunakan proyek bertipe aplikasi console karena tidak memiliki form.