Anda di halaman 1dari 5

Di dalam kehidupannya, manusia selalu menemui masalah atau persoalan.

Hal ini mungkin


didasarkan dari sifat dasar manusia itu sendiri yang selalu ingin tahu tentang segala sesuatu.
Deskripsi dari masalah menurut [NEA96] adalah pertanyaan atau
tugas yang kita cari
jawabannya. Dalam menghadapi permasalahan, untuk menyelesaikannya manusia memerlukan
langkah-langkah yang benar sehingga permasalahan tersebut dapat terselesaikan. Urutan
langkah-langkah untuk memecahkan suatu masalah tersebutlah yang dinamakan dengan
algoritma. Definisi lain dari algoritma adalah deretan langkah-langkah komputasi yang
mentransformasikan data masukan menjadi keluaran [COR92]. Dalam menentukan langkahlangkah tersebut diperlukan suatu strategi agar langkah-langakah yang dipakai tersebut dapat
menyelesaikan permasalahan secara mangkus (efisien). Strategi menurut Kamus Besar Bahasa
Indonesia (KBBI) edisi tahun 1998 adalah rencana yang cermat mengenai kegiatan untuk
mencapai sasaran khusus. Rencana itu sendiri dapat berisi suatu metode atau teknik yang
digunakan untuk mencapai sasaran khusus tersebut Dengan pengertian algoritma dan strategi
tersebut, kita dapat mendefinisikan strategi algoritmik (algorithm strategies) sebagai kumpulan
metode atau teknik untuk memecahkan masalah guna mencapai tujuan yang ditentukan, yang
dalam hal ini deskripsi metode atau teknik tersebut dinyatakan dalam suatu urutan
langkahlangkah penyelesaian.
Secara umum, strategi pemecahan masalah dapat dikelompokan menjadi:
1. Strategi solusi langsung (direct solution strategies)
Metode yang termasuk ke dalam strategi ini adalah:
- Algoritma Brute Force
- Algoritma Greedy
2. Strategi berbasis pencarian pada ruang status (statespace bace strategies)
Metode yang termasuk ke dalam strategi ini adalah:
- Algoritma Backtracking
- Algoritma Branch and Bound
3. Strategi solusi atas-bawah (top-down solution strategies)
Metode yang termasuk ke dalam strategi ini adalah algoritma Divide and Conquer.
4. Strategi solusi bawah-atas (bottom-up solution strategies)
Metode yang termasuk ke dalam strategi ini adalah Dynamic Programming. Strategi yang akan
dipakai dalam pemecahan masalah dalam makalah ini adalah strategi berbasis pencarian pada
ruang status (state-space bace strategies). Secara spesifik, metode yang digunakan adalah
algoritma runut-balik (Backtracking algorithm).
Algoritma runut-balik (backtracking algorithm) adalah algoritma yang berbasis pada DFS
untuk mencari solusi persoalan secara lebih mangkus. Runut-balik, yang merupakan perbaikan
dari algoritma bruteforce, secara sistematis mencari solusi persoalan di antara semua
kemungkinan solusi yang ada. Dengan metode ini, kita tidak perlu memeriksa semua
kemungkinan solusi yang ada. Hanya pencarian yang mengarah ke solusi saja yang selalu
dipertimbangkan. Akibatnya, waktu pencarian dapat dihemat. Runut-balik lebih alami dinyatakan
dalam algoritma rekursif. Kadang-kadang disebutkan pula bahwa runut-balik merupakan bentuk
tipikal dari algoritma rekursif.
Istilah runut-balik pertama kali diperkenalkan oleh D.H.Lehmer pada tahun 1950. Selanjutnya,
R. J. Walker,Golomb, dan aumert menyajikan uraian umum tentang runut-balik dan
penerapannya pada berbagai persoalan [HOR78].

Properti Umum Metode Runut-balik


