A. Pengenalan Algoritma Backtracking Algoritma runut balik pertama kali diperkenalkan oleh D.H Lehmer pada tahun 1950. Algoritma ini cukup mangkus untuk digunakan dalam beberapa penyelesaian masalah dan juga untuk memberikan kecerdasan buatan dalam game. Beberapa game populer semisal Sudoku, Labirin, Catur juga bisa diimplementasikan dengan menggunakan algoritma runut balik. Algoritma runut balik (backtracking) merupakan algoritma yang digunakan untuk mencari solusi persoalan secara lebih mangkus daripada menggunakan algoritma brute force. Algoritma ini akan mencari solusi berdasarkan ruang solusi yang ada secara sistematis namun tidak semua ruang solusi akan diperiksa, hanya pencarian yang mengarah kepada solusi yang akan diproses. Algoritma runut balik berbasis pada DFS (Depth First Search) sehingga aturan pencariannya akan mengikut kepada aturan pencarian DFS yaitu dengan mencari solusi dari akar ke daun (dalam pohon ruang solusi) dengan pencarian mendalam. Simpulsimpul yang sudah dilahirkan (diperiksa) dinamakan simpul hidup (live node). Simpul hidup yang sedang diperluas dinamakan simpul-E atau Expand Node. Algoritma backtracking mempunyai prinsip dasar yang sama seperti brute-force yaitu mencoba segala kemungkinan solusi. Perbedaan utamanya adalah pada ide dasarnya, semua solusi dibuat dalam bentuk pohon solusi (pohon ini tentunya berbentuk abstrak) dan algoritma akan menelusuri pohon tersebut secara DFS (depth field search) sampai ditemukan solusi yang layak.
B. Properti Umum Metode runut balik (Backtracking) 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.
C. Skema Umum Algoritma Backtracking (a) Versi rekursif procedure RunutBalikR(input k:integer) {Mencari semua solusi persoalan dengan metode runut-balik; skema rekursif Masukan: k, yaitu indeks komponen vektor solusi, x[k] Keluaran: solusi x = (x[1], x[2], , x[n]) } Algoritma: for tiap x[k] yang belum dicoba sedemikian sehingga ( x[k]T(k)) and B(x[1], x[2], ... ,x[k])= true do if (x[1], x[2], ... ,x[k]) adalah lintasan dari akar ke daun then CetakSolusi(x) endif RunutBalikR(k+1) endfor Pemanggilan prosedur pertama kali: RunutBalikR(1) (b) Versi iteratif procedure RunutBalikI(input n:integer) {Mencari semua solusi persoalan dengan metode runut-balik; skema iteratif. Masukan: n, yaitu panjang vektor solusi Keluaran: solusi x = (x[1], x[2], , x[n]) { tentukan nilai untuk x[k+1]}
} Delarasi: k : integer Algoritma: k1 while k > 0 do if (x[k] belum dicoba sedemikian sehingga x[k]T(k)) and (B(x[1], x[2], ... ,x[k])= true) then if (x[1],x[2],...,x[k]) adalah lintasan dari akar ke daun then CetakSolusi(x) endif kk+1 else {indeks anggota tupple berikutnya} {x[1], x[2], , x[k] tidak mengarah ke simpul solusi } {runut-balik ke anggota tupple sebelumnya}
Pembuatan algoritma dengan menggunakan prinsip backtracking banyak digunakan dalam menyelesaikan berbagai masalah. Adapun masalah-masalah yang dapat diselesaikan dengan teknik tersebut, antara lain:
1. Banyaknya Himpunan Bagian Suatu Himpunan (Sum Of Subsets) Masalah utama dari Sum Of Subsets adalah jika terdapat n bilangan real dan ingin dihitung semua kombinasi yang mungkin dari himpunan bilangan tersebut. Kombinasi yang diinginkan yaitu kombinasi yang jumlah seluruh elemennya sama dengan M (tertentu). Sebelum kita selesaikan masalah tersebut dengan menggunakan teknik backtracking, perhatikan terlebih dahulu penyajian permasalahan dan penyelesaiannya dalam bentuk pohon.
Pendarian
simpul-simpul
dari
pohon
tersebut
sehingga
diperoleh
ruang
penyelesaiannya menggunakan metode stack. Hal I tersebut dinamakan juga dengan istilah Depth First Search (DFS).
Kedua bentuk penyajian pohon dari persoalan sum of subsets, merupakan tahapan pertama dalam proses mendapatkan solusi sesungguhnya (solusi optimal). Untuk mendapatkan solusi yang optimal dari ruang penyelesaian digunakan suatu algoritma lain. Algoritma tersebut menggunakan teknik backtracking, 2. Pewarnaan Graph (Graph Coloring) Misalkan G adalah sebuah graph dan m adalah bilangan yang positif. Kita ingin menemukan simpul-simpul dari G yang dapat diwarnai sedemikian rupa sehingga dua simpul yang berdampingan tidak mempunyai warna yang sama, sehingga hanya m warna yang dipakai. Masalah keputusan pewarnaan m bertujuan untuk menanyakan bilangan yang terkesil dimana graph G dapat diwarnai. Bilangan ini disebut sebagai bilangan khromatik dari sebuah graph. Sebuah graph dikatakan planar jika tidak ada dua buah titik yang saling berpotongan. Sebuah kasus yang terkenal dari m colorability decision problem yaitu masalah 4 warna dari suatu graph planar. Masalah ini disertai pertanyaan sebagai berikut: berikan beberapa map yang dapat menimbulkan daerah-daerah yang diwarnai sedemikian rupa sehingga daerah-daerah yang berdampingan tidak memiliki warna yang sama, tapi hanya empat buah warna yang dipakai oleh sebuah masalah dimana graph- graph masalah itu berubah menjadi sangat berguna, karena sebuah map dapat dengan mudah dirubah bentuknya menjadi sebuah graph. Masing-masing daerah dari map itu menjadi sebuah titik dan jika dua buah daerah berdampingan maka kedua buah titiknya berhubungan, kemudian kedua titik itu dihubungkan dengan sebuah edge. Dalam bagaian ini kita mempertimbangkan tidak hanya graph- graph yang dibuat untuk map-map tetapi semua graph diperhitungkan juga. Kita tarik dalam mendeterminankan semua cara-cara yang berbeda yang mana graph tampil mungkin dengan memakai yang terbanyak m warna.
Dengan mempergunakan rumus backtracking seperti yang telah diberikan dalam algoritam maka hasil dari program tersebut adalah MCOLORING. Disebutkan bahwa state space tree yang sering dipergunakan adalah sebuah tree dengan tingkat m dan panjang = n+1. Setiap node pada derajat I mempunyai m cabang yang berhubungan ke m yang mungkin untuk x (i), dimana 1 I n. Node-node pada n+1 adalah daun-daunnya node. Procedure MCOLORING (k)
Global integer m,n, X(1:n) boolean GRAPH (1:n,1:n) Integer k Loop Call NEXTVALUE (k) if X(k) = 0 then Exit Andif if k = n then print (X) else call MCOLORING (k+1) endif repeat end MCOLORING
Prosedur MCOLORING dimulai pertama-tama dengan pembagian graph untuk matrik adjacency-nya, membuat harga x = 0, dan kemudian memanggil statement call MCOLORING. Prosedur NEXTVALUE menghasilkan kemungkinan warna-warna untuk X9k) setelah X(1) samapi X(k-1).
3. Lingkaran Hamiltonian (Hamilton Cyclles) Misal G = (V,E) adalah graph terhubung dengan vertice. Lingkaran Hamilton (diciptakan oleh Sir William Hamilton) adalah buah circuit dengan n edge dari G yang dikunjungi sekali oleh setiap vertex dan kembali pada posisi semula. Dengan perkataan lain jika sebuah lingkaran Hamilton dimulai dengan beberapa vertex v1 dan vn+1 yang sama. Kita sekarang akan melihat pada algoritma backtracking yang menemukan semua lingkaran Hamilton ini di dalam Graph. Graph itu mungkin terhubung tetapi mungkin saja tidak. Hanya circuit yang berbeda yang akan menjadi keluarannya.
Gambar Dua graph, hanya satu yang mengandung lingkaran Hamilton Pemecahan dengan backtracking vector (xi, , xn) telah dibatasi sehingga x1 yang diwakilkannya telah dikunjungi vertex dari rencana circuit. Sekarang yang perlu kita lakukan adalah menyelesaikan bagaimana menghitung vertice yang mungkin dari xk jika x1, x2, ,xk-1 siap dipilih. Jika k=1, maka x(1) didapatkan n vertex. Cara lainnya untuk menghindarkan n kali bekas-bekas lingkaran yang sama, kita menghendaki x(1)=1. Jika 1 k n, kemudian X(k) menjadi beberapa vertex v yang berbeda dari x(1), x(2),, x(k-1) dan v dihubungkan dengan sebuah edge untuk x(k-1). X(n) hanya dapat menjadi satu-satunya vertex dan merupakan hubungan dari x(n-1) dan x(1). Kita mulai dengan prosedur NEXTVALUE yang menyelesaikan vertex selanjutnya yang mungkin, dari circuit yang sudah direncanakan Procedure NEXTVALUE (k)
Global integer n, x(1:n) boolean GRAPH (1:n,1:n) Integer k, j Loop X(k) (X(k)+1) mod (n+1) if x(k) = 0 then return andif if GRAOH(x(k)-1), x(k)) then for j-1 to k-1 do if x(j)=x(k) then exit endif repeat if j=k then if k n or (k=n and GRAPH (x(n),1)) then return endif endif endif endif repeat end NEXTVALUE
Dengan memakai prosedur NEXTVALUE kita dapat menyebutkan satu demi satu skema backtracking secara rekursif untuk menemukan semua Hamiltonian cycle.
2.4 Implementasi Algoritma runut balik Algoritma runut balik ini banyak digunakan pada beberapa program, seperti program pencarian solusi game maz (labirin), dan juga digunakan dalam gerak animasi 3D, dan beberapa program yang lainnya.
2.4.2 Program Permainan Maze (Labirin) 2.4.2.1 Gambaran umum game Game Maze (Labirin) merupakan game sederhana yang bertujuan menentukan jalur yang tepat untuk mencapai tujuan yang telah ditetapkan. Selama proses penentuan jalur tersebut, jika menemui jalan buntu maka akan dilakukan proses backtrack sampai kembali menemukan jalur yang tepat untuk mencapai tujuan. 2.4.2.1 Konsep game Maze (Labirin) merupakan game yang template-nya berbentuk persegi yang ukurannya dapat diatur sesuai dengan keinginan user. Di dalamnya terdapat serangkaian jalur berupa labirin yang bercabang. Namun, tidak setiap cabang mencapai tujuan yang diinginkan.
2.4.2.1 Solusi
Ada dua solusi yang bisa digunakan untuk permainan ini, yakni secara iteratif dan rekursif. Di bawah ini akan disajikan solusi secara iteratif:
Sebuah labirin
function SolveMaze(input M : labirin) boolean { true jika solusi ditemukan, false jika tidak } Deklarasi arah : integer { up = 1, down, 2, left = 3, right = 4 } Algoritma: if solusi sudah ditemukan then return true else for tiap arah gerakan (up, down, left, right) do move(M,arah) {pindah satu langkah (satu sel) sesuai arah tersebut } if SolveMaze(M) then
Dalam game ini, algoritma akan membagi lintasan menjadi sederetan langkah. Sebuah langkah terdiri dari pergerakan satu unit sel pada arah tertentu. Arah yang mungkin: ke atas (up), ke bawah (down), ke kiri (left), ke kanan (right).