Anda di halaman 1dari 23

ALGORITMA OPTIMASI : ALGORITMA DYNAMIC PROGRAMMING DAN

TABU SEARCH
Lutfi Hakim [2216202001]
Magister Telematika, Departemen Teknik Elektro, Fakultas Teknologi Elektro
Institut Teknologi Sepuluh Nopember Surabaya
Email: lutfi.hakim3003@gmail.com - lutfi.hakim16@mhs.its.ac.id

I. PENDAHULUAN
Kehidupan di dunia tak ubahnya membutuhkan suatu keseimbangan. Begitu halnya
dengan permasalahan. Dalam menjalani kehidupan di dunia, tak lepas dari dihadapkan
suatu permasalahan. Baik permasalahan yang ringan atau yang kompleks sekalipun.
Sebagai contoh transportasi yang mencakup pendistribusian suatu komoditas atau produk
dari produsen kepada berbagai tujuan. Tentunya suatu perusahaan pasti menginginkan
keuntungan dalam setiap transaksinya dengan menekan pengeluaran seminimum
mungkin, salah satunya dalam kegiatan distribusi komoditas. Perusahaan kecil seperti
usaha mebel mungkin tidak bingung melakukan scheduling pengiriman barang ini. Tapi
bagaimana dengan perusahaan besar seperti pertamina yang memiliki jumlah kendaraan,
driver dan SPBU yang sangat banyak yang terdistribusi di setiap daerah? Belum juga
dihadapkan dengan permasalahan rute jalan yang kompleks, karakteristik jalan yang
menanjak, kemacetan, efektifitas pengiriman. Tentunya akan sangat kewalahan jika
membuat scheduling secara manual. Entah membutuhkan waktu yang lama, jadwal yang
belum tentu akurat dan efektif, bentrok, biaya yang dikeluarkan relatif besar sekali
pengiriman dan lain sebagainya. Hal ini mungkin bisa terjadi karena satu akomodasi tidak
dijadwalkan dengan rute yang efektif. Misalkan Depo Tuban harus mengirimkan bahan
bakar ke Banyuwangi, dan lain sebagainya. Namun permasalahan tersebut dalam
dilakukan dengan mudah, efektif dan mungkin bisa menekan kuantitas pengeluaran yang
harus ditanggung oleh perusahaan. Salah satu jawabannya adalah dengan membuat sistem
scheduling menggunakan algoritma optimasi.
Setiap algoritma memiliki kelebihan dan kekurangan masing-masing dalam
menyelesaikan permasalahan. Hal ini dikarenakan tidak ada satupun algoritma yang
berlaku umum dan bisa digunakan untuk menyelesaikan semua jenis permasalahan.
Algoritma optimasi ini merupakan jenis algoritma untuk memaksimalkan solusi sebuah
permasalahan agar didapatkan sebuah hasil dan proses yang optimal. Menurut para ahli
algoritma optimasi terbagi menjadi dua, yakni algoritma deterministik dan probabilistik.
Perbedaan yang mendasar dari kedua jenis algoritma optimasi ini adalah setiap langkah
eksekusi di dalam algoritma optimasi deterministik hanya terdapat satu jalan untuk
diproses, namun jika tidak ada jalan makan algoritma dianggap selesai. Dengan demikian
algoritma ini selalu menghasilkan solusi yang tetap untuk suatu input yang diberikan.
Biasanya algoritma ini digunakan untuk suatu permasalahan dengan skala yang tidak
terlalu besar. Lain halnya dengan Algoritma Optimasi Probabilistik. Algoritma ini
digunakan untuk menyelesaikan masalah dengan ruang solusi yang lebih besar, bahkan
tak terbatas. Algoritma ini berusahan untuk menemukan solusi yang bagus tanpa melebihi
batasan waktu yang telah ditentukan. Solusi yang bagus ini belum tentu yang paling
optimal, namun sudah dapat diterima oleh user.
Algoritma deterministik dan probabilistik memiliki banyak turunan. Masing-
masing turunan memiliki karakteristik dan penggunaan yang berbeda-beda. Pada makalah
ini membahas mengenai dua jenis algoritma ini, namun hanya memilih masing-masing
satu sample algoritma per sample jenis algoritma optimasi. Algoritma optimasi
deterministik diwakilkan dengan algoritma Dynamic Programming, sedangkan algoritma
optimasi probabilistik diwakilkan dengan algoritma Tabu Search.

