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:
Karyawan | Jam kerja | Jumlah barang | Jumlah Gagal |
---|---|---|---|
Karyawan A | 45 | 80 | 5 |
Karyawan B | 50 | 92 | 7 |
Karyawan C | 43 | 75 | 3 |
Karyawan D | 37 | 72 | 4 |
Karyawan E | 39 | 73 | 1 |
Karyawan F | 48 | 81 | 2 |
Karyawan G | 35 | 63 | 5 |
Karyawan H | 42 | 71 | 3 |
Karyawan I | 40 | 76 | 0 |
Karyawan J | 43 | 79 | 2 |
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)
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.
saya masih bingung, boleh tau apa bedanya sugeno dengan orde 0 dan 1?
Mohon maaf saya tidak mengetahui secara teori perbedaan antara 2 hal yang anda sampaikan.