Algoritma EHO (Elephant Herding 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.
Algoritma ini meniru tingkah laku dari hewan gajah (Elephant) dalam bermigrasi. Biasanya gajah akan bermigrasi secara berkelompok, yang dalam kasus ini disebut dengan clan. Masing-masing clan akan bermigrasi sambil menjaga anggota clan agar tidak terpisah. Sistem migrasi ini kemudian diterapkan sebagai inti pemecahan dari permasalahan optimasi
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.
Sedangkan Grafik fungsi Himmelblau untuk sebaran titik dengan rentang minimal -2 dan maksimal 2 adalah sebagai berikut.
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.
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan dimensi permasalahan dalam sebuah solusi
Diasumsikan dalam kasus ini, dimensi bernilai 2 karena ada 2 dimensi yang akan dicari solusinya yaitu x dan y
Const dimensi As Integer = 2
* 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 jumlah iterasi yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah iterasi adalah 500 kali
Const jumlahIterasi As Integer = 500
* Tentukan ukuran populasi yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, ukuran populasi yang digunakan adalah 40
Const ukuranPopulasi As Integer = 40
* Tentukan jumlah kelompok dalam populasi, yang disebut juga sebagai clan
Diasumsikan dalam kasus ini, jumlah clan adalah 5 clan
Const jumlahClan As Integer = 5
* Tentukan jumlah populasi elit
Nantinya dalam setiap perulangan, butterfly elit akan dimasukkan untuk menggantikan butterfly dengan nilai terburuk
Diasumsikan dalam kasus ini, jumlah populasi elit adalah 2
Const jumlahPopulasiElit As Integer = 2
* Tentukan nilai alpha dan beta sebagai parameter untuk digunakan dalam proses penyesuaian posisi elephant dalam clan
Diasumsikan dalam kasus ini, nilai alpha adalah 0.5 dan nilai beta adalah 0.1
Const alpha As Double = 0.5 Const beta As Double = 0.1
Langkah-langkah penggunaan algoritma ini adalah
* Lakukan proses pencarian posisi terbaik
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 1 – 5)
Dim posisiTerbaik() As Double = EHO(dimensi, minPosisi, maksPosisi, jumlahIterasi, ukuranPopulasi, _ jumlahClan, jumlahPopulasiElit, alpha, beta)
Memasuki perhitungan pada fungsi EHO
* Inisialisasi para elephant yang digunakan sebanyak ukuran populasi
1. Lakukan perulangan sebanyak ukuran populasi (poin 1a – 1b)
For i As Integer = 0 To ukuranPopulasi - 1 . . .
1a. Beri posisi acak pada masing-masing elephant sebanyak jumlah dimensi
dan pastikan tidak ada posisi elephant yang sama antara satu dengan yang lain
Dim isUnik As Boolean = False Dim tmpPosisi(dimensi - 1) As Double While Not isUnik isUnik = True For k As Integer = 0 To dimensi - 1 tmpPosisi(k) = (maksPosisi - minPosisi) * rnd.NextDouble() + minPosisi Next k For j As Integer = 0 To i - 1 For jd As Integer = 0 To dimensi - 1 If populasi(j).posisi(jd) = tmpPosisi(jd) Then isUnik = False Else isUnik = True Exit For End If Next If Not isUnik Then Exit For Next End While For k As Integer = 0 To dimensi - 1 populasi(i).posisi(k) = tmpPosisi(k) Next
1b. Hitung nilai fungsi pada posisi tersebut
Penjelasan tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
populasi(i).nilaiFungsi = hitungNilaiFungsi(populasi(i).posisi)
* 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
Public Function HitungNilaiFungsi(x1 As Double, y As Double) As Double Dim hasil As Double = Math.Pow(x1 * x1 + y - 11, 2) + Math.Pow(x1 + y * y - 7, 2) Return hasil End Function
2. Urutkan populasi berdasarkan nilai fungsi terbaik (tertinggi) ke nilai fungsi terburuk (terendah)
Array.Sort(populasi)
3. Ambil posisi elephant pertama sebagai posisi terbaik sementara
Array.Copy(populasi(0).posisi, PosisiTerbaik, dimensi) nilaiFungsiTerbaik = populasi(0).nilaiFungsi
4. Lakukan pencatatan jumlah elephant dalam masing-masing clan
Untuk memudahkan perhitungan, maka sebaiknya digunakan nilai yang tidak memiliki sisa pembagian
Dim jumlahElephantPerClan(jumlahClan - 1) As Integer For i As Integer = 0 To jumlahClan - 1 jumlahElephantPerClan(i) = ukuranPopulasi / jumlahClan Next
* Lakukan proses pencarian posisi terbaik (poin 5)
5. Lakukan proses perhitungan sebanyak jumlah iterasi (poin 5a – 5h)
Dim iterasi As Integer = 0 Do While iterasi < jumlahIterasi iterasi += 1 . . .
5a. Simpan populasi elephant elit untuk dimasukkan ke dalam populasi pada generasi berikutnya
Dim populasiElit(jumlahPopulasiElit - 1) As Elephant For i As Integer = 0 To jumlahPopulasiElit - 1 populasiElit(i) = populasi(i).Clone Next
5b. Lakukan pembagian populasi ke dalam masing-masing clan
Elephant yang terbaik akan menjadi nilai awal dalam masing-masing clan, dan selanjutnya elephant akan dimasukkan kedalam masing-masing clan
Dim idxPopulasi As Integer = 0 Dim idxElephantPerClan As Integer = 0 Dim daftarClan(jumlahClan - 1)() As Elephant For i As Integer = 0 To jumlahClan - 1 daftarClan(i) = New Elephant(jumlahElephantPerClan(i) - 1) {} Next While idxPopulasi < ukuranPopulasi For i As Integer = 0 To jumlahClan - 1 daftarClan(i)(idxElephantPerClan) = populasi(idxPopulasi).Clone idxPopulasi += 1 Next idxElephantPerClan += 1 End While
* Berikut adalah proses update posisi elephant dalam masing-masing clan (poin 5c)
5c. lakukan perulangan sebanyak populasi yang ada
While idxPopulasi < ukuranPopulasi . . .
5c1. Lakukan perulangan seanyak jumlah clan yang ada
For i As Integer = 0 To jumlahClan - 1 . . .
5c1a. Lakukan perhitungan pada masing-masing dimensi
Hitung nilai posisi yang baru dengan rumus:
posisi baru = posisi lama + alpha * (posisi elephant terbaik dalam clan - posisi elephant terpilih dalam clan) * nilai acak
Kemudian jumlahkan selisih dari posisi baru dan posisi lama
Dim delta As Double = 0 For j As Integer = 0 To dimensi - 1 daftarClanBaru(i)(idxElephantPerClan).posisi(j) = daftarClan(i)(idxElephantPerClan).posisi(j) _ + alpha * (daftarClan(i)(0).posisi(j) - daftarClan(i)(idxElephantPerClan).posisi(j)) * rnd.NextDouble delta += daftarClanBaru(i)(idxElephantPerClan).posisi(j) - daftarClan(i)(idxElephantPerClan).posisi(j) Next
5c1b. Jika tidak ada perubahan antara posisi baru dan posisi lama,
maka hitung nilai rata-rata posisi elephant pada clan tersebut
Kemudian posisi baru dihitung dengan rumus:
posisi baru = beta * rata-rata posisi
If delta = 0 Then Dim rata2posisi(dimensi - 1) As Double For j As Integer = 0 To jumlahElephantPerClan(i) - 1 For k As Integer = 0 To dimensi - 1 rata2posisi(k) += daftarClan(i)(j).posisi(k) Next Next For j As Integer = 0 To dimensi - 1 rata2posisi(j) /= jumlahElephantPerClan(i) daftarClanBaru(i)(idxElephantPerClan).posisi(j) = beta * rata2posisi(j) Next End If
5d. Lakukan proses pemisahan elephant pada posisi terakhir pada masing-masing clan
nilai posisi yang digunakan adalah nilai acak sesuai dengan batasan dimensi pada masing-masing posisi
For i As Integer = 0 To jumlahClan - 1 For j As Integer = 0 To dimensi - 1 daftarClanBaru(i)(daftarClanBaru(i).Length - 1).posisi(j) = (maksPosisi - minPosisi) * rnd.NextDouble() + minPosisi Next Next
* Berikut adalah proses evaluasi posisi elephant pada semua clan (poin 5e)
5e. Lakukan perhitungan pada masing-masing clan (poin 5e1 - 5e4)
For i As Integer = 0 To jumlahClan - 1 . . .
5e1. Jika terdapat elephant pada posisi yang sama,
maka elephant dengan indeks yang lebih tinggi akan diganti posisinya dengan posisi acak
Kemudian akan dilakukan pengecekan lagi agar tidak ada elephant pada posisi yang sama
Dim isUnik As Boolean = False While Not isUnik isUnik = True Dim idxTerakhir As Integer = -1 For j As Integer = 0 To jumlahElephantPerClan(i) - 1 For k As Integer = 0 To j - 1 For jd As Integer = 0 To dimensi - 1 If daftarClanBaru(i)(j).posisi(jd) = daftarClanBaru(i)(k).posisi(jd) Then isUnik = False Else isUnik = True Exit For End If Next If Not isUnik Then Exit For Next If Not isUnik Then idxTerakhir = j Exit For End If Next If Not isUnik Then For jd As Integer = 0 To dimensi - 1 daftarClanBaru(i)(idxTerakhir).posisi(jd) = (maksPosisi - minPosisi) * rnd.NextDouble() + minPosisi Next End If End While
5e2. Jika posisi elephant tersebut ternyata diluar batas posisi yang diperbolehkan,
maka kembalikan nilainya agar masuk dalam batas tersebut
If daftarClanBaru(i)(j).posisi(k) < minPosisi Then daftarClanBaru(i)(j).posisi(k) = minPosisi ElseIf daftarClanBaru(i)(j).posisi(k) > maksPosisi Then daftarClanBaru(i)(j).posisi(k) = maksPosisi End If
5e3. Kemudian hitung nilai fungsi pada posisi tersebut
daftarClanBaru(i)(j).nilaiFungsi = hitungNilaiFungsi(daftarClanBaru(i)(j).posisi)
5e4. Lakukan proses pengurutan clan tersebut berdasarkan nilai fungsi terbaik (tertinggi) ke nilai fungsi terburuk (terendah)
Array.Sort(daftarClanBaru(i))
5f. Lakukan penggabungan data dari masing-masing clan menjadi populasi semula
Kemudian urutkan populasi berdasarkan nilai fungsi terbaik (tertinggi) ke nilai fungsi terburuk (terendah)
idxPopulasi = 0 For i As Integer = 0 To jumlahClan - 1 For j As Integer = 0 To jumlahElephantPerClan(i) - 1 populasi(idxPopulasi) = daftarClanBaru(i)(j).Clone idxPopulasi += 1 Next Next Array.Sort(populasi)
5g. Masukkan elephant elit untuk menggantikan elephant dengan nilai terburuk (terendah)
Kemudian lakukan pengurutan populasi sekali lagi
For i As Integer = 0 To jumlahPopulasiElit - 1 populasi(populasi.Length - 1 - i) = populasiElit(i).Clone Next Array.Sort(populasi)
5h. Jika nilai fungsi elephant terbaik ternyata lebih baik dari nilai fungsi secara umum,
maka ambil posisi terbaik elephant tersebut sebagai posisi terbaik
If populasi(0).nilaiFungsi > nilaiFungsiTerbaik Then Array.Copy(populasi(0).posisi, PosisiTerbaik, dimensi) nilaiFungsiTerbaik = populasi(0).nilaiFungsi End If
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Elephant untuk menampung semua data posisi dan nilai fungsinya. Deklarasi Class Elephant adalah sebagai berikut:
Public Class Elephant Implements IComparable(Of Elephant) Implements ICloneable Public posisi() As Double Public nilaiFungsi As Double Public Sub New(ByVal dimensi As Integer) Me.posisi = New Double(dimensi - 1) {} Me.nilaiFungsi = 0.0 End Sub 'Gunakan fungsi ini untuk melakukan pengurutan dari nilai fungsi terbaik (tertinggi) ke nilai fungsi terburuk (terendah) Public Function CompareTo(ByVal ElephantLain As Elephant) As Integer Implements IComparable(Of Elephant).CompareTo If Me.nilaiFungsi > ElephantLain.nilaiFungsi Then Return -1 ElseIf Me.nilaiFungsi < ElephantLain.nilaiFungsi Then Return 1 Else Return 0 End If End Function 'Gunakan fungsi ini untuk melakukan clone pada masing-masing elephant Public Function Clone() As Object Implements ICloneable.Clone Dim hasilClone As Elephant = TryCast(Me.MemberwiseClone(), Elephant) hasilClone.posisi = DirectCast(posisi.Clone(), Double()) Return hasilClone End Function End Class
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.