II. PEMBAHASAN
1. Algoritma Dynamic Programming
Dynamic Programming adalah salah satu jenis algoritma optimasi deterministik.
Algoritma ini mengandung prosedur matematis yang dirancang untuk memperbaiki
efisiensi perhitungan masalah matematis tertentu. Perbaikan ini dengan cara
menguraikan masalah tersebut menjadi bagian-bagian yang lebih kecil, sehingga
perhitungan tersebut dapat dilakukan dengan lebih sederhana. Permasalahan yang
diselesaikan dengan menggunakan algoritma ini dibagi dalam tahap-tahap. Setiap
tahap tersebut mewakili kemungkinan kapasitas dari setiap masalah yang diselesaikan.
Sedangkan banyaknya tahap yang terbagi ditentukan pada pendefinisian awal dynamic
programming. Selanjutnya kemungkinan kapasitas dimulai dengan mengambil
kemungkinan kapasistas minimal (bisa disebut 0) hingga kemungkinan kapasitas
maksimal (kemungkinan kapasitas yang tersedia). Sehingga programmer menentukan
sendiri tahap-tahapan yang terbagi dan kapasitas yang diinginkan.
Istilah dynamic programming didasarkan pada kecenderungan metode ini dalam
menganalisa dan mendokumentasikan hasil perhitungan pada setiap tahapnya. Pada
dasarnya, penerapan algoritma ini bertujuan untuk optimalisasi suatu permasalahan.
Seperti permasalahan yang dapat mempunyai banyak kemungkinan solusi. Masing-
masing solusi mempunyai sebuah nilai, dan berharap untuk menemukan sebuah solusi
dengan nilai yang optimal (minimum atau maksimum). Penyebutan solusi yang
optimal terhadap suatu permasalahan ini dikarenakan dari solusi tersebut mungkin
menjadi beberapa solusi yang dapat mencapai nilai optimal. Pemecahan masalah
dengan menggunakan dynamic programming mempunyai empat tahapan, diantaranya:
a. Menggolongkan struktur sebuah solusi optimal.
b. Pendefinisian nilai sebuah solusi yang optimal dengan semua kondisi dan
keadaan yang memungkinkan (secara recursive)
c. Menghitung nilai sebuah solusi optimal, biasanya dalam mode bawah-atas
(mundur dari tahapan terakhir dan memecahkan tiap tahap).
d. Mengkontruksi sebuah solusi optimal dari informasi yang dihitung. Solusi
optimal dari permasalahan didapatkan jika semua tahap sudah terpecahkan.
Langkah 1-3 bentuk dasar dari sebuah solusi dynamic programming terhadap
sebuah masalah. Langkah nomor 4 dapat terlewati jika hanya dibutuhkan satu nilai
solusi optimal, dan bukan solusi itu sendiri. Saat melakukan langkah 4, seringkali
memelihara informasi tambahan selama langkah 3sehingga dapat dengan mudah untuk
mengkonstruksi sebuah solusi yang optimal.

1.1. Model Dynamic Programming


Seperti pada penjelasan sebelumnya bahwa dalam penerapan dynamic
programming dilakukan dalam beberapa tahap dengan membagi masalah menjadi sub
masalah. Setiap dari sub masalah ini kemudian dipertimbangkan secara terpisah.
Tujuannya adalah untuk mengurangi jumlah dan tingkat kerumitan dalam melakukan
perhitungan. Namun hal yang menjadi persoalan adalah semua masalah tersebut
memiliki sifat saling ketergantungan, sehingga untuk mengatasinya harus dipikirkan
sebuah prosedur untuk menghubungkan perhitungan tersebut. Prosedur tersebut
tentunya menjamin bahwa pemecahan yang layak untuk masing-masing tahap juga
berlaku untuk keseluruhan masalah yang terbagi dari beberapa sub tersebut.
Sebuah tahap dalam dynamic programming didefinisikan sebagai bagian dari
masalah yang memiliki beberapa alternatif yang saling menggantikan, sehingga
terpilih sebuah alternatif terbaik. Secara praktis, gagasan dasar algoritma ini yakni
menghilangkan pengaruh saling ketergantungan antar tahap. Hal ini dilakukan dengan
menghubungkan definisi suatu keadaan dengan setiap tahap. Suatu keadaan biasanya
didefinisikan untuk menunjukkan suatu batasan yang mengikat semua tahap secara
bersama-sama. Setiap keputusan atau solusi yang dipilih secara optimal pada algoritma
ini, tanpa memperhitungkan keputusan yang diambil sebelumnya. Sifat ini adalah
prinsip dasar optimalisasi yang merupakan dasar untuk keabsahan dalam melakukan
perhitungan dynamic programming.
Ada dua pendekatan pada dynamic programming, yakni program dinamis maju
(forward atau up-down) dan program dinamis mundur (backward atau button-up).
Untuk memahami kedua pendekatan ini, kita berikan contoh pada kasus berikut.
Misalkan x1, x2, ... xn menyatakan peubah (variabel) keputusan yang dibuat masing-
masing untuk tahap 1,2, ..., n. Maka:
• Program dinamis maju bergerak mulai dari tahap 1, selanjutnya menuju ke tahap
2,4 dan seterusnya hingga tahap n. Runtutan peubah keputusannya adalah x1, x2,
... , xn.
• Program dinamis mundur bergerak mulai dari tahap n menuju ke tahap n-1, n-2
dan seterusnya hingga tahap 1. Runtutan peubah keputusannya adalah xn, xn-1, ...
, x1.