Untuk menerapkan metode runut-balik, properti berikut didefinisikan:
1. Solusi persoalan. Solusi dinyatakan sebagai vektor n-tuple:
X=(x1, x2, ..., xn), xi anggota himpunan
berhingga Si . Mungkin saja S1 = S2 = ... = Sn.
Contoh: Si = {0,1}
Si = 0 atau 1
2. Fungsi pembangkit nilai xk Dinyatakan sebagai:
T(k)
T(k) membangkitkan nilai untuk xk, yang
merupakan komponen vektor solusi
3. Fungsi pembatas (fungsi kriteria) Dinyatakan sebagai:
B(x1, x2, ..., xk)
Fungsi pembatas menentukan apakah (x1, x2, ..., xk)
mengarah ke solusi. Jika ya, maka pembangkitan nilai untuk xk+1 dilanjutkan, tetapi jika tidak,
maka
(x1, x2, ..., xk) dibuang dan tidak dipertimbangkan lagi dalam pencarian solusi.
Prinsip Pencarian Solusi dengan Metode Runut-balik
1. Solusi dicari dengan membentuk lintasan dari akar ke daun. Aturan pembentukan yang
dipakai adalah mengikuti metode pencarian mendalam (DFS). Simpul-simpul yang sudah
dilahirkan dinamakan simpul hidup (live node). Simpul hidup yang
sedang diperluas dinamakan simpul-E (Expandnode). Simpul dinomori dari atas ke bawah sesuai
dengan urutan kelahirannya (sesuai prinsip DFS).
2. Tiap kali simpul-E diperluas, lintasan yang dibangun olehnya bertambah panjang. Jika
lintasan yang sedang dibentuk tidak mengarah ke solusi, maka simpul-E dibunuh sehingga
menjadi simpul mati (dead node). Fungsi yang digunakan untuk membunuh simpul-E adalah
dengan menerapkan fungsi pembatas (bounding function). Simpul yang sudah mati tidak akan
pernah diperluas lagi.
3. Jika pembentukan lintasan berakhir dengan simpul
mati, maka proses pencarian
diteruskan dengan membangkitkan simpul anak yang lainnya. Bila tidak ada lagi simpul anak
yang dapat dibangkitkan, maka pencatian solusi dilanjutkan dengan melakukan runut-balik ke
simpul hidup terdekat (simpul orangtua). Selanjutnya simpul ini menjadi simpul-E yang baru.
Lintasan baru dibangun kembali sampai lintasan tersebut membentuk solusi.
4. Pencarian dihentikan bila kita telah menemukan solusi atau tidak ada lagi simpul hidup
untuk runut balik.
Dalam metode ini, diperlukan penyusunan ulang dalam urutan pengisian variabel. Cara yang
paling efektif adalah dengan mencari solusi untuk variabel dengan constraint terbanyak, atau
dengan doamain yang paling sedikit Urutan akan sangat menentukan cepat atau lambatnya
solusi ditemukan. Algoritma dimulai dengan mengisikan variabel dalam constraintnya,
kemudianmelakukan evaluasi terhadap constraint, apakah terpenuhi atau tidak. Lakukan hal yan
g sama melakukan evaluasi terhadap constraint, apakah terpenuhi atau tidak. Lakukan hal yan g

sama, sampai semua variabel terisi. Jika variabel tidak dapat diisikan, maka harus lakukan
penelaahan ulang (backtracking), ke node di atasnya, atau variabel seb elumnya.

Kita lihat contoh nomor 2 kembali, tentang crossword:


Andaikata urutan pengisian variabel adalah: 1ACROSS, 2DOWN, 3DOWN, 4ACROSS,
7ACROSS, 5DOWN, 8ACROSS, 6DOWN. Maka urutan alokasi dapat dilihat sebagai berikut:

