Algoritma AIS (Artificial Immune System) dengan teknik Negative Selection adalah salah satu algoritma yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan pola angka baru apakah termasuk pola yang aman atau tidak.
Algoritma ini merupakan variasi dari Algoritma AIS (Artificial Immune System) yang sudah pernah dibahas sebelumnya. Pada contoh tersebut, algoritma ini digunakan untuk mengoptimasi sebuah permasalahan. Pada kali ini akan digunakan algoritma yang sama dengan algoritma tersebut, tetapi dengan teknik perhitungan yang berbeda, yaitu teknik Negative Selection.
Diasumsikan ada 5 pola angka yang diketahui, yaitu pola angka 1 sampai dengan 5
Diasumsikan 5 pola angka tersebut adalah sebagai berikut:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||||
1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Contoh data awal adalah sebagai berikut:
Dim contohData As Integer()() = New Integer(4)() {} 'Pola Angka 1 contohData(0) = New Integer() _ {0, 1, 1, 0, 0, _ 1, 0, 1, 0, 0, _ 0, 0, 1, 0, 0, _ 0, 0, 1, 0, 0, _ 1, 1, 1, 1, 1} 'Pola Angka 2 contohData(1) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 0, 1, 1, 0, _ 0, 1, 0, 0, 0, _ 1, 1, 1, 1, 1} 'Pola Angka 3 contohData(2) = New Integer() _ {1, 1, 1, 1, 0, _ 0, 0, 0, 0, 1, _ 1, 1, 1, 1, 0, _ 0, 0, 0, 0, 1, _ 1, 1, 1, 1, 0} 'Pola Angka 4 contohData(3) = New Integer() _ {0, 0, 0, 1, 1, _ 0, 0, 1, 0, 1, _ 0, 1, 1, 1, 1, _ 0, 0, 0, 0, 1, _ 0, 0, 0, 0, 1} 'Pola Angka 5 contohData(4) = New Integer() _ {1, 1, 1, 1, 1, _ 1, 0, 0, 0, 0, _ 1, 1, 1, 1, 0, _ 0, 0, 0, 0, 1, _ 1, 1, 1, 1, 0}
Selanjutnya ada sebuah deretan pola baru yang ingin diketahui hasilnya
Maka tentukan apakah deretan pola baru ini adalah pola yang aman atau tidak
Diasumsikan deretan pola baru adalah sebagai berikut:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Contoh data baru yang akan dihitung adalah sebagai berikut:
Dim dataBaru As Integer()() = New Integer(4)() {} 'Pola Baru 1 = Pola angka 6 dataBaru(0) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 0, _ 1, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 1, 1, 1, 1, 0} 'Pola Baru 2 = Pola angka 7 dataBaru(1) = New Integer() _ {1, 1, 1, 1, 1, _ 0, 0, 0, 1, 1, _ 0, 0, 1, 0, 0, _ 0, 0, 1, 0, 0, _ 0, 0, 1, 0, 0} 'Pola Baru 3 = Pola angka 8 dataBaru(2) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 0} 'Pola Baru 4 = Pola angka 9 dataBaru(3) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 1, _ 0, 0, 0, 0, 1, _ 0, 1, 1, 1, 0} 'Pola Baru 5 = Pola angka 0 dataBaru(4) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 1, 0, 0, 0, 1, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 0}
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan jumlah angka (bit) dalam setiap pola angka
Diasumsikan dalam kasus ini, jumlah angka dalam setiap pola angka ada 25 buah, karena pada masing-masing pola angka terdiri dari 25 angka
Const jumlahBitPerPola As Integer = 25
* Tentukan jumlah angka (bit) dalam setiap antibodi
Antibodi ini nantinya yang akan menentukan deretan pola angka termasuk aman atau tidak
Diasumsikan dalam kasus ini, jumlah angka dalam setiap setiap antibodi ada 6 buah
Const jumlahBitDalamAntibodi As Integer = 6
* Tentukan jumlah limfosit yang dibuat
Masing-masing Limfosit akan mengandung antibodi dengan pola tertentu
Diasumsikan dalam kasus ini, jumlah limfosit adalah 4 buah
Const jumlahLimfosit As Integer = 4
* Tentukan batas stimulasi
stimulasi adalah jumlah berapa kali antibodi mendeteksi pola angks yang cocok dengan dirinya
Apabila deretan pola angka sudah melebihi batas stimulasi, maka deretan pola tersebut dikatakan tidak aman
Diasumsikan dalam kasus ini, batas stimulasi adalah 3 kali
Const batasStimulasi As Integer = 3
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan proses pembuatan limfosit dengan teknik Negative Selection
Antibodi yang dibuat adalah antibodi dengan pola yang tidak terdapat pada contoh pola angka 1 sampai dengan 5
1a. Lakukan pembuatan antibodi dengan mengambil nilai bit (0 atau 1) secara acak
Kemudian masukkan antibodi ini kedalam calon limfosit
Dim set1(jumlahBitDalamAntibodi - 1) As Boolean For i = 0 To jumlahBitDalamAntibodi - 1 Dim b As Integer = rnd.Next(0, 2) set1(i) = If(b = 0, False, True) Next i Dim antibodi As BitArray = New BitArray(set1) Dim calonLimfosit As New Limfosit(antibodi)
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Limfosit untuk menampung semua data seperti antibodi yang digunakan, umur dan jumlah stimulasi yang telah dilakukan. Deklarasi Class Limfosit adalah sebagai berikut:
Public Class Limfosit Public antibodi As BitArray 'mendeteksi pola yang cocok dengan dirinya Public tabelPencarian() As Integer 'mempercepat pendeteksian Public umur As Integer 'menentukan pembuatan ulang limfosit, tetapi dalam kasus ini tidak digunakan Public stimulasi As Integer 'mengetahui berapa banyak stimulasi yang sudah terjadi Public Sub New(ByVal antibodi As BitArray) Me.antibodi = New BitArray(antibodi) Dim tabelPencarian(antibodi.Length - 1) As Integer Dim pos As Integer = 2 Dim cnd As Integer = 0 tabelPencarian(0) = -1 tabelPencarian(1) = 0 Do While pos < antibodi.Length If antibodi(pos - 1) = antibodi(cnd) Then cnd = cnd + 1 tabelPencarian(pos) = cnd pos = pos + 1 ElseIf cnd > 0 Then cnd = tabelPencarian(cnd) Else tabelPencarian(pos) = 0 pos = pos + 1 End If Loop Me.tabelPencarian = tabelPencarian Me.umur = 0 Me.stimulasi = 0 End Sub . . . End Class
1b. Dapatkan nilai hash pada antibodi pada calon limfosit tersebut
Jumlah maksimal bit yang dapat digunakan adalah 32 bit, diluar batas itu maka harus menggunakan cara lain
Dim singleInt(0) As Integer antibodi.CopyTo(singleInt, 0) Dim hash As Integer = singleInt(0)
1c. Lakukan pendeteksian apakah contoh pola angka diatas termasuk dalam pola antibodi acak
Jika ada yang cocok dengan contoh pola angka, maka tolak limfosit ini dan ulangi langkah perhitungan dari awal
Jika tidak ada yang cocok dengan contoh pola angka, maka masukkan calon limfosit ini ke dalam daftar limfosit
Dim isTerdeteksi As Boolean = False For i = 0 To selfSet.Count - 1 If calonLimfosit.isTerdeteksi(selfSet(i)) = True Then isTerdeteksi = True Exit For End If Next i If Not isTerdeteksi AndAlso daftarHash.ContainsKey(hash) = False Then daftarLimfosit.Add(calonLimfosit) daftarHash.Add(hash, True) End If
* Gunakan fungsi ini untuk mendeteksi apakah pola antibodi terdapat dalam pola angka input
Nilai pengembalian bernilai True apabila pola antibodi terdapat dalam pola angka input
Teknik pendeteksian yang digunakan adalah teknik Knuth-Morris-Pratt atau disebut juga dengan r-chunks matching
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Public Function isTerdeteksi(ByVal pola As BitArray) As Boolean Dim m As Integer = 0 Dim i As Integer = 0 Do While m + i < pola.Length If Me.antibodi(i) = pola(m + i) Then If i = antibodi.Length - 1 Then Return True End If i = i + 1 Else m = m + i - Me.tabelPencarian(i) If tabelPencarian(i) > -1 Then i = tabelPencarian(i) Else i = 0 End If End If Loop Return False End Function
2. Lakukan perhitungan pendeteksian deretan pola sebanyak jumlah pola data baru dan selama belum ada limfosit yang terstimulasi
2a. Lakukan perulangan pada setiap limfosit
Apabila pola data baru terdeteksi oleh limfosit tertentu, maka tambahkan nilai stimulasi nya sebanyak 1 kali
If daftarLimfosit(i).isTerdeteksi(newSet(iterasi)) = True Then daftarLimfosit(i).stimulasi = daftarLimfosit(i).stimulasi + 1
2b. Apabila nilai stimulasi sebuah limfost sudah melebih batas nilai stimulasi, maka hentikan perhitungan
If daftarLimfosit(i).stimulasi >= batasStimulasi Then isTerstimulasi = True
3. Catat kesimpulan yang didapatkan apakah ada limfosit yang terstimulasi atau tidak
Jika ada limfosit yang terstimulasi, maka deretan pola angka baru termasuk pola angka yang tidak aman
Jika tidak ada limfosit yang terstimulasi, maka deretan pola angka baru termasuk pola angka yang aman
If isTerstimulasi Then Console.WriteLine("Karena ada Limfosit yang terstimulasi, maka deretan pola angka baru termasuk pola angka yang tidak aman") Else Console.WriteLine("Karena tidak ada Limfosit yang terstimulasi, maka deretan pola angka baru termasuk pola angka yang aman") End If
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.
apakah teknik Negative Selection tsb bisa utk perhitungan optimasi untuk parameter kecepatan komputasi dan akurasi hasil ?
Jika yang anda maksud adalah waktu proses perhitungan seperti 5 detik atau 10 detik, menurut saya hal itu dapat dilakukan tidak dalam konteks algoritma apapun tetapi dilakukan sebelum dan setelah proses perhitungan algoritma dijalankan. Pengecekan nilai akurasi juga dapat dilakukan pada algoritma optimasi apapun setelah proses pelatihan selesai.
ok,terima kasih utk informasinya
Sama-sama.
Apakah ada contoh lain menggunakan pemrograman selain VB , misalnya PHP, Javascript yang bisa diterapin di website atau berbasis website
Saya tidak memiliki contoh implementasi dalam bahasa lain, akan tetapi keseluruhan skrip implementasi untuk algoritma ini dirancang secara murni dan tidak bergantung pada fungsi yang disediakan pada perangkat lunak tertentu, sehingga tentunya dapat dikonversikan ke dalam bahasa pemrograman lain setelah anda memahami konsep dari algoritma tersebut.
bisakah saya meminta referensi jurnal mengenai algoritma ini?
terima kasih
Mohon maaf riset terhadap algoritma ini saya lakukan beberapa tahun yang lalu sehingga saya sudah tidak memiliki referensi yang dapat saya bagikan. Harap maklum.