1.2. Karakteristik Dynamic Programming


Setiap algoritma pemrograman tentunya memiliki karakteristik unik. Dynamic
programming memiliki beberapa karakteristik, diantaranya:
• Permasalahan dibagi menjadi stage, dengan keputusan diperlukan pada tiap
stage
• Tiap stage mempunyai nomor stage yang saling berhubungan. Hasil dari setiap
stage ini ditransformasikan pada stage lainnya.
• Prosedur penjelasannya dirancang untuk mendapatkan hasil yang optimal.
• Hasil optimal dari suatu stage tidak berhubungan dengan stage sebelumnya.
• Prosedur penyelesainnya diawali dari stage terakhir.
1.3. Penerapan Algoritma Dynamic programming
Untuk memahami implementasi algoritma Dynamic Programming, makalah ini
memberikan contoh pada permasalahan Knapsack. Knapsack adalah salah satu
permasalahan optimasi. Prinsipnya bagaimana cara seseorang dapat membawa
sejumlah barang yang tidak melebihi kapasitas, tetapi dengan nilai barang yang paling
tinggi. Ada tiga variasi dasar dari permasalahan knapsack, yaitu
▪ UKP (Unbounded Knapsack Problem). Dalam variasi ini, semua benda
diasumsikan memiliki jumlah tidak terbatas, sehingga sebuah barang dapat
dimasukkan ke dalam ransel dengan jumlah berapapun selama masih memenuhi
batas kapasitas ransel.
▪ 0/1 (0/1 Knapsack Problem). Dalam variasi ini, semua benda diasumsikan
memiliki jumlah 1, sehingga perhitungan yang dilakukan akan menentukan
sebuah barang masuk/tidak masuk ke dalam ransel.
▪ BKP (Bounded Knapsack Problem). Dalam variasi ini, semua benda
diasumsikan memiliki batas sendiri-sendiri, sehingga sebuah barang yang masuk
ke dalam ransel harus memenuhi batas jumlah tersebut.
Dalam kehidupan nyata, kasus BKP adalah kasus yang paling nyata, sehingga
paling banyak digunakan dalam bidang lain. Dalam implementasinya, dari ketiga
variasi di atas, Variasi BKP yang paling cocok diterapkan menggunakan Algoritma
Dinamic Programming.
Diketahui sebuah permasalahan bahwa, diasumsikan ada 10 buku yang dapat
dibawa ke dalam sebuah knapsack. Semua buku tersebut diasumsikan memiliki batas
jumlah sendiri-sendiri. Diasumsikan data buku yang tersedia adalah sebagai berikut.
Nama Barang Berat Nilai Jumlah
Buku A 25 30 1

Buku B 27 20 2

Buku C 19 15 4

Buku D 33 35 3

Buku E 27 25 3

Buku F 29 40 2
Buku G 32 30 4

Buku H 38 50 1

Buku I 37 40 1

Buku J 21 20 2

Syntax dari contoh data buku tersebut adalah sebagai berikut.


Dim boundedBarangs = New List(Of BoundedBarang)() From { _
New BoundedBarang ("Buku A", 25, 30, 1), _
New BoundedBarang ("Buku B", 27, 20, 2), _
New BoundedBarang ("Buku C", 19, 25, 4), _
New BoundedBarang ("Buku D", 33, 35, 3), _
New BoundedBarang ("Buku E", 27, 25, 3), _
New BoundedBarang ("Buku F", 29, 40, 2), _
New BoundedBarang ("Buku G", 32, 30, 4), _
New BoundedBarang ("Buku H", 38, 50, 1), _
New BoundedBarang ("Buku I", 37, 40, 1), _
New BoundedBarang ("Buku J", 21, 20, 2) _
}
Agar dapat menjalankan syntax di atas, maka diperlukan 2 Class yaitu Class
BoundedBarang untuk menampung semua data barang seperti nama, berat, nilai dan
batas jumlah sebuah barang; serta Class daftarBoundedBarang untuk menampung
semua jawaban barang beserta total berat dan total nilai. Deklarasi kedua Class
tersebut sebagai berikut.
Public Class BoundedBarang
Public namaBarang As String
Public berat As Integer
Public nilai As Integer
Public jumlahBarang As Integer

Public Sub New(namaBarang As String, berat As Integer, nilai As Integer, jumlahBarang As


Integer)
Me.namaBarang = namaBarang
Me.berat = berat
Me.nilai = nilai
Me.jumlahBarang = jumlahBarang
End Sub
End Class

Public Class daftarBoundedBarang


Public Isi As New Dictionary(Of String, Integer)()
Public totalNilai As Integer
Public totalBerat As Integer

Public Sub TambahBarang(Barang As BoundedBarang, jumlahBarang As Integer)


If Isi.ContainsKey(Barang.namaBarang) Then
Isi(Barang.namaBarang) += jumlahBarang
Else
Isi(Barang.namaBarang) = jumlahBarang
End If
totalNilai += jumlahBarang * Barang.nilai
totalBerat += jumlahBarang * Barang.berat
End Sub

