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:
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 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)
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.
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
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.
Terima kasih informasinya Admin 😀 (y)
Sama sama