Algoritma FIS (Fuzzy Inference System): Tipe Sugeno 2


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 Takagi – Sugeno – Kang, oleh karena itu tipe ini dinamakan tipe Sugeno / Fuzzy TSK / Fuzzy Sugeno. 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 Sugeno

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 svSkor As New SugenoVariable("Skor")
svSkor.Functions.Add(fisSkor.CreateSugenoFunction("rendah", New Double() {0.0, 0.0002, 0.0004, 0}))
svSkor.Functions.Add(fisSkor.CreateSugenoFunction("sedang", New Double() {0.0025, 0.005, 0.0075, 0}))
svSkor.Functions.Add(fisSkor.CreateSugenoFunction("tinggi", New Double() {0.006, 0.008, 0.01, 0}))
fisSkor.Output.Add(svSkor)

3. Buat aturan fuzzy yang dibutuhkan
Jumlah aturan yang harus dibuat adalah semua kombinasi dari masing-masing nilai kriteria yang ada
Dalam kasus ini, jumlah aturan yang harus dibuat adalah jumlah jam kerja (3) * jumlah barang (4) * jumlah barang gagal (2) = 24 aturan

AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_sedikit", "bg_banyak", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_sedikit", "bg_sedikit", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_sedang", "bg_banyak", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_sedang", "bg_sedikit", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_banyak", "bg_banyak", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_banyak", "bg_sedikit", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_sangat_banyak", "bg_banyak", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedikit", "jb_sangat_banyak", "bg_sedikit", "sedang")

AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_sedikit", "bg_banyak", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_sedikit", "bg_sedikit", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_sedang", "bg_banyak", "rendah")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_sedang", "bg_sedikit", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_banyak", "bg_banyak", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_banyak", "bg_sedikit", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_sangat_banyak", "bg_banyak", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_sedang", "jb_sangat_banyak", "bg_sedikit", "tinggi")

AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_sedikit", "bg_banyak", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_sedikit", "bg_sedikit", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_sedang", "bg_banyak", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_sedang", "bg_sedikit", "tinggi")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_banyak", "bg_banyak", "sedang")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_banyak", "bg_sedikit", "tinggi")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_sangat_banyak", "bg_banyak", "tinggi")
AddSugenoFuzzyRule(fisSkor, fvJamKerja, fvJumlahBarang, fvGagal, svSkor, "jk_banyak", "jb_sangat_banyak", "bg_sedikit", "tinggi")

* Gunakan fungsi ini untuk memasukkan aturan-aturan yang telah dibuat ke dalam sistem
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Private Sub AddSugenoFuzzyRule(fs As SugenoFuzzySystem, fv1 As FuzzyVariable, fv2 As FuzzyVariable, fv3 As FuzzyVariable, sv As SugenoVariable, _
							   nilai1 As String, nilai2 As String, nilai3 As String, result As String)

	Dim aturan As SugenoFuzzyRule = fs.EmptyRule()
	aturan.Condition.Op = OperatorType.[And]
	aturan.Condition.ConditionsList.Add(aturan.CreateCondition(fv1, fv1.GetTermByName(nilai1)))
	aturan.Condition.ConditionsList.Add(aturan.CreateCondition(fv2, fv2.GetTermByName(nilai2)))
	aturan.Condition.ConditionsList.Add(aturan.CreateCondition(fv3, fv3.GetTermByName(nilai3)))
	aturan.Conclusion.Var = sv
	aturan.Conclusion.Term = sv.GetFuncByName(result)
	fs.Rules.Add(aturan)

	Console.WriteLine("[" & fs.Rules.Count.ToString.PadRight(2) & "] IF " & fv1.Name & " " & nilai1.Substring(3) & " AND " & fv2.Name & " " & nilai2.Substring(3) & " AND " & fv3.Name & " " & nilai3.Substring(3) & " THEN " & sv.Name & " " & result & " ")
End Sub

* 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 SugenoVariable, Double) = _fisSkor.HitungFuzzy(dataAwal)