Public Function salinDaftar() As daftarBoundedBarang


Dim ic = New daftarBoundedBarang()
ic.Isi = New Dictionary(Of String, Integer)(Me.Isi)
ic.totalNilai = Me.totalNilai
ic.totalBerat = Me.totalBerat
Return ic
End Function
End Class
Sebelum masuk ke dalam langkah-langkah pembahasan algoritma, ada beberapa
konstanta atau parameter yang harus diketahui, yaitu menentukan kapasistas knapsack
yang ada. Diasumsikan kapasitasnya adalah 100 satuan.
Const boundedKapasitas As Integer = 100
Langkah-langkah penggunaan algoritma Dyanamic Programming adalah
sebagai berikut:
1) Lakukan perulangan untuk setiap kapasistas (j) pada semua barang (i). Jika
kapasistas ke j lebih dari berat barang ke i, maka lakukan perhitungan berikutnya.
For i As Integer = 0 To boundedBarangs.Count - 1
For j As Integer = boundedKapasitas To 0 Step -1
If j >= boundedBarangs(i).berat Then
...
2) Tentukan jumlah barang, yaitu nilai minimal antara batas minimal setiap barang
atau nilai kapasitas ke j/berat barang.
Dim jumlahBarang As Integer = Math.Min(boundedBarangs(i).jumlahBarang,
Math.Truncate (j / boundedBarangs(i).berat))

3) Lakukan perulangan pada setiap jumlah barang yang ditemukan.


▪ Catat barang pada kapasitas ke j - (jumlah Barang * berat barang)
Dim tmpDaftarBoundedBarang As daftarBoundedBarang = daftarBoundedBarangs (j -
k * boundedBarangs(i).berat)
▪ Catat akumulasi nilai, yaitu total nilai + (jumlah Barang*nilai barang)
Dim tmpnilai As Integer = tmpDaftarBoundedBarang.totalNilai + k *
boundedBarangs(i).nilai
▪ Apabila akumulasi nilai masih lebih dari total nilai, maka masukkan barang ini
sejumlah Barang ke dalam hasil jawaban
If tmpnilai > daftarBoundedBarangs(j).totalNilai Then
daftarBoundedBarangs(j) = tmpDaftarBoundedBarang.salinDaftar()
daftarBoundedBarangs(j).TambahBarang(boundedBarangs(i), k)
End If

4) Tampilkan hasil perhitungan akhir pada layar.


Console.WriteLine("Hasil Perhitungan: ")
Console.WriteLine("Total Berat: " &
daftarBoundedBarangs(boundedKapasitas).totalBerat)
Console.WriteLine("Total Nilai: " & daftarBoundedBarangs(boundedKapasitas).totalNilai)
Console.WriteLine()
Console.WriteLine("Isi Knapsack:")
For Each kvp As KeyValuePair(Of String, Integer) In
daftarBoundedBarangs(boundedKapasitas).Isi
Console.WriteLine(kvp.Key & " (" & kvp.Value & " buah)")
Next
Sehingga hasil akhir dari permasalahan di atas adalah sebagai berikut.

2. Algoritma Tabu Search


Metode algoritma Tabu Search merupakan salah satu algoritma single-solution
berdasarkan metode metaheuristik tingkat tinggi yang dilandaskan pada pencarian
lokal dan dipakai untuk menyelesaikan permasalahan optimasi kombinatorial
[Glover,1986]. Algoritma ini diperkenalkan oleh Fred Glover tahun 1986. Algoritma
Tabu Search berprinsip pada penggunaan memori sebagai elemen esensial dalam
pencariannya. Algoritma ini tidak hanya menyimpan nilai sebuah solusi terbaik seperti
kebanyakan metode algoritma pencarian, namun juga menyimpan informasi selama
pencarian melalui solusi terakhir yang dikunjungi.
Glover mengatakan bahwa prosedur Algoritma Tabu Search mempunyai tiga
pola atau skema penting, diantaranya:
a. Adanya penggunaan struktur memori berbasiskan atribut-atribut yang
fleksibel, yang memungkinkan sebuah kriteria evaluasi dan hasil pencarian
informasi historis bisa dieksploitasi lebih mendalam. Komponen ini
menjadikan Tabu Search berbeda dengan aplikasi lain yang menggunakan
struktur memori yang kaku (rigid) atau tanpa menggunakan struktur memori
(seperti algoritma sumulted annealing)
b. Penggunaan mekanisme atau kondisi kontrol yang didasarkan interaksi
antara kondisi yang membatasi dan mendukung proses pencarian. Pola ini
dikenal sebagai mekanisme tabu restriction dan aspiration criteria.
c. Penggabungan fungsi memori yang memiliki rentang waktu yang berbeda,
berupa memori jangka pendek (short term memory) dan memori jangka
panjang (long term memory), untuk menerapkan strategi intensifikasi dan
diversifikasi dalam proses pencarian solusi. Strategi intensifikasi merupakan
strategi pencarian yang memfokuskan pencarian pada area tertentu,
sedangkan diversifikasi merupakan strategi pencarian yang mengarahkan
pencarian pada area baru.

