Algoritma BA (Bat Algorithm) 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 kelelawar yang berpindah-pindah tempat menggunakan pancaran getaran untuk mengetahui keadaan sekitar. Kelelawar akan cenderung memilih tempat yang lebih sunyi dibandingkan tempat yang bising.
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 jumlah kelelawar / bat yang digunakan
Nilai yang direkomendasikan adalah 10 sampai dengan 40
Diasumsikan dalam kasus ini, bat yang digunakan adalah 20 ekor
jumlahBat = 20;
* Tentukan jumlah maksimal iterasi yang digunakan
Diasumsikan dalam kasus ini, jumlah maksimal iterasi adalah 500 kali
jumlahIterasi = 500;
* Tentukan jumlah dimensi yang digunakan
Diasumsikan dalam kasus ini, jumlah dimensi adalah 2 karena posisi bunga hanya ditentukan dari 2 sumbu yaitu sumbu x dan y
jumlahDimensi = 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
minPosisi = -2; maksPosisi = 2;
* Tentukan matriks batas bawah dan batas atas posisi pada masing-masing dimensi yang sudah ditentukan sebelumnya
Matriks ini akan digunakan untuk mengecek apakah posisi serangga yang baru masih berada dalam batas yang diperbolehkan
Lb = minPosisi * ones(1,jumlahDimensi); Ub = maksPosisi * ones(1,jumlahDimensi);
* Tentukan batas minimal dan maksimal frekuensi yang digunakan untuk menghitung kecepatan kelelawar
Diasumsikan dalam kasus ini, frekuensi minimal adalah 0, dan frekuensi maksimal adalah 2
minFrekuensi = 0; maksFrekuensi = 2;
* Tentukan batas minimal rasio pemancaran getaran kelelawar
Jika sebuah kelelawar terkena pantulan getaran setelah memancarkan getaran, maka posisinya akan sedikit bergeser dari posisi semula
Diasumsikan dalam kasus ini, batas minimal rasio pemancaran getaran adalah 0.5
rasioPemancaranGetaran = 0.5;
* Tentukan batas maksimal Amplitudo / tingkat kebisingan pada saat kelelawar memancarkan getaran
Jika ada solusi yang lebih baik, tetapi posisi tersebut terlalu bising, maka kelelawar tidak akan menuju tempat tersebut
Diasumsikan dalam kasus ini, batas maksimal tingkat kebisingan adalah 0.5
tingkatKebisingan = 0.5;
Langkah-langkah penggunaan algoritma ini adalah
* Lakukan proses perhitungan dengan metode BA (Bat Algorithm)
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 1 – 3)
[posisiBatTerbaik,nilaiFungsiTerbaik] = BA( ... jumlahBat, jumlahIterasi, jumlahDimensi, Lb, Ub, ... minFrekuensi, maksFrekuensi, rasioPemancaranGetaran, tingkatKebisingan);
Memasuki perhitungan pada fungsi BA
1. Lakukan inisialisasi kelelawar pada posisi acak,
Kemudian hitung nilai fungsi pada posisi tersebut
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini
for i=1:jumlahBat, daftarBat(i,:) = Lb + (Ub-Lb) .* rand(1,jumlahDimensi); nilaiFungsi(i) = HitungNilaiFungsi(daftarBat(i,:)); end
* Gunakan fungsi ini untuk menghitung nilai fungsi dengan rumus:
f(x, y) = (x ^ 2 + y – 11) ^ 2 + (x + y ^ 2 – 7) ^ 2
function z=HitungNilaiFungsi(u) z=(u(1)^2 + u(2) - 11) ^ 2 + (u(1) + u(2)^2 - 7) ^ 2;
2. Catat posisi terbaik dengan nilai fungsi tertinggi sementara
[nilaiFungsiTerbaik,I] = max(nilaiFungsi); posisiBatTerbaik = daftarBat(I,:);
3. Lakukan perhitungan sebanyak jumlah iterasi
Kemudian pada masing-masing iterasi, lakukan perhitungan pada masing-masing kelelawar yang ada (poin 3a – 3h)
for iterasi = 1:jumlahIterasi, for i = 1:jumlahBat, . . .
3a. Tentukan nilai acak frekuensi yang digunakan sesuai dengan batas frekuensi yang tersedia
frekuensi(i) = minFrekuensi + (minFrekuensi-maksFrekuensi) * rand;
3b. Hitung kecepatan perpindahan kelelawar ke posisi yang baru
kecepatan(i,:) = kecepatan(i,:) + (daftarBat(i,:) - posisiBatTerbaik) * frekuensi(i);
3c. Hitung posisi yang baru dari kelelawar tersebut
posisiBatBaru(i,:) = daftarBat(i,:) + kecepatan(i,:);
3d. Lakukan pengecekan apakah posisi bat yang baru masih berada dalam batas yang diperbolehkan
Jika posisi yang baru ternyata diluar batas yang diperbolehkan,
maka kembalikan posisinya agar masuk dalam batas tersebut
tmpPosisi=posisiBatBaru(i,:); I=tmpPosisiUb; tmpPosisi(J)=Ub(J); posisiBatBaru(i,:)=tmpPosisi;
3e. Tentukan nilai acak untuk dibandingkan dengan parameter rasio pemancaran getaran
Jika nilai acak tersebut lebih dari batas minimal rasio pemancaran getaran,
maka lakukan sedikit pergeseran pada posisi kelelawar tersebut
if rand > rasioPemancaranGetaran posisiBatBaru(i,:) = posisiBatTerbaik + 0.001 * randn(1,jumlahDimensi); end
3f. Hitung nilai fungsi pada posisi yang baru
nilaiFungsiBaru = HitungNilaiFungsi(posisiBatBaru(i,:));
3g. Tentukan nilai acak untuk dibandingkan dengan parameter tingkat kebisingan
Jika nilai fungsi baru lebih baik dari nilai fungsi terbaik kelelawar tersebut,
dan nilai acak tersebut kurang dari batas maksimal tingkat kebisingan,
maka ambil posisi yang baru sebagai posisi terbaik kelelawar tersebut
if (nilaiFungsiBaru > nilaiFungsi(i)) && (rand3h. Kemudian lakukan perbandingan dengan nilai fungsi terbaik
Jika nilai fungsi baru lebih baik dari nilai fungsi terbaik secara umum,
maka ambil posisi yang baru sebagai posisi yang terbaikif nilaiFungsiBaru > nilaiFungsiTerbaik, posisiBatTerbaik = posisiBatBaru(i,:); nilaiFungsiTerbaik = nilaiFungsiBaru; endHasil akhir adalah:
Algoritma BA (Bat Algorithm) Contoh: Mencari posisi dengan pengembalian nilai fungsi maksimal 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 Jumlah Kelelawar = 20 Jumlah maksimal iterasi = 500 Jumlah dimensi = 2 Batas minimal posisi kelelawar = -2 Batas maksimal posisi kelelawar = 2 Batas minimal frekuensi = 0 Batas maksimal frekuensi = 2 Rasio pemancaran getaran = 0.5 Tingkat kebisingan = 0.5 Iterasi: 1, Bat: 9, Posisi terbaik: -0.28702 -0.99751, Nilai Fungsi terbaik: 181.5595 Iterasi: 1, Bat: 12, Posisi terbaik: -0.28832 -0.99605, Nilai Fungsi terbaik: 181.5599 Iterasi: 1, Bat: 13, Posisi terbaik: -0.28825 -0.99557, Nilai Fungsi terbaik: 181.5606 Iterasi: 2, Bat: 4, Posisi terbaik: -0.28749 -0.99523, Nilai Fungsi terbaik: 181.5618 Iterasi: 2, Bat: 12, Posisi terbaik: -0.28686 -0.99496, Nilai Fungsi terbaik: 181.5629 Iterasi: 2, Bat: 16, Posisi terbaik: -0.28559 -0.99465, Nilai Fungsi terbaik: 181.5646 Iterasi: 2, Bat: 19, Posisi terbaik: -0.28423 -0.9943, Nilai Fungsi terbaik: 181.5664 Iterasi: 3, Bat: 1, Posisi terbaik: -0.2818 -0.99543, Nilai Fungsi terbaik: 181.5672 Iterasi: 3, Bat: 2, Posisi terbaik: -0.28129 -0.99493, Nilai Fungsi terbaik: 181.5682 Iterasi: 3, Bat: 3, Posisi terbaik: -0.28025 -0.99489, Nilai Fungsi terbaik: 181.5691 Iterasi: 3, Bat: 5, Posisi terbaik: -0.28049 -0.99461, Nilai Fungsi terbaik: 181.5692 Iterasi: 3, Bat: 6, Posisi terbaik: -0.27991 -0.99345, Nilai Fungsi terbaik: 181.5711 Iterasi: 3, Bat: 20, Posisi terbaik: -0.27864 -0.99403, Nilai Fungsi terbaik: 181.5713 Iterasi: 4, Bat: 5, Posisi terbaik: -0.2805 -0.99232, Nilai Fungsi terbaik: 181.5719 Iterasi: 4, Bat: 14, Posisi terbaik: -0.27764 -0.99205, Nilai Fungsi terbaik: 181.5743 Iterasi: 4, Bat: 20, Posisi terbaik: -0.27735 -0.98934, Nilai Fungsi terbaik: 181.5775 Iterasi: 6, Bat: 7, Posisi terbaik: -0.27653 -0.9894, Nilai Fungsi terbaik: 181.5779 Iterasi: 6, Bat: 12, Posisi terbaik: -0.2759 -0.98877, Nilai Fungsi terbaik: 181.579 Iterasi: 6, Bat: 16, Posisi terbaik: -0.27628 -0.9883, Nilai Fungsi terbaik: 181.5793 Iterasi: 7, Bat: 18, Posisi terbaik: -0.27551 -0.98659, Nilai Fungsi terbaik: 181.5815 Iterasi: 8, Bat: 7, Posisi terbaik: -0.27521 -0.98582, Nilai Fungsi terbaik: 181.5825 Iterasi: 9, Bat: 8, Posisi terbaik: -0.23859 -0.96273, Nilai Fungsi terbaik: 181.5863 Iterasi: 9, Bat: 14, Posisi terbaik: -0.23998 -0.96362, Nilai Fungsi terbaik: 181.5875 Iterasi: 9, Bat: 18, Posisi terbaik: -0.24054 -0.96477, Nilai Fungsi terbaik: 181.5876 Iterasi: 9, Bat: 20, Posisi terbaik: -0.24039 -0.9641, Nilai Fungsi terbaik: 181.5878 Iterasi: 10, Bat: 5, Posisi terbaik: -0.24116 -0.96545, Nilai Fungsi terbaik: 181.5879 Iterasi: 10, Bat: 7, Posisi terbaik: -0.24166 -0.96608, Nilai Fungsi terbaik: 181.5881 Iterasi: 10, Bat: 14, Posisi terbaik: -0.24318 -0.96555, Nilai Fungsi terbaik: 181.5901 Iterasi: 11, Bat: 7, Posisi terbaik: -0.243 -0.96454, Nilai Fungsi terbaik: 181.5904 Iterasi: 11, Bat: 8, Posisi terbaik: -0.24371 -0.96254, Nilai Fungsi terbaik: 181.5922 Iterasi: 11, Bat: 12, Posisi terbaik: -0.24455 -0.96369, Nilai Fungsi terbaik: 181.5925 Iterasi: 11, Bat: 13, Posisi terbaik: -0.24611 -0.96485, Nilai Fungsi terbaik: 181.5933 Iterasi: 11, Bat: 16, Posisi terbaik: -0.24725 -0.96419, Nilai Fungsi terbaik: 181.5947 Iterasi: 11, Bat: 18, Posisi terbaik: -0.24817 -0.96421, Nilai Fungsi terbaik: 181.5955 Iterasi: 12, Bat: 7, Posisi terbaik: -0.25007 -0.96422, Nilai Fungsi terbaik: 181.5969 Iterasi: 12, Bat: 15, Posisi terbaik: -0.25161 -0.96484, Nilai Fungsi terbaik: 181.5976 Iterasi: 13, Bat: 3, Posisi terbaik: -0.25083 -0.9628, Nilai Fungsi terbaik: 181.5983 Iterasi: 13, Bat: 5, Posisi terbaik: -0.25268 -0.96298, Nilai Fungsi terbaik: 181.5994 Iterasi: 13, Bat: 6, Posisi terbaik: -0.25253 -0.96184, Nilai Fungsi terbaik: 181.5999 Iterasi: 13, Bat: 12, Posisi terbaik: -0.25351 -0.96222, Nilai Fungsi terbaik: 181.6003 Iterasi: 13, Bat: 13, Posisi terbaik: -0.25496 -0.96352, Nilai Fungsi terbaik: 181.6004 Iterasi: 13, Bat: 20, Posisi terbaik: -0.25547 -0.96337, Nilai Fungsi terbaik: 181.6007 Iterasi: 14, Bat: 1, Posisi terbaik: -0.2565 -0.96172, Nilai Fungsi terbaik: 181.6022 Iterasi: 14, Bat: 5, Posisi terbaik: -0.25769 -0.96171, Nilai Fungsi terbaik: 181.6027 Iterasi: 14, Bat: 10, Posisi terbaik: -0.25736 -0.96073, Nilai Fungsi terbaik: 181.6031 Iterasi: 15, Bat: 3, Posisi terbaik: -0.25827 -0.95948, Nilai Fungsi terbaik: 181.6042 Iterasi: 15, Bat: 13, Posisi terbaik: -0.25846 -0.95938, Nilai Fungsi terbaik: 181.6043 Iterasi: 16, Bat: 1, Posisi terbaik: -0.25872 -0.95902, Nilai Fungsi terbaik: 181.6046 Iterasi: 16, Bat: 8, Posisi terbaik: -0.25204 -0.92771, Nilai Fungsi terbaik: 181.6088 Iterasi: 16, Bat: 11, Posisi terbaik: -0.25263 -0.92834, Nilai Fungsi terbaik: 181.6093 Iterasi: 16, Bat: 13, Posisi terbaik: -0.25268 -0.92732, Nilai Fungsi terbaik: 181.6093 Iterasi: 16, Bat: 15, Posisi terbaik: -0.25372 -0.92891, Nilai Fungsi terbaik: 181.6101 Iterasi: 17, Bat: 9, Posisi terbaik: -0.255 -0.92872, Nilai Fungsi terbaik: 181.611 Iterasi: 17, Bat: 11, Posisi terbaik: -0.25556 -0.92975, Nilai Fungsi terbaik: 181.6114 Iterasi: 17, Bat: 12, Posisi terbaik: -0.25583 -0.93023, Nilai Fungsi terbaik: 181.6115 Iterasi: 17, Bat: 13, Posisi terbaik: -0.25588 -0.93021, Nilai Fungsi terbaik: 181.6116 Iterasi: 18, Bat: 1, Posisi terbaik: -0.25614 -0.92991, Nilai Fungsi terbaik: 181.6118 Iterasi: 18, Bat: 6, Posisi terbaik: -0.25655 -0.92934, Nilai Fungsi terbaik: 181.612 Iterasi: 18, Bat: 11, Posisi terbaik: -0.25695 -0.93067, Nilai Fungsi terbaik: 181.6122 Iterasi: 19, Bat: 10, Posisi terbaik: -0.25756 -0.93073, Nilai Fungsi terbaik: 181.6126 Iterasi: 19, Bat: 11, Posisi terbaik: -0.25925 -0.93155, Nilai Fungsi terbaik: 181.6134 Iterasi: 20, Bat: 6, Posisi terbaik: -0.25963 -0.93204, Nilai Fungsi terbaik: 181.6135 Iterasi: 20, Bat: 7, Posisi terbaik: -0.26024 -0.93093, Nilai Fungsi terbaik: 181.6139 Iterasi: 20, Bat: 13, Posisi terbaik: -0.26243 -0.92947, Nilai Fungsi terbaik: 181.6148 Iterasi: 22, Bat: 9, Posisi terbaik: -0.26454 -0.92851, Nilai Fungsi terbaik: 181.6155 Iterasi: 22, Bat: 15, Posisi terbaik: -0.26493 -0.92854, Nilai Fungsi terbaik: 181.6156 Iterasi: 22, Bat: 18, Posisi terbaik: -0.26645 -0.92727, Nilai Fungsi terbaik: 181.616 Iterasi: 23, Bat: 16, Posisi terbaik: -0.26724 -0.92777, Nilai Fungsi terbaik: 181.6161 Iterasi: 24, Bat: 1, Posisi terbaik: -0.26765 -0.92772, Nilai Fungsi terbaik: 181.6162 Iterasi: 24, Bat: 8, Posisi terbaik: -0.26885 -0.92627, Nilai Fungsi terbaik: 181.6164 Iterasi: 24, Bat: 9, Posisi terbaik: -0.27033 -0.92601, Nilai Fungsi terbaik: 181.6164 Iterasi: 24, Bat: 11, Posisi terbaik: -0.27144 -0.92445, Nilai Fungsi terbaik: 181.6165 Iterasi: 24, Bat: 12, Posisi terbaik: -0.27032 -0.92363, Nilai Fungsi terbaik: 181.6165 Iterasi: 24, Bat: 17, Posisi terbaik: -0.27072 -0.92355, Nilai Fungsi terbaik: 181.6165 Iterasi: 29, Bat: 12, Posisi terbaik: -0.2708 -0.92342, Nilai Fungsi terbaik: 181.6165 Iterasi: 30, Bat: 4, Posisi terbaik: -0.271 -0.92307, Nilai Fungsi terbaik: 181.6165 Iterasi: 35, Bat: 19, Posisi terbaik: -0.27072 -0.92294, Nilai Fungsi terbaik: 181.6165 Iterasi: 61, Bat: 16, Posisi terbaik: -0.27093 -0.92286, Nilai Fungsi terbaik: 181.6165 Iterasi: 63, Bat: 16, Posisi terbaik: -0.27083 -0.92306, Nilai Fungsi terbaik: 181.6165 Posisi Terbaik: -0.27083 -0.92306 Nilai Fungsi Terbaik =181.6165Contoh modul / source code menggunakan Matlab 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.
ka, cara bikin grafiknya yg diplot itu nilai apa ya? hehe makasih
BIasanya yang di plot adalah variabel nilai fungsi terbaik.Jadi pada saat masing-masing iterasi, nilai fungsi terbaik disimpan dalam variabel tertentu dan dijadikan sebagai variabel output dari inti algoritma (BA.m). Selanjutnya pada program utama (main.m), variabel ini kemudian dapat digunakan untuk menghasilkan grafik sesuai yang anda inginkan.
ka boleh kasih contoh cara plotnya dalam bentuk 2-D atau 3-D? terimakasih
Jika anda lihat pada file BA.m, nilai fungsi ditampung pada variabel
nilaiFungsiTerbaik
. Anda kemudian dapat menyimpan nilai ini pada variabel lain, misalnyap(iterasi) = nilaiFungsiTerbaik
. Pada main.m, variabelp
kemudian dapat digunakan untuk menghasilkan plot, misalnya sepertiplot(p,'-k');
. Kemudian anda dapat memberikan label dan judul pada plot, misalnya seperti inixlabel('Iterasi');ylabel('Nilai Fungsi');title('BA');
Bang minta Source buat bikin Plot nya dong . Soalnya bingung mau bikin plot nya dari mana
Untuk melakukan plot anda hanya perlu untuk menyimpan nilai fungsi terbaik yang didapatkan dari masing-masing iterasi. Diakhir (bagian penutup) dari perulangan ini
for iterasi = 1:jumlahIterasi
Anda dapat menambahkan contoh skrip seperti ini
p(iterasi) = nilaiFungsiTerbaik;
Sehingga p memiliki isi nilai fungsi terbaik dari setiap iterasi. Selanjutnya masukkan p sebagai salah satu output fungsi BA, dan kemudian tambahkan skrip untuk plot pada file main.m, misalnya seperti ini
figure; plot(p,'-k');
xlabel('Iterasi');ylabel('Nilai Fungsi');title('BA');
Bang saya udh coba tpi tetap gak bisa. Mungkin saya gk bisa meletakan source yg benar
Skrip ini seharusnya masih berjalan baik. Jika terdapat kesalahan maka kesalahan apakah yang terjadi? Mungkin kesalahan tersebut disebabkan karena versi Matlab yang anda gunakan terlalu lampau.
Versi matlab inj yang udh versi terbaru . Saya udh coba source yang anda berikan di komentar atas . Tetap saja tidak bisa memunculkan plot nya . Mohon panduan detainya terimakasih .
Apakah anda sudah menyertakan nilai p sebagai salah satu output dari file BA? Jika tidak maka tentu saja nilai p akan bernilai kosong pada saat pembuatan plot
Cara mengkonversikan kode matlab ke python gimana ya ka ?
Tidak ada cara instan untuk mengkonversikan kode matlab ke python. Anda harus memahami konsep algoritma ini terlebih dahulu sebelum mengkonversikan skrip secara baris per baris dan melakukan penyesuaian yang diperlukan. Skrip ini dirancang dengan tidak bergantung pada library apapun yang tersedia pada perangkat lunak sehingga dapat dikonversikan ke dalam bahasa apapun setelah anda memahami konsep dasar algoritma ini.