Algoritma BFO (Bacterial Foraging Optimization)


Algoritma BFO (Bacterial Foraging Optimization) adalah salah satu algoritma optimasi yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai pencarian posisi dengan pengembalian nilai fungsi maksimal.
Bacterial Foraging Optimization adalah teknik probabiltas yang meniru tingkah laku cara pencarian makanan dan reproduksi dari bakteri. Algoritma ini dapat digunakan untuk menyelesaikan permasalahan matematika yang sangat rumit ketika tidak ada pendekatan tertentu yang efektif



Diasumsikan ada sebaran titik 2 dimensi antara -2 sampai dengan 2
Fungsi yang diketahui adalah fungsi Himmelblau, dengan rumus f(x, y) = (x^2+y-11)^2 + (x+y^2-7)^2
Tentukan posisi dimana fungsi tersebut mengembalikan nilai maksimal



Fungsi Himmelblau adalah salah satu fungsi yang dapat digunakan untuk mengoptimasi suatu permasalahan. Fungsi ini memiliki sebuah nilai maksimum pada x = -0.270845, and y = -0.923039 dengan nilai fungsi sebesar f(x,y) = 181.617, dengan asumsi bahwa rentang minimal dan maksimal dari sebaran titik adalah -2 sampai dengan 2

Grafik fungsi Himmelblau yang normal, atau untuk sebaran titik tak terbatas adalah sebagai berikut.
Grafik Himmelblau

Sedangkan Grafik fungsi Himmelblau untuk sebaran titik dengan rentang minimal -2 dan maksimal 2 adalah sebagai berikut.
Grafik Himmelblau -2sd2
Dapat dilihat bahwa pada gambar tersebut, didapatkan area dengan titik tertinggi (berwarna merah) berada pada area x = -0, and y = -1, dimana titik tersebut mengembalikan nilai fungsi tertinggi. Oleh sebab itu digunakan algoritma ini untuk mencari titik di area berwarna merah tersebut.



* Tentukan posisi minimal dan maksimal dari fungsi yang akan dihitung
Jika tidak ada batasan posisi, tentu saja posisi yang mendekati tak terhingga akan terpilih karena akan mengembalikan nilai fungsi yang sangat besar
Diasumsikan dalam kasus ini, posisi minimal adalah -2, dan posisi maksimal adalah +2

Const minPosisi As Double = -2
Const maksPosisi As Double = 2

* Tentukan ukuran koloni dari bakteri
Ukuran koloni harus genap, karena nantinya akan ada perhitungan bakteri yang bereproduksi menjadi 2
Diasumsikan dalam kasus ini, ukuran koloni adalah 100 bakteri

Const ukuranKoloni As Integer = 100

* Tentukan umur dari masing-masing bakteri
Nantinya akan ada perulangan untuk menjalankan perhitungan tertentu sebanyak umur bakteri
Diasumsikan dalam kasus ini, umur bakteri adalah 20

Const umurBakteri As Integer = 20

* Tentukan jumlah maksimal pergerakan bakteri
Dalam sekali proses pergerakan bakteri, tiap-tiap bakteri dapat berenang untuk berpindah tempat ke arah solusi yang lebih baik
Diasumsikan dalam kasus ini, jumlah maksimal pergerakan bakteri adalah 5 kali,
dan jumlah maksimal jarak pergerakan dalam sekali tempuh adalah 0.05

Const prosesPergerakan As Integer = 5
Const maksPergerakan As Double = 0.05

* Tentukan jumlah proses reproduksi
Dalam sekali proses reproduksi, bakteri akan melakukan reproduksi setelah bergerak dari posisi semula
Bakteri dengan nilai fungsi rendah akan digantikan oleh bakteri dengan nilai fungsi tinggi
Diasumsikan dalam kasus ini, jumlah reproduksi adalah 8 kali

Const prosesReproduksi As Integer = 8

* Tentukan jumlah proses penyebaran
Dalam sekali proses penyebaran bakteri, tiap-tiap bakteri akan memiliki kemungkinan untuk berpindah ke posisi acak
Diasumsikan dalam kasus ini, jumlah proses penyebaran bakteri adalah 4 kali,
dan kemungkinan bakteri untuk berpindah ke posisi acak adalah 25%

Const prosesPenyebaran As Integer = 4
Const kemungkinanPenyebaranPosisiAcak As Double = 0.25


Langkah-langkah penggunaan algoritma ini adalah

1. Inisialisasi nilai awal untuk semua bakteri
Beri posisi acak untuk tiap-tiap bakteri
Kemudian hitung nilai fungsi untuk posisi acak tersebut