Ketiga pola atau skema tersebut jika digambarkan seperti pada gambar flow di
bawah. Pemilihan kandidat solusi terbaik berdasarkan nilai fungsi tujuan. Pemeriksaan
nilai ini lebih didahulukan sebelum pemeriksaan status tabu. Apabila nilai fungsi
tujuan lebih baik, maka berpotensi untuk diterima sehingga perlu diperiksa status
tabunya. Urutan pemeriksaan nilai fungsi tujuan kemudian status tabu memberikan
kemungkinan proses penyelesaian program yang lebih cepat. Pemilihan kondidat
solusi terbaik menggunakan prinsip Global-Best Strategi (GB) yakni strategi dimana
algoritma akan mengganti solusi terbaik saat ini dengan solusi terbaik yang ada pada
neighborhood.
Skema Algoritma Tabu Search

Untuk menghindari proses pencarian kembali ke kandidat solusi yang penah


dikunjungi, Algoritma Tabu Search akan mengingat jalur pencarian yang telah
dilewati. Kandidat solusi yang sudah dilewati akan disimpan dalam memori, yang
disebut Tabu list, dan tidak akan dilewati lagi (karena itu disebut Tabu). Dalam setiap
iterasi, memori ini akan diperbaruhi. Akan tetapi, menyimpan semua solusi yang
pernah ditemukan membutuhkan waktu dan kapasitas memori yang besar, karena
setiap iterasi harus dilakukan pencocokan apakah suatu kandidat solusi ada diantara
Tabu List, sehingga Tabu list biasanya ditetapkan berukuran konstan dan berisi
pergerakan yang Tabu atau Tabu moves (dan bukan solusi yang tabu).
Dalam penerapan Algoritma Tabu Search, ada beberapa hal yang harus
diperhatikan,yaitu:
1. Tabu list : tujuan dari penggunaan Tabu list (memori jangka pendek) adalah
untuk menghindari evaluasi kandidat solusi yang pernah dikunjungi
sebelumnya. Akan tetapi, menampung semua kandidat solusi yang pernah
dievaluasi ke dalam Tabu list akan membuat Tabu search menjadi tidak
efektif (memerlukan memori yang besar dan waktu yang lama untuk
mengecek apakah suatu kandidat solusi pernah dievaluasi atau belum).
2. Aspiration Criteria : umumnya diterapkan jika pergerakan tabu tersebut
menghasilkan kandidat solusi yang memiliki nilai yang lebih baik daripada
solusi terbaik yang telah dihasilkan.
3. Intensifikasi (memori jangka menengah) : memori ini menyimpan sejumlah
solusi yang berkualitas (elite solution) yang dihasilkan selama proses
pencarian. Memori ini bertujuan untuk memberikan prioritas kepada atribut
dari solusi berkualitas tersebut.
4. Diversifikasi (memori jangka panjang): memori ini menyimpan informasi
tentang kandidat solusi yang pernah dikunjungi. Berdasarkan informasi
tersebut, memori ini dapat mengeksplorasi area dalam ruang pencarian yang
belum dikunjungi.
Kelebihan Algoritma Tabu search terletak pada struktur memori yang fleksibel.
Struktur memoru tersebut akan membolehkan pencarian terus dilakukan meskipun
solusi yang diperoleh saat ini tidak ada yang lebih baik dari solusi terbaik yang telah
diperoleh. Struktur memori tersebut juga mampu menjaga agar proses pencarian tidak
jatuh pada lokal optimal yang pernah muncul pada pencarian sebelumnya. Adanya
struktur memoru fleksibel ini yang membedakan Tabu Search dengan algoritma
optimasi yang lain [Glover, 1990].

2.1. Pseudo Code dan Contoh Penerapan Algoritma Tabu Search


Prosedur algoritma Tabu search dinyatakan dalam pseudocode berikut:
Membangkitakan solusi awal S(0);
Inisialisasi Tabu List, memori jangkan menengah dan panjang
While belum memenuhi kriteria berhenti
Tentukan solusi terbaik yang bisa diterima S’;
S = S’;
Update Tabu list, aspiration condition, memori jangka menengah dan
panjang;
If memenuhi intensifikasi then intensifikasi;
If memenui kriteria diversifikasi Then diversifikasi;
Endwhile
Output: solusi terbaik yang ditemukan.

Untuk memahami penerapan pseudo code di atas, berikut merupakan contoh


