Algoritma BA (Bat Algorithm) 12


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.
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.



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)) && (rand

3h. 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 terbaik

if nilaiFungsiBaru > nilaiFungsiTerbaik,
	posisiBatTerbaik = posisiBatBaru(i,:);
	nilaiFungsiTerbaik = nilaiFungsiBaru;
end


Hasil 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.6165


Contoh 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.


Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

12 pemikiran di “Algoritma BA (Bat Algorithm)

    • pip Penulis

      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.

        • pip Penulis

          Jika anda lihat pada file BA.m, nilai fungsi ditampung pada variabel nilaiFungsiTerbaik. Anda kemudian dapat menyimpan nilai ini pada variabel lain, misalnya p(iterasi) = nilaiFungsiTerbaik. Pada main.m, variabel p kemudian dapat digunakan untuk menghasilkan plot, misalnya seperti plot(p,'-k');. Kemudian anda dapat memberikan label dan judul pada plot, misalnya seperti ini xlabel('Iterasi');ylabel('Nilai Fungsi');title('BA');

    • pip Penulis

      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');

        • pip Penulis

          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.

        • Fauzan

          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 .

        • pip Penulis

          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

    • pip Penulis

      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.