Dim koloni As New koloni(ukuranKoloni, dimensi, minPosisi, maksPosisi)
For i = 0 To ukuranKoloni - 1
	Dim nilai As Double = hitungFungsi(koloni.bakteri(i).posisi)
	koloni.bakteri(i).nilai = nilai
	koloni.bakteri(i).nilaiSebelumnya = nilai
Next i

* Gunakan fungsi ini untuk menghitung nilai fungsi yang diinginkan
Fungsi yang diketahui adalah fungsi Himmelblau, dengan rumus f(x, y) = (x^2+y-11)^2 + (x+y^2-7)^2

Private Function hitungFungsi(ByVal posisi() As Double) As Double
	Dim result As Double = Math.Pow(posisi(0) * posisi(0) + posisi(1) - 11, 2) + Math.Pow(posisi(0) + posisi(1) * posisi(1) - 7, 2)
	Return result
End Function

2. Cari posisi bakteri dengan nilai fungsi terbaik

Dim nilaiTerbaik As Double = koloni.bakteri(0).nilai
Dim indeksTerbaik As Integer = 0
For i = 0 To ukuranKoloni - 1
	If koloni.bakteri(i).nilai > nilaiTerbaik Then
		nilaiTerbaik = koloni.bakteri(i).nilai
		indeksTerbaik = i
	End If
Next i
Dim posisiTerbaik(dimensi - 1) As Double
koloni.bakteri(indeksTerbaik).posisi.CopyTo(posisiTerbaik, 0)

3. Lakukan proses pergerakan bakteri
Tentukan kemungkinan arah bakteri akan jatuh pada masing-masing nilai x dan y

Dim arahJatuh(dimensi - 1) As Double
For p = 0 To dimensi - 1
	arahJatuh(p) = 2.0 * random.NextDouble - 1.0
Next p
Dim jumlahKuadratarahJatuh As Double = 0.0
For p = 0 To dimensi - 1
	jumlahKuadratarahJatuh += (arahJatuh(p) * arahJatuh(p))
Next p

4. Lakukan pergerakan ke arah bakteri jatuh sepanjang nilai random pergerakan * nilai maksimal pergerakan

For p = 0 To dimensi - 1
	koloni.bakteri(i).posisi(p) += (maksPergerakan * arahJatuh(p)) / jumlahKuadratarahJatuh

	If koloni.bakteri(i).posisi(p) < minPosisi Then
		koloni.bakteri(i).posisi(p) = minPosisi
	ElseIf koloni.bakteri(i).posisi(p) > maksPosisi Then
		koloni.bakteri(i).posisi(p) = maksPosisi
	End If
Next p

5. Cari nilai fungsi dari posisi yang baru
Jika nilai fungsi dari posisi yang baru lebih dari nilai terbaik, maka ambil posisi ini sebagai posisi terbaik

koloni.bakteri(i).nilaiSebelumnya = koloni.bakteri(i).nilai
koloni.bakteri(i).nilai = hitungFungsi(koloni.bakteri(i).posisi)
koloni.bakteri(i).totalNilai += koloni.bakteri(i).nilai

If koloni.bakteri(i).nilai > nilaiTerbaik Then
	s = ""
	For x As Integer = 0 To dimensi - 1
		s &= IIf(s <> "", " ", "") & koloni.bakteri(i).posisi(x).ToString("F4")
	Next
	Console.WriteLine("Perulangan #" & counterWaktu & ", bakteri #" & i & " [" & s & "] dengan nilai fungsi = " & koloni.bakteri(i).nilai.ToString("F4"))
	nilaiTerbaik = koloni.bakteri(i).nilai
	koloni.bakteri(i).posisi.CopyTo(posisiTerbaik, 0)
End If

6. Lakukan pergerakan ke arah jatuh yang sama jika belum melewati batas jumlah pergerakan dan nilai posisi baru masih lebih dari nilai posisi sebelumnya
Kemudian hitung nilai fungsi yang baru untuk setiap kali bergerak ke posisi yang baru
Jika nilai fungsi dari posisi yang baru lebih dari nilai terbaik, maka ambil posisi ini sebagai posisi terbaik