implementasi algoritma Tabu Search yang digunakan untuk menentukan posisi
dimana fungsi Himmelblau 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 dan y
= -0,923039 dengan nilai fungsi sebesar f(x,y) = 181,617, dengan asumsi bahwa
rentang maksimum dan minimum dari sebaran titik adalah -2 sampai dengan 2.
Sedangkan fungsi Himmelblau sendiri diketahui dengan rumus 𝑓(𝑥, 𝑦) = (𝑥 2 + 𝑦 −
11)2 + (𝑥 + 𝑦 2 − 7)2 . Grafik fungsi Himmelblau yang normal atau sebaran titik tak
terbatas, digambarkan sebagai berikut.

Sedangkan grafik fungsi Himmelblau untuk sebaran titik dengan rentang


minimum = -2 dan maksimum = 2 adalah sebagai berikut.
Berdasarkan gambar diatas dapat dilihat bahwa didapatkan area dengan titik
tertinggi (berwarna merah) berada pada area 𝑥 = 0 dan 𝑦 = −1, dimana titik tersebut
mengembalikan nilai fungsi tertinggi. Oleh sebab itu, digunakan algoritma Tabu
Search untuk mencari titik di area berwarna merah tersebut. Makalah ini
mengimplementasikan algoritma Tabu Search menggunakan bahasa pemrograman
Visual Basic. Sebelum implementasi ke dalam syntax program, ada beberapa konstanta
atau parameter yang harus diketahui, diantaranya:
▪ Menentukan ukuran maksimal dari daftar Tabu yang ada
Jika daftar Tabu sudah penuh dengan data, maka data berikutnya yang masuk
daftar tabu akan menggantikan data yang pertama kali masuk ke dalam daftar
Tabu. Diasumsikan dalam kasus ini, ukuran maksimal daftar Tabu adalah 20.
Sehingga syntaxnya sebagai berikut.
Const ukuranDaftarTabu As Integer = 20

▪ Menentukan jumlah iterasi yang digunakan dalam perhitungan. Diasumsikan


dalam kasus ini, jumlah iterasi adalah 50 kali.
Const jumlahIterasi As Integer = 50

▪ Menentukan posisi minimum dan maksimum 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 minimum adalah -2 dan maksimum adalah +2.
Const minPosisi As Double = -2
Const maksPosisi As Double = +2
Langkah-langkah penggunaan Algoritma Tabu Search adalah sebagai berikut.
1) Menentukan angka-angka koordinat X dan Y yang dipakai dalam perhitungan.
Diasumsikan bahwa semua angka di dalam batas posisi akan dipakai dengan jarak
antar titik adalah 0.05.
Dim daftarKoordinatX((maksPosisi - minPosisi) / 0.05) As Double
For i As Integer = 0 To daftarKoordinatX.Length - 1
daftarKoordinatX(i) = minPosisi + i * 0.05
Next

Dim daftarKoordinatY((maksPosisi - minPosisi) / 0.05) As Double


For i As Integer = 0 To daftarKoordinatY.Length - 1
daftarKoordinatY(i) = minPosisi + i * 0.05
Next

2) Masukkan semua kombinasi posisi yang ditemukan ke dalam variabel titik.


Dim titik As Titik(,) = New Titik(daftarKoordinatX.Length, daftarKoordinatY.Length) {}
For i As Integer = 0 To daftarKoordinatX.Length - 1
For j As Integer = 0 To daftarKoordinatY.Length - 1
titik(j, i) = New Titik(daftarKoordinatX(i), daftarKoordinatY(j))
Next
Next
▪ Agar dapat menjalankan syntax di atas, maka diperlukan sebuah Class titik
untuk menampung data posisi X, Y dan nilai fungsi titik tersebut. Deklarasi
Class titik sebagai berikut.
Public Class Titik
Implements IComparable(Of Titik)

Private m_x As Double


Private m_y As Double
Private nilaiFungsi As Double

Public Sub New(x As Double, y As Double)


m_x = x
m_y = y
nilaiFungsi = HitungNilaiFungsi(x, y)
End Sub
Public Sub New(x As Double, y As Double, Nilai As Double)
m_x = x
m_y = y
nilaiFungsi = Nilai
End Sub

Public Property x() As Double


Get
Return m_x
End Get
Set(value As Double)
m_x = value
End Set
End Property

Public Property y() As Double


Get
Return m_y
End Get
Set(value As Double)
m_y = value
End Set
End Property

Public Property Nilai() As Double


Get
Return nilaiFungsi
End Get
Set(value As Double)
nilaiFungsi = value
End Set
End Property

...
End Class

▪ Gunakan fungsi 𝑓(𝑥, 𝑦) = (𝑥 2 + 𝑦 − 11)2 + (𝑥 + 𝑦 2 − 7)2 untuk


menghitung nilai fungsi.
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

3) Menentukan indeks acak sebagai posisi awal titik mulai sebelum dilakukan
perhitungan. Kemudian membuat titik awal dengan posisi acak tersebut.
Dim rnd As New Random(0)
Dim idxAcakX As Integer = rnd.Next(daftarKoordinatX.Length)
Dim idxAcakY As Integer = rnd.Next(daftarKoordinatY.Length)
Dim titikAwal As New Titik(daftarKoordinatX(idxAcakX), daftarKoordinatY(idxAcakY))

