Algoritma AMO (Amoeba Method Optimization) / Nelder-Mead Method 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.
Amoeba Method Optimization, atau disebut juga dengan Nelder-Mead Method dan Simplex Optimization, adalah metode numerik umum yang digunakan untuk mencari nilai minimal atau maksimal dari sebuah fungsi obyektif pada ruang multi dimensi. Simplex Optimization bekerja dengan cara membentuk segitiga solusi yang dikatakan sebagai solusi terbaik – lainnya – terburuk. Pada setiap perhitungan, segitiga ini akan dihitung sehingga semakin mendekati solusi yang terbaik. Apabila segitiga ini digambar secara berurutan pada setiap perulangan, gerakan segitiga yang terjadi mirip dengan pola gerakan Amoeba.
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.
* Tentukan jumlah Amoeba yang digunakan dalam perhitungan
Jumlah amoeba harus minimal 3 buah, dengan batas maksimal tidak ada
Semakin banyak amoeba yang digunakan, semakin akurat nilai akhirnya, tetapi semakin lama proses perhitungannya
Diasumsikan dalam kasus ini, jumlah amoeba ada 5 buah
Dim jumlahAmoeba As Integer = 5
* 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
Dim minPosisi As Double = -2 Dim maksPosisi As Double = +2
* Tentukan jumlah iterasi yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah iterasi adalah 50 kali
Dim jumlahIterasi As Integer = 50
Langkah-langkah penggunaan algoritma ini adalah
1. Inisialisasi nilai awal untuk semua amoeba
Beri posisi acak untuk tiap-tiap amoeba
Kemudian hitung nilai fungsi untuk posisi acak tersebut
Dim amoeba As New Amoeba(jumlahAmoeba, dimensi, minPosisi, maksPosisi, jumlahIterasi)
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Amoeba untuk menampung semua data solusi yang diperoleh amoeba tersebut. Deklarasi Class Amoeba adalah sebagai berikut:
Public Class Amoeba Public jumlahAmoeba As Integer Public dimensi As Integer Public daftarSolusi() As Solusi Public minPosisi As Double Public maksPosisi As Double Public alpha As Double 'Koefisien untuk menghitung nilai reflected Public beta As Double 'Koefisien untuk menghitung nilai contracted Public gamma As Double 'Koefisien untuk menghitung nilai expanded Public jumlahIterasi As Integer Public Sub New(ByVal jumlahAmoeba As Integer, ByVal dimensi As Integer, ByVal minPosisi As Double, ByVal maksPosisi As Double, ByVal jumlahIterasi As Integer) Me.jumlahAmoeba = jumlahAmoeba Me.dimensi = dimensi Me.minPosisi = minPosisi Me.maksPosisi = maksPosisi Me.alpha = 1.0 'didapatkan dari teori jurnal penelitian Me.beta = 0.5 'didapatkan dari teori jurnal penelitian Me.gamma = 2.0 'didapatkan dari teori jurnal penelitian Me.jumlahIterasi = jumlahIterasi Me.daftarSolusi = New Solusi(jumlahAmoeba - 1) {} For i = 0 To daftarSolusi.Length - 1 daftarSolusi(i) = New Solusi(dimensi, minPosisi, maksPosisi) Next i 'Perlu diingat bahwa, setelah proses pengurutan maka 'daftarSolusi(0) adalah merupakan posisi terbaik 'daftarSolusi(n-1) adalah merupakan posisi terburuk Array.Sort(daftarSolusi) End Sub . . . End Class
2. Lakukan proses pencarian posisi terbaik sebanyak jumlah iterasi
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 2a – 2e)
Dim solusi As Solusi = amoeba.ProsesPerhitungan
Sedikit pembahasan sebelum memasuki perhitungan utama
Dalam setiap kali perulangan, metode ini akan mencari nilai centroid, reflected, expanded, contracted
Untuk hal tersebut akan digunakan 4 fungsi tambahan untuk menghitung nilai-nilai tersebut
Penjelasan untuk masing-masing nilai tersebut adalah sebagai berikut:
Gunakan fungsi ini untuk mencari nilai centroid
Centroid adalah nilai rata-rata dari semua posisi kecual posisi terburuk
Public Function Centroid() As Solusi Dim c(dimensi - 1) As Double For i = 0 To jumlahAmoeba - 2 For j = 0 To dimensi - 1 c(j) += daftarSolusi(i).matriks(j) Next j Next i For j = 0 To dimensi - 1 c(j) = c(j) / (jumlahAmoeba - 1) If c(j) < minPosisi Then c(j) = minPosisi ElseIf c(j) > maksPosisi Then c(j) = maksPosisi End If Next j Dim s As New Solusi(c) 'Buat solusi baru pada posisi ini, dan hitung nilai fungsinya Return s End Function
Gunakan 3 fungsi dibawah ini untuk mencari nilai reflected, expanded, contracted
Ilustrasi singkat adalah sebagai berikut:
b----------x----------c----------y----------z
buruk-----------------centroid
Tarik garis lurus antara posisi terburuk dengan posisi centroid
Kemudian tambahkan garis terusan dari posisi centroid sepanjang jarak sebelumnnya
Posisi Reflected berada pada posisi y, dengan jarak (centroid-buruk) * koefisien alpha, dalam contoh ini bernilai 1.0
Posisi Expanded berada pada posisi z, dengan jarak (centroid-buruk) * koefisien gamma, dalam contoh ini bernilai 2.0
Posisi Contracted berada pada posisi x, dengan jarak (centroid-buruk) * koefisien beta, dalam contoh ini bernilai 0.5
Public Function Reflected(ByVal centroid As Solusi) As Solusi Dim r(dimensi - 1) As Double Dim terburuk() As Double = Me.daftarSolusi(jumlahAmoeba - 1).matriks For j = 0 To dimensi - 1 r(j) = ((1 + alpha) * centroid.matriks(j)) - (alpha * terburuk(j)) If r(j) < minPosisi Then r(j) = minPosisi ElseIf r(j) > maksPosisi Then r(j) = maksPosisi End If Next j Dim s As New Solusi(r) Return s End Function Public Function Expanded(ByVal reflected As Solusi, ByVal centroid As Solusi) As Solusi Dim e(dimensi - 1) As Double For j = 0 To dimensi - 1 e(j) = (gamma * reflected.matriks(j)) + ((1 - gamma) * centroid.matriks(j)) If e(j) < minPosisi Then e(j) = minPosisi ElseIf e(j) > maksPosisi Then e(j) = maksPosisi End If Next j Dim s As New Solusi(e) Return s End Function Public Function Contracted(ByVal centroid As Solusi) As Solusi Dim v(dimensi - 1) As Double Dim terburuk() As Double = Me.daftarSolusi(jumlahAmoeba - 1).matriks For j = 0 To dimensi - 1 v(j) = (beta * terburuk(j)) + ((1 - beta) * centroid.matriks(j)) If v(j) < minPosisi Then v(j) = minPosisi ElseIf v(j) > maksPosisi Then v(j) = maksPosisi End If Next j Dim s As New Solusi(v) Return s End Function
Kembali pada proses pencarian posisi terbaik oleh fungsi ProsesPerhitungan (poin 2) yang sudah disebutkan diatas
2a. Hitung nilai centroid, kemudian hitung nilai reflected
Dim centroid As Solusi = Me.Centroid Dim reflected As Solusi = Me.Reflected(centroid)
2b. Jika nilai reflected lebih baik dari nilai solusi terbaik, maka hitung nilai expanded
Jika nilai expanded ternyata lebih baik dari nilai reflected, maka update posisi terburuk dengan posisi expanded
Jika nilai expanded ternyata tidak lebih baik dari nilai reflected, maka update posisi terburuk dengan posisi reflected
If reflected.nilai > daftarSolusi(0).nilai Then Dim expanded As Solusi = Me.Expanded(reflected, centroid) If expanded.nilai > daftarSolusi(0).nilai Then Console.WriteLine("Posisi expanded baru ditemukan: " & expanded.ToString) UpdatePosisiTerburuk(expanded) Else Console.WriteLine("Posisi reflected baru ditemukan: " & reflected.ToString) UpdatePosisiTerburuk(reflected) End If Continue Do End If
2c. Tentukan apakah nilai reflected ternyata paling buruk (nilai terendah) dari semua nilai selain nilai posisi terburuk
Dim IsTerendahSelainTerburuk As Boolean = True For i = 0 To jumlahAmoeba - 2 If reflected.nilai > daftarSolusi(i).nilai Then 'Ternyata ada yang nilai nya lebih buruk dari nilai reflected IsTerendahSelainTerburuk = False Exit For End If Next i
2d. Jika benar nilai reflected ternyata paling buruk (nilai terendah) dari semua nilai selain nilai posisi terburuk, maka:
– Jika nilai reflected ternyata masih lebih baik dari nilai solusi terburuk, maka update posisi terburuk dengan posisi reflected
– Hitung nilai contracted
– Jika nilai contracted ternyata lebih baik dari nilai solusi terburuk, maka update posisi terburuk dengan posisi contracted
– Jika nilai contracted ternyata tidak lebih baik dari nilai solusi terburuk, maka solusi baru tidak ditemukan
Jika solusi baru tidak ditemukan maka lakukan proses perpindahan semua posisi kecual posisi terbaik
Posisi baru untuk masing-masing posisi adalah setengah jarak dari (posisi terbaik dan posisi tersebut), kemudian hitung nilai fungsi baru untuk masing-masing posisi
If IsTerendahSelainTerburuk Then If reflected.nilai > daftarSolusi(jumlahAmoeba - 1).nilai Then UpdatePosisiTerburuk(reflected) End If Dim contracted As Solusi = Me.Contracted(centroid) If contracted.nilai > daftarSolusi(0).nilai Then Console.WriteLine("Posisi contracted baru ditemukan: " & contracted.ToString) End If If contracted.nilai > daftarSolusi(jumlahAmoeba - 1).nilai Then UpdatePosisiTerburuk(contracted) Else For i = 1 To jumlahAmoeba - 1 For j = 0 To dimensi - 1 daftarSolusi(i).matriks(j) = (daftarSolusi(i).matriks(j) + daftarSolusi(0).matriks(j)) / 2.0 daftarSolusi(i).nilai = hitungFungsi(daftarSolusi(i).matriks) Next j Next i Array.Sort(daftarSolusi) End If Continue Do End If
2e. Lakukan perhitungan poin 2a – 2d sebanyak jumlah iterasi
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Solusi untuk menampung semua data posisi beserta nilai fungsinya. Deklarasi Class Solusi adalah sebagai berikut:
Public Class Solusi Implements IComparable(Of Solusi) Public matriks() As Double 'Posisi Public nilai As Double 'Nilai fungsi posisi tersebut Private Shared random As New Random(1) Public Sub New(ByVal dimensi As Integer, ByVal minPosisi As Double, ByVal maksPosisi As Double) 'Membuat matriks baru dengan nilai posisi acak Me.matriks = New Double(dimensi - 1) {} For i = 0 To dimensi - 1 Me.matriks(i) = (maksPosisi - minPosisi) * random.NextDouble + minPosisi Next i Me.nilai = hitungFungsi(Me.matriks) End Sub Public Sub New(ByVal matriks() As Double) 'Membuat matriks baru dengan nilai posisi tertentu Me.matriks = New Double(matriks.Length - 1) {} Array.Copy(matriks, Me.matriks, matriks.Length) Me.nilai = hitungFungsi(Me.matriks) End Sub Public Function CompareTo(ByVal other As Solusi) As Integer Implements IComparable(Of Solusi).CompareTo If Me.nilai < other.nilai Then Return 1 ElseIf Me.nilai > other.nilai Then Return -1 Else Return 0 End If End Function Public Overrides Function ToString() As String Dim s As String = "[" For i = 0 To Me.matriks.Length - 1 If matriks(i) >= 0.0 Then s &= " " End If s &= " " & matriks(i).ToString("F2") Next i s &= "] nilai fungsi = " & Me.nilai.ToString("F4") Return s End Function End Class
Hasil akhir adalah: (klik untuk perbesar gambar)
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.