Algoritma FPAO (Flower Pollination Algorithm 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 penyerbukan bunga oleh serangga yang ada di alam semesta. Serangga akan berpindah dari bunga ke bunga lain untuk membantu penyerbukan bunga. Tentu saja bunga yang berpenampilan lebih baik akan dipilih oleh sebuah serangga untuk dihinggapi daripada bunga yang berpenampilan kurang baik.



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 serangga yang digunakan
Nilai yang direkomendasikan adalah 10 sampai dengan 25
Diasumsikan dalam kasus ini, hanya digunakan 10 serangga untuk mempercepat perhitungan

jumlahSerangga = 10;

* Tentukan probabilitas serangga berpindah ke bunga (titik) yang lain
Diasumsikan dalam kasus ini nilai probabilitas berpindah adalah 0.8
Sehingga serangga hanya memiliki kemungkinan 20% untuk berpindah ke bunga yang baru

probPindah = 0.8;

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


Langkah-langkah penggunaan algoritma ini adalah

* Lakukan proses perhitungan dengan metode FPAO (Flower Pollination Algorithm Optimization)
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 1 – 3)

[posisiSeranggaTerbaik, nilaiFungsiTerbaik] = FPAO(jumlahSerangga, probPindah, jumlahIterasi, jumlahDimensi, Lb, Ub);

Memasuki perhitungan pada fungsi FPAO

1. Lakukan inisialisasi serangga pada posisi acak,
Kemudian hitung nilai fungsi pada posisi tersebut
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini

for i = 1:n,
    daftarSerangga(i,:) = Lb + (Ub-Lb).* rand(1,jumlahDimensi);
    nilaiFungsi(i) = HitungNilaiFungsi(daftarSerangga(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] = min(nilaiFungsi);
posisiSeranggaTerbaik = daftarSerangga(I,:);
daftarSeranggaTerbaik = daftarSerangga; 

3. Lakukan perhitungan sebanyak jumlah iterasi
Kemudian pada masing-masing iterasi, lakukan perhitungan pada masing-masing serangga (poin 3a – 3e)

for iterasi = 1:jumlahIterasi,
	for i = 1:n,
	. . .

3a. Tentukan nilai acak antara 0 sampai dengan 1
Kemudian bandingkan apakah nilai nya lebih dari probabilitas serangga berpindah
Jika benar, maka serangga ini siap melakukan proses penyerbukan bunga ke tempat yang lain (poin 3a1 – 3a3)

if rand > p,
. . .

3a1. Hitung jarak terbang yang harus ditempuh serangga tersebut dengan menggunakan fungsi Levy
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini

L = Levy(jumlahDimensi);

* Gunakan fungsi ini untuk menghitung jarak terbang serangga
Rumus yang digunakan adalah:
x_i ^ {t+1} = x_i ^ t + L(x_i ^ t-gbest)

function L=Levy(d)
beta=3/2;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,d)*sigma;
v=randn(1,d);
step=u./abs(v).^(1/beta);
L=0.01*step; 

3a2. Setelah menentukan jarak terbang, maka lakukan perhitungan posisi yang baru
Kemudian catat posisi terbaik untuk serangga tersebut

dS=L.*(daftarSerangga(i,:)-posisiSeranggaTerbaik);
daftarSeranggaTerbaik(i,:)=daftarSerangga(i,:)+dS;

3a3. Lakukan pengecekan apakah posisi serangga 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=daftarSeranggaTerbaik(i,:);

I=tmpPosisiUb;
tmpPosisi(J)=Ub(J);

daftarSeranggaTerbaik(i,:)=tmpPosisi;

3b. Jika nilai acak sebelumnya kurang dari probabilitas serangga berpindah
maka serangga hanya melakukan perpindahan ke bunga disekitar bunga awal (poin 3b1 – 3b4)

. . .
else
. . .

3b1. Tentukan epsilon, yaitu nilai yang sangat kecil antara 0 sampai dengan 1

epsilon=rand;

3b2. Tentukan 2 indeks serangga acak untuk digunakan pada perhitungan berikutnya
Perhitungan ini bisa saja mengembalikan indeks serangga diri sendiri

JK=randperm(n);

3b3. Hitung posisi serangga yang baru dengan rumus
x_i ^ {t+1} + epsilon * (x_j ^ t – x_k ^ t)

daftarSeranggaTerbaik(i,:)=daftarSeranggaTerbaik(i,:)+epsilon*(daftarSerangga(JK(1),:)-daftarSerangga(JK(2),:));

3b4. Sama seperti perhitungan sebelumnya,
lakukan pengecekan apakah posisi serangga 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=daftarSeranggaTerbaik(i,:);

I=tmpPosisiUb;
tmpPosisi(J)=Ub(J);

daftarSeranggaTerbaik(i,:)=tmpPosisi;

3c. Hitung nilai fungsi pada posisi yang baru

nilaiFungsiBaru = HitungNilaiFungsi(daftarSeranggaTerbaik(i,:));

3d. Jika nilai fungsi baru lebih baik dari nilai fungsi terbaik serangga tersebut,
maka ambil posisi yang baru sebagai posisi terbaik serangga tersebut

if (nilaiFungsiBaru > nilaiFungsi(i)),
	daftarSerangga(i,:) = daftarSeranggaTerbaik(i,:);
	nilaiFungsi(i) = nilaiFungsiBaru;
end

3e. Jika nilai fungsi baru lebih baik dari nilai fungsi terbaik secara umum,
maka ambil posisi yang baru sebagai posisi yang terbaik