Dim iPergerakan As Integer = 0
Do While iPergerakan < prosesPergerakan AndAlso koloni.bakteri(i).nilai > koloni.bakteri(i).nilaiSebelumnya
	iPergerakan += 1
	For p = 0 To dimensi - 1
		koloni.bakteri(i).posisi(p) += (maksPergerakan * arahJatuh(p)) / jumlahKuadratarahJatuh

		If koloni.bakteri(i).posisi(p) < minPosisi Then
			koloni.bakteri(i).posisi(p) = minPosisi
		ElseIf koloni.bakteri(i).posisi(p) > maksPosisi Then
			koloni.bakteri(i).posisi(p) = maksPosisi
		End If
	Next p
	koloni.bakteri(i).nilaiSebelumnya = koloni.bakteri(i).nilai
	koloni.bakteri(i).nilai = hitungFungsi(koloni.bakteri(i).posisi)

	If koloni.bakteri(i).nilai > nilaiTerbaik Then
		s = ""
		For x As Integer = 0 To dimensi - 1
			s &= IIf(s <> "", " ", "") & koloni.bakteri(i).posisi(x).ToString("F4")
		Next
		Console.WriteLine("Perulangan #" & counterWaktu & ", bakteri #" & i & " [" & s & "] dengan nilai fungsi = " & koloni.bakteri(i).nilai.ToString("F4"))
		nilaiTerbaik = koloni.bakteri(i).nilai
		koloni.bakteri(i).posisi.CopyTo(posisiTerbaik, 0)
	End If
Loop

7. Lakukan proses pergerakan (poin 3 sampai dengan 6) sebanyak jumlah umur bakteri

8. Lakukan proses reproduksi bakteri
Urutkan bakteri dari nilai terendah ke nilai tertinggi
Buang setengah dari total bakteri dengan nilai terendah, kemudian lakukan proses reproduksi, yaitu gandakan semua bakteri dengan nilai tertinggi

Array.Sort(koloni.bakteri)
For left As Integer = 0 To ukuranKoloni \ 2 - 1
	Dim right = left + ukuranKoloni \ 2
	koloni.bakteri(right).posisi.CopyTo(koloni.bakteri(left).posisi, 0)
	koloni.bakteri(left).nilai = koloni.bakteri(right).nilai
	koloni.bakteri(left).nilaiSebelumnya = koloni.bakteri(right).nilaiSebelumnya
	koloni.bakteri(left).totalNilai = koloni.bakteri(right).totalNilai
Next left

9. Lakukan proses pergerakan dan reproduksi bakteri (poin 3 sampai dengan 8) sebanyak jumlah proses reproduksi

10. Lakukan proses penyebaran bakteri ke posisi acak
Ambil sebuah nilai acak
Jika nilai acak ini kurang dari nilai kemungkinan penyebaran bakteri (<= 25%), maka lakukan proses penyebaran bakteri ke posisi acak Kemudian hitung nilai fungsi yang baru untuk posisi yang baru Jika nilai fungsi dari posisi yang baru lebih dari nilai terbaik, maka ambil posisi ini sebagai posisi terbaik

Dim prob As Double = random.NextDouble
If prob < kemungkinanPenyebaranPosisiAcak Then
	For p = 0 To dimensi - 1
		Dim x As Double = (maksPosisi - minPosisi) * random.NextDouble + minPosisi
		koloni.bakteri(i).posisi(p) = x
	Next p

	Dim nilai As Double = hitungFungsi(koloni.bakteri(i).posisi)
	koloni.bakteri(i).nilai = nilai
	koloni.bakteri(i).nilaiSebelumnya = nilai
	koloni.bakteri(i).totalNilai = 0.0

	If koloni.bakteri(i).nilai > nilaiTerbaik Then
		s = “”
		For x As Integer = 0 To dimensi – 1
			s &= IIf(s <> “”, ” “, “”) & koloni.bakteri(i).posisi(x).ToString(“F4”)
		Next
		Console.WriteLine(“Perulangan #” & counterWaktu & “, bakteri #” & i & ” [” & s & “] dengan nilai fungsi = ” & koloni.bakteri(i).nilai.ToString(“F4”))
		nilaiTerbaik = koloni.bakteri(i).nilai
		koloni.bakteri(i).posisi.CopyTo(posisiTerbaik, 0)
	End If
End If

11. Lakukan proses pergerakan, reproduksi, dan penyebaran bakteri (poin 3 sampai dengan 10) sebanyak jumlah proses penyebaran


Hasil akhir adalah: (klik untuk perbesar gambar)

cmd27a

Dapat dilihat bahwa hasil akhir perhitungan tidak sama dengan x = -0.270845, and y = -0.923039, tetapi sangat mendekati posisi tersebut. Jika ingin mendapatkan jawaban yang lebih mirip lagi, maka silahkan lakukan penambahan jumlah iterasi, dengan resiko bahwa perhitungan yang dilakukan akan semakin lama.


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 *