4) Membuat daftar Tabu dengan jumlah maksimum sebanyak variabel ukuran daftar
Tabu. Kemudian masukkan titik awal mulai yang sudah ditemukan ke dalam
daftar Tabu tersebut.
Dim daftarTabu As New DaftarTabu(Of Titik)(ukuranDaftarTabu)
daftarTabu.TambahTabu(titikAwal)

▪ Agar dapat menjalankan syntax di atas, diperlukan sebuah Class DaftarTabu


untuk menampung data daftar titik tabu dan ukuran maksimum daftar tabu.
Deklarasi tersebut sebagai berikut.
Public Class DaftarTabu(Of T)
Private daftarTitikTabu As New Queue(Of Titik)()
Private maksDaftarTabu As Integer

Public Sub New(maksDaftarTabu As Integer)


Me.maksDaftarTabu = maksDaftarTabu
End Sub

...
End Class

▪ Gunakan fungsi berikut untuk menambahkan sebuah titik ke dalam daftar Tabu
Public Sub TambahTabu(t As Titik)
If daftarTitikTabu.Count() >= maksDaftarTabu Then daftarTitikTabu.Dequeue()
daftarTitikTabu.Enqueue(t)
End Sub
5) Melakukan proses pencarian posisi terbaik sebanyak jumlah iterasi. Penjelasan
lebih detail mengenai fungsi ini dapat dilihat pada penjelasan poin 5a-5c.
ts.CariPosisiTerbaik(titik, daftarTabu, daftarKoordinatX, daftarKoordinatY)

Memasuki perhitungan pada fungsi CariPosisiTerbaik.


5a) Simpan semua titik di sekitar parameter titik beserta nilaii titik tersebut. Jika
indeks yang dihitung menyebabkan titik berada di luar batas koordinat posisi,
maka beri nilai titik dengan posisi (0, 0)
For i As Integer = -1 To 1
For j As Integer = -1 To 1
If Not ((i = 0) And (j = 0)) Then
Try
daftarTitikSekitar(idxDaftarTitikSekitar) = New
Titik(titik(idxY + j, idxX + i).x, titik(idxY + j, idxX + i).y, titik(idxY + j, idxX + i).Nilai)
idxDaftarTitikSekitar += 1
Catch
daftarTitikSekitar(idxDaftarTitikSekitar) = New Titik(0, 0, 0)
idxDaftarTitikSekitar += 1
End Try
End If
Next
Next
5b) Lakukan pengurutan titik dari nilai fungsi tertinggi ke terendah
Array.Sort(daftarTitikSekitar)
5c) Lakukan perhitungan pada semua titik pada daftar tersebut.
For Each t As Titik In daftarTitikSekitar
...
▪ Lakukan perhitungan selanjutnya apabila titik yang sedang dihitung tidak
termasuk dalam daftar Tabu
If Not daftarTabu.isTerdapatDalamTabu(t) Then
...
Gunakan fungsi berikut untuk mengetahui apakah sebuah titik sudah masuk
ke dalam daftar Tabu. Fungsi berikut akan mengembalikan nilai TRUE
apabila titik tersebut terdapat dalam daftar Tabu, selain itu akan
mengembalikan nilai FALSE.
Public Function isTerdapatDalamTabu(p As Titik) As Boolean
Dim x = From t In daftarTitikTabu Where t.x = p.x AndAlso t.y = p.y AndAlso t.Nilai
= p.Nilai Select t
Return x.Count() > 0
End Function
▪ Jika nilai fungsi pada titik ini lebih dari fungsi titik terbaik, makan simpak
titik ini sebagai titik terbaik.
If t.Nilai > TitikTerbaik.Nilai Then
TitikTerbaik = t
daftarTabu.TambahTabu(t)
End If
▪ Simpan indeks titik yang sedang dihitung pada posisi X dan Y.
For i As Integer = 0 To daftarKoordinatX.Length - 1
If t.x = daftarKoordinatX(i) Then
idxX = i
Exit For
End If
Next

For i As Integer = 0 To daftarKoordinatY.Length - 1


If t.y = daftarKoordinatY(i) Then
idxY = i
Exit For
End If
Next
▪ Jika iterasi masih belum melebihi jumlah maksimum iterasi, maka ulangi
fungsi ini kembali (point 5) dengan posisi titik yang sedang dihitung. Jika
iterasi sudah melebihi jumlah maksimum iterasi, maka hentikan
perhitungan.
If iterasi = jumlahIterasi Then
Exit For
Else
iterasi += 1
CariPosisiTerbaik(titik, daftarTabu, daftarKoordinatX, daftarKoordinatY)
End If
Agar dapat menjalankan syntax di atasm diperlukan sebuah Class TS untuk
menampung data indeks koordinat X dan Y, jumlah iterasi dan titik dengan
nilai fungsi terbaik. Deklarasi Class TS tersebut sebagai berikut.
Class TS
Private idxX As Integer 'Indeks Koordinat X sebuah Titik pada data awal
Private idxY As Integer 'Indeks Koordinat Y sebuah Titik pada data awal
Private jumlahIterasi As Integer
Private iterasi As Integer
Private TitikTerbaik As Titik 'variable of type Titik for storing the coordinates
and value of global minimum