if nilaiFungsiBaru > nilaiFungsiTerbaik,
	posisiSeranggaTerbaik = daftarSeranggaTerbaik(i,:)   ;
	nilaiFungsiTerbaik = nilaiFungsiBaru   ;

	disp(['Iterasi: ', num2str(iterasi), ...
		', Serangga: ', num2str(i), ...
		', Posisi terbaik: ', num2str(posisiSeranggaTerbaik), ...
		', Nilai Fungsi terbaik: ', num2str(nilaiFungsiTerbaik)]);
end


Hasil akhir adalah:

Algoritma FPAO (Flower Pollination Algorithm Optimization)
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 Serangga                      = 10
Probabilitas berpindah ke bunga lain = 0.8
Jumlah maksimal iterasi              = 500
Jumlah dimensi                       = 2
Batas minimal posisi bunga           = -2
Batas maksimal posisi bunga          = 2


Iterasi: 1, Serangga: 1, Posisi terbaik: 1.2577        1.74, Nilai Fungsi terbaik: 66.3237
Iterasi: 1, Serangga: 2, Posisi terbaik: -1.6134      1.6655, Nilai Fungsi terbaik: 79.4133
Iterasi: 1, Serangga: 3, Posisi terbaik: -0.2121   -0.093823, Nilai Fungsi terbaik: 173.9643
Iterasi: 10, Serangga: 6, Posisi terbaik: 0.29824     -1.1436, Nilai Fungsi terbaik: 174.4092
Iterasi: 11, Serangga: 9, Posisi terbaik: -0.40943    -0.37694, Nilai Fungsi terbaik: 178.4629
Iterasi: 17, Serangga: 5, Posisi terbaik: -0.34098     -1.4178, Nilai Fungsi terbaik: 179.7455
Iterasi: 27, Serangga: 8, Posisi terbaik: -0.38114     -1.3224, Nilai Fungsi terbaik: 180.0067
Iterasi: 27, Serangga: 10, Posisi terbaik: -0.1215       -0.68, Nilai Fungsi terbaik: 180.4214
Iterasi: 28, Serangga: 10, Posisi terbaik: -0.23042     -1.0621, Nilai Fungsi terbaik: 181.4551
Iterasi: 36, Serangga: 10, Posisi terbaik: -0.26656     -0.9765, Nilai Fungsi terbaik: 181.5937
Iterasi: 65, Serangga: 10, Posisi terbaik: -0.27131    -0.96148, Nilai Fungsi terbaik: 181.6042
Iterasi: 76, Serangga: 9, Posisi terbaik: -0.27441    -0.95798, Nilai Fungsi terbaik: 181.6055
Iterasi: 79, Serangga: 9, Posisi terbaik: -0.273    -0.94917, Nilai Fungsi terbaik: 181.6105
Iterasi: 81, Serangga: 9, Posisi terbaik: -0.26911    -0.94614, Nilai Fungsi terbaik: 181.6122
Iterasi: 105, Serangga: 2, Posisi terbaik: -0.27301    -0.94051, Nilai Fungsi terbaik: 181.6137
Iterasi: 106, Serangga: 7, Posisi terbaik: -0.27053    -0.93975, Nilai Fungsi terbaik: 181.6142
Iterasi: 106, Serangga: 8, Posisi terbaik: -0.27533    -0.93301, Nilai Fungsi terbaik: 181.615
Iterasi: 114, Serangga: 8, Posisi terbaik: -0.27252    -0.93161, Nilai Fungsi terbaik: 181.6158
Iterasi: 116, Serangga: 9, Posisi terbaik: -0.2733    -0.93036, Nilai Fungsi terbaik: 181.6158
Iterasi: 117, Serangga: 6, Posisi terbaik: -0.27339    -0.91949, Nilai Fungsi terbaik: 181.6163
Iterasi: 118, Serangga: 10, Posisi terbaik: -0.27111    -0.92229, Nilai Fungsi terbaik: 181.6165
Iterasi: 152, Serangga: 10, Posisi terbaik: -0.27063    -0.92242, Nilai Fungsi terbaik: 181.6165
Iterasi: 164, Serangga: 10, Posisi terbaik: -0.271    -0.92297, Nilai Fungsi terbaik: 181.6165
Iterasi: 214, Serangga: 10, Posisi terbaik: -0.27075    -0.92287, Nilai Fungsi terbaik: 181.6165
Iterasi: 215, Serangga: 6, Posisi terbaik: -0.2709    -0.92292, Nilai Fungsi terbaik: 181.6165
Iterasi: 215, Serangga: 10, Posisi terbaik: -0.27083    -0.92298, Nilai Fungsi terbaik: 181.6165
Iterasi: 242, Serangga: 10, Posisi terbaik: -0.27086    -0.92298, Nilai Fungsi terbaik: 181.6165
Iterasi: 266, Serangga: 10, Posisi terbaik: -0.27082    -0.92301, Nilai Fungsi terbaik: 181.6165
Iterasi: 270, Serangga: 10, Posisi terbaik: -0.27083    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 279, Serangga: 6, Posisi terbaik: -0.27084    -0.92302, Nilai Fungsi terbaik: 181.6165
Iterasi: 284, Serangga: 7, Posisi terbaik: -0.27083    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 296, Serangga: 2, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 306, Serangga: 2, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 368, Serangga: 2, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 391, Serangga: 3, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 403, Serangga: 2, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 425, Serangga: 5, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 443, Serangga: 5, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165
Iterasi: 465, Serangga: 8, Posisi terbaik: -0.27084    -0.92304, Nilai Fungsi terbaik: 181.6165


Posisi Terbaik: -0.27084    -0.92304
Nilai Fungsi Terbaik =181.6165


Contoh modul / source code menggunakan Matlab dapat didownload disini:

[sdm_download id=”1801″ fancy=”0″]



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.