* Fungsi HitungFuzzy adalah inti perhitungan pada algoritma ini. Terdapat 4 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 bobotAturan As Dictionary(Of SugenoFuzzyRule, 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 SugenoFuzzyRule, Double)
	Dim result As New Dictionary(Of SugenoFuzzyRule, Double)()
	For Each rule As SugenoFuzzyRule In Rules
		result.Add(rule, EvaluasiKondisi(rule.Condition, fuzzifiedInput))
	Next

	Return result
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 evaluasi nilai fungsi pada masing-masing data input
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim nilaiFungsi As Dictionary(Of SugenoVariable, Dictionary(Of ISugenoFunction, Double)) = EvaluasiNilaiFungsi(dataAwal)

* Gunakan fungsi ini untuk menghitung nilai fungsi dari inputan data
parameter yang digunakan adalah
dataAwal = data awal dalam bentuk biasa (bukan bentuk fuzzy)
Nilai Pengembalian fungsi adalah hasil perhitungan nilai fungsi
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function EvaluasiNilaiFungsi(dataAwal As Dictionary(Of FuzzyVariable, Double)) As Dictionary(Of SugenoVariable, Dictionary(Of ISugenoFunction, Double))
	Dim hasil As New Dictionary(Of SugenoVariable, Dictionary(Of ISugenoFunction, Double))()

	For Each sv As SugenoVariable In Output
		Dim hasilVar As New Dictionary(Of ISugenoFunction, Double)()

		For Each fungsi As ISugenoFunction In sv.Functions
			hasilVar.Add(fungsi, fungsi.HitungNilaiFungsi(dataAwal))
		Next

		hasil.Add(sv, hasilVar)
	Next

	Return hasil
End Function

* Gunakan fungsi ini untuk menghitung fungsi linier dari inputan data
parameter yang digunakan adalah
dataAwal = data awal dalam bentuk biasa (bukan bentuk fuzzy)
Nilai Pengembalian fungsi adalah hasil perhitungan fungsi linier
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function HitungNilaiFungsi(dataAwal As Dictionary(Of FuzzyVariable, Double)) As Double Implements ISugenoFunction.HitungNilaiFungsi
	Dim hasil As Double = 0.0

	For Each fv As FuzzyVariable In _coeffs.Keys
		hasil += _coeffs(fv) * dataAwal(fv)
	Next
	hasil += _constValue

	Return hasil
End Function

5d. Hitung nilai skor akhir berdasarkan nilai fungsi dan bobot aturan yang sudah ditemukan sebelumnya
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim hasil As Dictionary(Of SugenoVariable, Double) = HitungSkorAkhir(bobotAturan, nilaiFungsi)

* Gunakan fungsi ini untuk menghitung nilai skor akhir berdasarkan nilai fungsi dan bobot aturan yang sudah ditemukan sebelumnya
parameter yang digunakan adalah
bobotAturan = bobot aturan (hasil dari evaluasi kondisi pada data awal)
nilaiFungsi = nilai fungsi (hasil dari perhitungan nilai fungsi pada data awal)
Nilai Pengembalian fungsi adalah nilai skor akhir dari data inputan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function HitungSkorAkhir(bobotAturan As Dictionary(Of SugenoFuzzyRule, Double), nilaiFungsi As Dictionary(Of SugenoVariable, Dictionary(Of ISugenoFunction, Double))) As Dictionary(Of SugenoVariable, Double)
	Dim numerators As New Dictionary(Of SugenoVariable, Double)()
	Dim denominators As New Dictionary(Of SugenoVariable, Double)()
	Dim hasil As New Dictionary(Of SugenoVariable, Double)()

	'5d1. Hitung numerator dan denominator pada masing-masing output
	For Each sv As SugenoVariable In Output
		numerators.Add(sv, 0.0)
		denominators.Add(sv, 0.0)
	Next

	For Each rule As SugenoFuzzyRule In bobotAturan.Keys
		Dim sv As SugenoVariable = rule.Conclusion.Var
		Dim z As Double = nilaiFungsi(sv)(rule.Conclusion.Term)
		Dim w As Double = bobotAturan(rule)

		numerators(sv) += z * w
		denominators(sv) += w
	Next

	'5d2. Hitung nilai skor akhir pada masing-masing output
	For Each sv As SugenoVariable In Output
		If denominators(sv) = 0.0 Then
			hasil(sv) = 0.0
		Else
			hasil(sv) = numerators(sv) / denominators(sv)
		End If
	Next

	Return hasil
End Function

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd67

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 *

2 pemikiran di “Algoritma FIS (Fuzzy Inference System): Tipe Sugeno