Yang kita lihat di atas adalah Chronological Backtracking, yaitu variabel dilepas dalam urutan
yang terbalik dari variabel yang diisikan, misalnya dari 4ACROSS kembali ke 3DOWN. Sebaliknya
Dependency Directed Backtracking akan kembali ke node, tempat terjadinya kegagalan tanpa
memperhatikan urutaan pengisiaan variabel, misalnya dari 4ACROSS, kembali ke 2DOWN.
Perhatikan bahwa dengan Dependency Directed Backtracking, setiap variabel akan melakukan
backtracking sebanyak jumlah tetangga yang mendahuluinya. Jumlah ini disebut sebagai lebar
(width) dari variabel. Kompleksitas waktu akan besar, seiring dengan jumlah backtracking yang
terjadi. Konsekuensinya, urutan pengisian variabel akan sangat berpengaruh terhadap jalannya
algoritma.
Sama seperti algoritma Brute-Force, prinsip dasar algoritma Backtracking adalah mencoba
semua kemungkinan solusi yang ada. Perbedaan utamanya adalah pada konsep dasarnya, yaitu
pada Backtracking semua solusi dibuat dalam bentuk pohon solusi (tree), dan kemudian pohon
tersebut akan ditelusuri secara DFS (Depth First Search) sehingga ditemukan solusi terbaik yang
diinginkan.
A

Misalkan pohon di atas menggambarkan solusi dari suatu persoalan. Jika kita ingin mencari
solusi dari A ke E, maka jalur yang harus ditempuh adalah (A-B-E). Demikian juga untuk solusisolusi yang lain. Algoritma Backtracking akan memeriksa jalur secara DFS, yaitu dari solusi
terdalam pertama yang ditemui yaitu solusi E. Jika ternyata E bukanlah solusi yang diharapkan,
maka pencarian akan dilanjutkan ke F. Jalur yang harus dilalui untuk bias mencapai E adalah (AB-E) dan untuk mencapai F adalah (A-B-F). Kedua solusi tersebut memiliki jalur awal yang sama,
yaitu (A-B). Jadi, daripada memeriksa ulang jalur dari A kemudian B, makajalur (A-B) disimpan
dulu dan langsung memeriksa solusi F. Untuk kasus pohon yang lebih rumit, cara ini dianggap
lebih efisien daripada jika menggunakan algoritma Brute-Force.
Algoritma Backtracking digunakan untuk membuat Artificial Intelligence pada board games
seperti catur, othello, dan checker. Dengan algoritma ini dapat dibuat pohon solusi sampai
dengan kedalaman tertentu dari current status, dan dipilih solusi yang dapat membantu user
menemukan langkah-langkah yang nantinya akan menghasilkan pohon solusi yang
menguntungkan bagi user. Cara ini dipakai sebagai Artificial Intelligence yang digunakan untuk
menyelesaikan dynamic problem. Beberapa contoh penggunaan dari algoritma Backtrack dari
suatu masalah statik adalah untuk memecahkan masalah N-Queen problem dan Maze Solver. NQueen problem adalah permasalahan di mana user harus mencari cara bagaimana meletakkan
bidak Queen catur sebanyak n buah pada papan catur atau pada papan berukuran nxn
sedemikian rupa sehingga tidak ada satu bidakpun yang dapat memakan bidak lainnya hanya
dengan 1 langkah (1 gerakan). Meskipun ada kemungkinan terdapat lebih dari satu cara untuk
mendapatkan solusinya, tetapi tidak perlu dilakukan proses pencarian untuk mendapatkan
semua solusinya. Untuk beberapa kasus tertentu perlu dilakukan
pencarian terhadap semua solusi sehingga dapat dipilih satu solusi terbaik. Maze solver adalah
permasalahan di mana user harus mencari cara agar bisa keluar dari suatu maze (labirin). Pada
maze sederhana di mana field yang dibentuk dapat direpresentasikan dalam bentuk biner dan
pada setiap petak terdapat maksimal 4 kemungkinan : atas, kiri, bawah, dan kanan. Untuk
masalah ini biasanya solusi pertama yang ditemukan bukanlah solusi optimal seperti yang
diharapkan, sehingga harus dilakukan pencarian terhadap semua kemungkinan solusi agar
didapatkan solusi terbaik.
4. Implementasi Algoritma Backtracking
Algoritma Backtracking akan mencoba menelusuri semua solusi yang mungkin, sehingga
pertama-tama harus dibuat algoritma dasar yang dapat melakukan pencarian terhadap semua
kemungkinan solusi. Lalu, algoritma tersebut diperbaiki dan dikembangkan sehingga cara
pencarian solusinya lebih efisien, efektif, dan sistematis. Algoritma tersebut dibuat untuk
menelusuri kemungkinan solusi pada suatu pohon solusi abstrak. Algoritma Backtracking
dianggap sebagai perbaikan dari algoritma Brute-Force karena pada Backtracking penelusuran
terhadap cabang-cabang dapat dihentikan jika pada suatu titik cabang tertentu diketahui bahwa
penelusuran tersebut tidak akan mencapai solusi yang diinginkan. Dengan demikian,
kompleksitas program dapat dikurangi.
Saat dilakukan penelusuran terhadap B, dipastikan bahwa jalur tersebut tidak akan
menghasilkan solusi yang diinginkan. Maka program langsung menghentikan proses pencarian
dan kemudian langsung dilanjutkan ke jalur C. Penelusuran terhadap jalur (A-B-E) dan (A-B-F) pun