Public Sub New(idxX As Integer, idxY As Integer, jumlahIterasi As Integer,


titikAwal As Titik)
Me.idxX = idxX
Me.idxY = idxY
Me.jumlahIterasi = jumlahIterasi
iterasi = 1
TitikTerbaik = titikAwal
End Sub

Public ReadOnly Property PosisiTerbaik As Titik


Get
Return TitikTerbaik
End Get
End Property

...
End Class
Hasil Akhirnya adalah sebagai berikut.

III. KESIMPULAN
▪ Algoritma optimasi terdiri dari dua jenis yaitu Algoritma deterministik dan
probabilistik. Kedua jenis algoritma tersebut memiliki turunan, salah satunya
adalah dynamic programming yang merupakan turunan dari algoritma
deterministik dan Tabu Search yang merupakan turunan dari algoritma
probabilistik.
▪ Pada algoritma deterministik, setiap langkah yang dieksekusi hanya terdapat satu
jalan untuk diproses, namun jika tidak ada jalan makan algoritma dianggap selesai.
Dengan demikian algoritma ini selalu menghasilkan solusi yang tetap untuk suatu
input yang diberikan. Sedangkan pada Algoritma Optimasi Probabilistik akan
berusaha untuk menemukan solusi yang bagus tanpa melebihi batasan waktu yang
telah ditentukan. Solusi yang bagus ini belum tentu yang paling optimal, namun
sudah dapat diterima oleh user.
▪ Algoritma dynamic programming mengandung prosedur matematis yang dirancang
untuk memperbaiki efisiensi perhitungan masalah matematis tertentu. Perbaikan ini
dengan cara menguraikan masalah tersebut menjadi bagian-bagian yang lebih kecil,
sehingga perhitungan tersebut dapat dilakukan dengan lebih sederhana.
Permasalahan yang diselesaikan dengan menggunakan algoritma ini dibagi dalam
tahap-tahap. Setiap tahap tersebut mewakili kemungkinan kapasitas dari setiap
masalah yang diselesaikan. Sedangkan algoritma Tabu Search berprinsip pada
penggunaan memori sebagai elemen esensial dalam pencariannya. Algoritma ini
tidak hanya menyimpan nilai sebuah solusi terbaik seperti kebanyakan metode
algoritma pencarian, namun juga menyimpan informasi selama pencarian melalui
solusi terakhir yang dikunjungi.
▪ Pemecahan masalah menggunakan dynamic programming mempunyai empat
tahapan, diantaranya: a) Menggolongkan struktur sebuah solusi optimal; b)
Pendefinisian nilai sebuah solusi yang optimal dengan semua kondisi dan keadaan
yang memungkinkan (secara recursive); c) Menghitung nilai sebuah solusi optimal,
biasanya dalam mode bawah-atas (mundur dari tahapan terakhir dan memecahkan
tiap tahap). d) Mengkontruksi sebuah solusi optimal dari informasi yang dihitung.
Solusi optimal dari permasalahan didapatkan jika semua tahap sudah terpecahkan.
▪ Pemecahan masalah menggunakan Tabu Search mempunyai beberapa tahapan
diantaranya: a) Memulai dengan sebuah solusi awal; b) Membuat suatu daftar
kandidat perpindahan (solusi); c) Evaluasi setiap kandidat solusi dan memilih
kandidat terbaik; d) Kriteria penghentian prosedur (Hentikan seluruh prosedur atau
transfer ke prosedur diversifikasi atau lanjutkan kondisi-kondisi penerimaan)
IV. REFERENSI
Cormen TH, Leiserson CE, Rivest RL, Stein C. 2001. Introduction to Algoritms,
Second Edition, Massachusetts Institute of Technology, MIT Press.
Glover, Fred (1990). Tabu Search – Part II. ORSA Journal on Computing. Vol. 2.
No.1
Mahmudy, Wayan Firdaus. 2013. Algoritma Evolusi. Modul Kuliah : Universitas
Brawijaya.
PipTools. 2015. Algoritma Tabu Search. Search(online)
(https://piptools.net/algoritma-tabu-search/, diakses 15 Mei 2017)
PipTools. 2015. Permasalahan Knapsack. Search(online)
(https://piptools.net/permasalahan-knapsack/, diakses 15 Mei 2017)
Suyanto S. 2010. Algoritma Optimasi Deterministik atau Probabilistik. Graha Ilmu :
Yogyakarta.
WongCilik. 2012. Metaheuristik: tabu search. Search(online)
(https://hindriyanto.wordpress.com/2012/09/03/metaheuristics-tabu-search/,
diakses 14 mei 2017)

Anda mungkin juga menyukai