ALGORITMA BACKTRACKING
Diajukan sebagai tugas kelompok mata kuliah
Analisis Algoritma
Dosen:
Ela Herawati, S.Kom
Disusun Oleh :
Mochamad Faras Wahyudipraja/10111945
Derry Berni Cahyadi/10111943
Eka Kurniawan/10111907
Ari Wijaya Setiawan/10111906
Roni Ahdiat/10111977
Rudi Yusuf/10111914
Aurelius Aaron/10111951
Theresia Sagala/10111946
Sri Susanti/10111909
Fitri Antriyanti/10111468
TEKNIK INFORMATIKA
FAKULTAS TEKNIK DAN ILMU KOMPUTER
UNIVERSITAS KOMPUTER INDONESIA
2012
ALGORITMA BACKTRACKING (RUNUT-BALIK)
Algoritma Backtracking (Runut-Balik)
Algoritma backtracking pertama kali diperkenalkan oleh D.H Lehmer pada tahun 1950. Algoritma ini sangat mangkus untuk digunakan dalam beberapa penyelesaian masalah dan untuk memberikan kecerdasan buatan dalam game. Beberapa game populer semisal Sudoku, Labirin, Catur dapat diimplementasikan dengan menggunakan algoritma backtracking.
Algoritma 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 backtracking 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. Simpul-simpul 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 dan algoritma akan menelusuri pohon tersebut secara DFS sampai ditemukan solusi yang sesuai. Dengan metode runut-balik, kita tidak perlu memeriksa semua kemungkinan solusi yang ada. Hanya pencarian yang mengarah ke solusi saja yang selalu dipertimbangkan sehingga waktu pencarian dapat dihemat.
Properti Umum Metode Backtracking (Runut-Balik)
Untuk menerapkan metode backtracking, properti berikut didefinisikan:
Solusi persoalan.
Solusi dinyatakan sebagai vektor n-tuple:
X=(X1, X2, ..., Xn), Xi Є Si (Xi anggota himpunan berhingga Si) .
Mungkin saja S1 = 0S2 = ... = Sn.
Contoh: Si = {0,1}
Si = 0, atau Si = 1
Fungsi pembangkit nilai Xk
Dinyatakan sebagai:
T(k)
T(k) membangkitkan nilai untuk xk, yang merupakan komponen vektor solusi
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.
3. Pengorganisasian Solusi
Semua kemungkinan solusi dari persoalan disebut ruang solusi (solution space). Jika xi Є Si, maka S1 x S2 x … x Sn disebut ruang solusi. Jumlah anggota di dalam ruang solusi adalah " S1" . " S2" . … . " Sn ". Tinjau persoalan Knapsack untuk n = 3. Solusi persoalan dinyatakan sebagai vektor (x1, x2, x3) dengan xi Є {0,1}. Ruang solusinya adalah:
{0,1} x {0,1} x {0,1} = {(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)}.
Pada persoalan Knapsack 0/1 dengan n = 3 terdapat 2n = 23 = 8. Knapsack adalah wadah (tempat) dengan kapasitas tertentu yang dapat membuat beberapa benda/objek. Kemungkinan solusinya, yaitu:
(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), dan (1,1,1).
Penyelesaian secara exhaustive search adalah dengan menguji setiap kemungkinan solusi. Ruang solusi diorganisasikan ke dalam struktur pohon. Tiap simpul pohon menyatakan status (state) persoalan, sedangkan sisi (cabang) dilabeli dengan nilai-nilai xi. Lintasan dari akar ke daun menyatakan solusi yang mungkin. Seluruh lintasan dari akar ke daun membentuk ruang solusi. Pengorganisasian pohon ruang solusi diacu sebagai pohon ruang status (state space tree). Tinjau kembali persoalan Knapsack 1/0 untuk n = 3. Ruang solusinya:
Gambar Ruang solusi untuk persoalan Knapsack 0/1 dengan n = 3
Prinsip Pencarian Solusi dengan Metode Backtracking (Runut-Balik)
Langkah-langkah pencarian solusi dengan metode backtracking adalah sebagai berikut:
Solusi dicari dengan membentuk lintasan dari akar ke daun. Aturan yang dipakai adalah mengikuti metode DFS. Simpul-simpul yang sudah dilahirkan dinamakan simpul hidup (live node). Simpul hidup yang sedang diperluas dinamakan simpul-E (Expand-node).
Jika lintasan yang diperluas yang sedang dibentuk tidak mengarah ke solusi, maka simpul-E tersebut "dibunuh" sehingga menjadi simpul mati (dead node). Simpul yang sudah mati ini tidak akan diperluas lagi.
Jika pembentukan lintasan berakhir dengan simpul mati, maka proses pencarian diteruskan dengan membangkitkan simpul anak lainnya. Bila tidak ada lagi simpul anak yang dibangkitkan, maka pencarian solusi dilanjutkan dengan melakukan runut-balik (backtracking) ke simpul hidup terdekat. Selanjutnya simpul ini menjadi simpul-E yang terbaru.
5. Persoalan N-Queen
N-Queen merupakan salah satu bentuk permainan puzzle yang pertama kali dibentuk pada tahun 1848 oleh seorang pemain catur Max Bezzel. Dua orang matematikawan yaitu Gauss and George Cantor telah bekerja keras untuk menyelesaikan masalah N-Queen ini. Solusi pertama kali dibentuk oleh Franz Nauck pada tahun 1850.
N-Queen merupakan generalisasi dari masalah 4-Queen dan 8-Queen. N-Queen ditempatkan pada sebuah papan catur berukuran NxN tanpa dua serangan sekaligus, dan tanpa dua atau lebih queen dalam satu baris, kolom, dan diagonal yang sama. Layaknya queen pada sebuah papan catur, langkah queen dapat bergerak dalam sejumlah petak horizontal, vertical, dan diagonal.
x
x
x
x
x
x
x
x
x
x
Q
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
Gambar Langkah Queen
Petak yang bisa dilalui oleh queen (Q) diberi tanda "x".
Pada pembahasan ini akan dilakukan pemecahan masalah 4-Queen, yang berarti ditempatkan pada papan berukuran 4x4 dengan menggunakan backtracking. Queen pada papan disimbolkan dengan huruf "Q" dan cara pengisiannya dilakukan berdasarkan urutan baris, mulai dari baris 1, baris 2 dan seterusnya.
Langkah-langkah pemecahan masalah 4-Queen akan dijelaskan sebagai berikut:
Terdapat papan berukuran 4x4.
1
2
3
4
A
B
C
D
Tempatkan queen pada A1.
1
2
3
4
A
Q
B
C
D
Satu queen sudah ditempatkan pada A1, selanjutnya penempatan queen pada baris berikutnya. Langkah yang memungkinkan adalah:
1
2
3
4
A
Q
B
Q
C
D
Langkah A
1
2
3
4
A
Q
B
Q
C
D
Langkah B
Penempatan queen pada baris ke-3 untuk langkah A tidak mungkin dilakukan, maka dari itu backtracking untuk langkah A berakhir di A1, B3. Langkah yang memungkinkan adalah B. Tempatkan queen pada baris ke-3 untuk langkah B.
1
2
3
4
A
Q
B
Q
C
Q
D
Setelah penempatan queen ke-3, untuk penempatan queen selanjutnya tidak dapat dilakukan. Kemungkinan untuk A1, B4, C2 berakhir, maka dari itu kembali ke langkah pertama dan tempatkan queen pada A2.
1
2
3
4
A
Q
B
C
D
Tempatkan queen pada baris ke-2.
1
2
3
4
A
Q
B
Q
C
D
Tempatkan queen pada baris ke-3.
1
2
3
4
A
Q
B
Q
C
Q
D
Tempatkan queen pada baris ke-4.
1
2
3
4
A
Q
B
Q
C
Q
D
Q
Jadi, solusi untuk pemecahan masalah 4-Queen adalah A2, B4, C1, D3.
Proses backtracking secara lengkap:
Pohon solusi dari backtracking diatas sebagai berikut:
Berikut ini contoh algoritma dalam bahasa C untuk solusi N-Queen:
#include
#include
#include
#include
int board[20];
int count;
void Queen(int row, int n);
int main()
{
int n;
printf("\n\t Program N-Queen");
printf("\n Masukkan jumlah N: ");
scanf("%d",&n);
Queen(1,n);
getch();
return 0;
}
void print_board(int n)
{
int i,j;
printf("\n\nSolusi ke %d : \n\n",++count);
for(i=1; i<=n; i++)
{
printf("\t%d",i);
}
for(i=1; i<=n; i++)
{
printf("\n\n%d",i);
for(j=1; j<=n; j++)
{
if(board[i]==j)
printf("\tQ");
else
printf("\t.");
}
}
printf("\n Lanjut...");
getch();
}
int place(int row,int column)
{
int i;
for(i=1; i<=row-1; i++)
{
if(board[i] == column)
return 0;
else if(abs(board[i] - column) == abs(i - row))
return 0;
}
return 1;
}
void Queen(int row,int n)
{
int column;
for(column=1; column<=n; column++)
{
if(place(row,column))
{
board[row] = column;
if(row==n)
print_board(n);
else
Queen(row+1,n);
}
}
}
6. Algoritma Backtracking vs Brute force
Berdasarkan kasus N-Queen, algoritma backtracking merupakan penyempurnaan dari algoritma brute force. Penggunaan algoritma brute force untuk kasus N-Queen dengan cara menempatkan seluruh queen pada semua kolom. Total seluruh queen berjumlah 16. Setelah itu dilakukan pengecekan baris, kolom, dan diagonal. Pertama kali dilakukan pengecekan pada kolom pertama dengan kolom kedua, kolom kedua dengan kolom ketiga dan seterusnya. Setelah selesai lanjut ke kolom kedua dengan melakukan pengecekan kolom ketiga, kolom keempat dan seterusnya. Algoritma ini cukup memakan banyak waktu dalam pengerjaannya.
Perhitungan untuk algoritma brute force tentu saja lebih lama dibandingkan dengan backtracking. Hal ini dikarenakan oleh sifat algoritma backtracking yang hanya mempertimbangkan pencarian yang mengarah ke solusi saja, sedangkan brute force mencoba semua kemungkinan yang ada.
7. Kelebihan dan Kelemahan Algoritma Backtracking
Kelemahan dari algoritma backtracking ini yaitu hanya bisa diaplikasikan terbatas pada tipe permasalahan yang memiliki solusi yang dapat dicari secara sistematis dan bertahap. Ada beberapa masalah yang tidak bisa diselesaikan dengan menggunakan backtracking, misalnya menemukan suatu nilai yang diminta pada tabel yang tidak terurut. Namun ketika algoritma ini dapat diaplikasikan, backtracking dapat bekerja jauh lebih cepat dari brute force karena jumlah kandidat solusi yang dapat dibuang dengan backtracking cukup besar.