dihentikan. Hal itu membuat kompleksitas waktu yang diperlukan juga berkurang, sehingga
dapat menghemat waktu yang diperlukan. Semakin cepat terdeteksi bahwa jalur yang ditempuh
tidak akan menghasilkan solusi optimal, maka program akan bekerja dengan lebih efisien. Dalam
Backtrack, jika kita ingin kembali pada kondisi sebelumnya, kita harus menyimpan hasil
perhitungan dari kondisi awal sampai dengan kondisi tersebut. Pada bahasa pemrograman yang
telah bisa menangani fungsi-fungsi atau prosedurprosedur rekursif, penyimpanan dapat lebih
mudah dilakukan. Manajemen memori dilakukan sepenuhnya oleh compiler. Pada bahasa
pemrograman lainnya, algoritma Backtrack masih dapat diimplementasikan meskipun
manajemen memori harus dilakukan oleh programmer. Manajemen memori yang baik adalah
dengan menggunakan pointer atau dynamic array, karena kedalaman pohon solusi yang harus
ditelusuri biasanya bervariasi dan tidak dapat ditentukan. Algoritma Backtrack dapat dengan
mudah diimplementasikan pada bahas pemrograman yang telah men-support pemrograman
rekursif. Contohnya antara lain adalah bahasa pemrograman Pascal dan Java, karena Pascal bisa
diprogram secara rekursif serta mendukung penggunaan pointer, sedangkan Java selain dapat
bekerja secara rekursif juga mudah digunakan untuk membuat dynamicarray. Skema yang
umum digunakan pada pemrograman dengan fungsi rekursif adalah dengan menelusuri solusi
yang ada, kemudian periksa status program, apakah nantinya mengarah ke solusi atau tidak. Jika
ya maka panggil kembali fungsi tersebut secara rekursif, lalu periksa apakah solusi sudah
ditemukan (jika hanya perlu satu solusi) atau semua kemungkinan solusi (jika perlu memeriksa
semua kemungkinan solusi). Jika ya, maka program akan langsung keluar dari prosedur atau
fungsi tersebut. Kemudian, pada akhir fungsi, kembalikan semua perubahan yang dilakukan pada
awal fungsi. Pada bahasa pemrograman yang mendukung fungsi rekursif, semua state setiap
fungsi akan diatur oleh compiler. Dengan skema ini, jika program tidak memiliki solusi maka
state