Anda di halaman 1dari 16

LAPORAN TUGAS BESAR II

IF2211 Strategi Algoritma


Pentomino Puzzle Solver


Kelompok PentoImba




Dipersiapkan oleh:
Arief Rahman 13511020
Mohamad Rivai Ramandhani 13511043
Pandu Kartika Putra 13511090


Program Studi Informatika
Sekolah Teknik Elektro dan Informatika Institut Teknologi Bandung
Jl. Ganesha 10, Bandung 40132

Tugas Besar II IF2211 Strategi Algoritma Halaman 2 dari 16 04/11/13
Table of Contents
Bab 1 Deskripsi Utama .................................................................................................................. 3
1.1 Deskripsi Umum ................................................................................................................... 3
1.2 Mode Permainan ................................................................................................................... 4
Bab 2 Dasar Teori ........................................................................................................................... 5
2.1 Algoritma BFS (Breadth-First Search) ................................................................................. 5
2.2 Algoritma Bactracking .......................................................................................................... 6
2.3 Algoritma DFS (Depth-First Search) .................................................................................... 6
Bab 3 Analisis Pemecahan Masalah ............................................................................................... 8
Bab 4 Implementasi dan Pengujian................................................................................................. 9
4.1 Spesifikasi Teknis Program .................................................................................................. 9
4.2 Capture Layar...................................................................................................................... 12
4.3 Analisis Hasil Pengujian ..................................................................................................... 14
Bab 5 Kesimpulan dan Saran ........................................................................................................ 16
Bab 6 Daftar Pustaka .................................................................................................................... 16
Bab 7 Lampiran............................................................................................................................. 16
7.1 Pembagian Kerja dalam Kelompok .................................................................................... 16




Tugas Besar II IF2211 Strategi Algoritma Halaman 3 dari 16 04/11/13
Bab 1
Deskripsi Utama

1.1 Deskripsi Umum
Pentomino adalah polyomino yang terdiri dari lima buah persegi yang berukuran sama yang
terhubung sepanjang tepi mereka (koneksi orthogonal) menciptakan 12 bentuk yang berbeda
yang digunakan sebagai potongan teka-teki dalam matematika rekreasi (Sumber kutipan:
Wikipedia).


Biasanya, pentomino diperoleh dari refleksi atau rotasi pentomino yang tidak dihitung sebagai
pentomino yang berbeda. F, L, N, P, Y, dan Z adalah pentomino chiral dalam dua dimensi;
dengan menambahkan refleksi mereka (F ', J, N', Q, Y ', S) menghasilkan jumlah pentomino
menajdi 18. Yang lain, berhuruf I, T, U, V, W, dan X, setara dengan beberapa rotasi gambar
cermin mereka. (Sumber kutipan: Wikipedia).

Masing-masing dari dua belas pentomino dapat diubinkan untuk mengisi sebuah bidang datar.
Selain itu, setiap pentomino chiral dapat diubinkan tanpa menggunakan refleksi (Sumber
kutipan: Wikipedia).


Gambar 1. Perbandingan skema pelabelan pentomino. Yang pertama adalah konvensi penamaan yang
digunakan dalam artikel ini. Metode kedua adalah Conway (Sumber: Wikipedia)


Tugas Besar II IF2211 Strategi Algoritma Halaman 4 dari 16 04/11/13
Sebuah teka-teki pentomino standar adalah mengubinkan kotak persegi panjang dengan
pentamino, yaitu menutupinya tanpa tumpang tindih dan tanpa celah. Masing-masing dari 12
pentamino memiliki luas 5 unit kuadrat, sehingga kotak harus memiliki area seluas 60 unit.
Kemungkinan ukuran yang lain adalah 6 10, 5 12, 4 15 dan 3 20. (Sumber kutipan:
Wikipedia).



Gambar 2. Dua belas pentamino sudah dubinkan pada kotak berukuran 6 10, 5 12, 4 15 dan 3 20
(Sumber: Wikipedia)

Bila diselesaikan dengan tangan mungkin membutuhkan waktu beberapa jam, namun jika
diselesaikan dengan komputer akan membutuhkan pencarian dengan backtracking.

Keterangan: Semua gambar dan bahan tulisan diambil dari laman ini:
http://en.wikipedia.org/wiki/Pentamino

1.2 Mode Permainan
Ada tiga mode permainan di dalam permainan ini:
1. Mode komputer BFS
Pada mode ini, permainan akan disimulasikan oleh komputer. Komputer akan mencoba
melakukan solving pada puzzle pentomino dengan menggunakan algoritma BFS.
2. Mode komputer bactracking berbasis DFS
Pada mode ini, permainan akan disimulasikan oleh komputer. Komputer akan mencoba
melakukan solving pada puzzle pentomino dengan menggunakan algoritma bactracking
berbasis DFS.
3. Mode pemain
Pada mode ini, permainan akan dimainkan oleh pemain sendiri. Pemain harus meletakkan
pentomino pada board yang tersedia dengan bantuan tetikus. Permainan selesai ketika
semua potongan pentomino telah dimasukkan ke dalam board.

Tugas Besar II IF2211 Strategi Algoritma Halaman 5 dari 16 04/11/13
Bab 2
Dasar Teori
2.1 Algoritma BFS (Breadth-First Search)
Algoritma BFS (Breadth-First Search) merupakan salah satu algoritma yang digunakan dalam
pencarian graf. Konsep algoritma BFS adalah melakukan pencarian untuk node saat ini, lalu
melakukan pencarian untuk semua node tetangga yang belum pernah dikunjungi secara
berurutan. Algoritma ini menyimpan daftar node tetangga yang akan dikunjungi dengan
menggunakan struktur data queue.

Proses kerja algoritma BFS adalah sebagai berikut:
1. Masukkan node akar ke queue.
2. Keluarkan node yang ada di head dari queue. Jika node yang dikeluarkan adalah solusi
dari persoalan, berhenti dan kembalikan node tersebut. Jika tidak, masukkan semua node
tetangga yang belum pernah diperiksa ke dalam queue.
3. Jika queue kosong, maka semua node sudah diperiksa. Hentikan pencarian dan
kembalikan nilai null.
4. Jika queue tidak kosong, ulangi langkah 2.

Berikut adalah pseudocode dari algoritma runut balik. G merupakan sebuah graf, dan s
merupakan akar dari graf G.

BFS(G,s)
for each vertex u V [G] {s} do
state[u] = undiscovered
p[u] = nil, i.e. no parent is in the BFS tree
state[s] = discovered
p[s] = nil
Q = {s}
while Q != do
u = dequeue[Q]
process vertex u as desired
for each v Adj[u] do
ocess edge (u,v) as desired
if state[v] = undiscovered then
state[v] = discovered
p[v] = u
enqueue[Q,v]
state[u] = processed




Tugas Besar II IF2211 Strategi Algoritma Halaman 6 dari 16 04/11/13
2.2 Algoritma Bactracking

Algoritma bactracking (atau disebut juga algoritma runut balik) merupakan salah satu dari
banyak algoritma yang digunakan untuk pencarian solusi dari permasalahan komputasi. Konsep
dari algoritma ini adalah membentuk kandidat solusi parsial secara bertahap hingga mencapai
solusi akhir, dan membuang kandidat solusi parsial tertentu (melakukan backtrack) ketika
kandidat tersebut dianggap tidak akan mencapai solusi.

Pada algoritma runut balik terdapat lima fungsi utama:
1. root(P): mengembalikan kandidat solusi parsial pada akar dari pohon pencarian.
2. reject(P,c): mengembalikan nilai true jika kandidat c dianggap tidak akan
memberikan solusi akhir.
3. accept(P,c): mengembalikan nilai true jika kandidat c merupakan solusi dari P. Selain
itu, fungsi ini akan mengeluarkan nilai false.
4. first(P,c): Membuat kandidat solusi parsial lanjutan pertama dari kandidat c.
5. next(P,s): Membuat kandidat solusi parsial lanjutan selanjutnya setelah kandidat s.

Berikut merupakan pseudocode dari algoritma runut balik yang dilakukan secara rekursif.

procedure bt(c)
if reject(P,c) then return
if accept(P,c) then output(P,c)
s first(P,c)
while s do
bt(s)
s next(P,s)

2.3 Algoritma DFS (Depth-First Search)

Algoritma DFS (Depth-First Search) merupakan salah satu algoritma yang digunakan dalam
pencarian graf. Konsep algoritma DFS adalah melakukan pencarian melakukan pencarian pada
suatu node, lalu melakukan pencarian pada node pertama yang belum pernah dikunjungi hingga
solusi ditemukan atau tidak ada node tetangga yang belum dikunjungi. Algoritma ini menyimpan
daftar node tetangga yang akan dikunjungi dengan menggunakan struktur data stack. Dari sini
dapat dilihat bahwa algoritma DFS merupakan bentuk khusus dari algoritma backtracking.

Proses kerja algoritma DFS adalah sebagai berikut:
1. Masukkan node akar ke stack.
2. Keluarkan node yang ada di top dari stack. Jika node yang dikeluarkan adalah solusi dari
persoalan, berhenti dan kembalikan node tersebut. Jika tidak, masukkan semua node
tetangga yang belum pernah diperiksa ke dalam stack.
3. Jika stack kosong, maka semua node sudah diperiksa. Hentikan pencarian dan
kembalikan nilai null.
4. Jika stack tidak kosong, ulangi langkah 2.
Proses kerja algoritma DFS di atas adalah algoritma DFS yang dilakukan secara iteratif.

Tugas Besar II IF2211 Strategi Algoritma Halaman 7 dari 16 04/11/13

Berikut merupakan pseudocode dari algoritma DFS yang dilakukan secara iteratif.
procedure DFS-iterative(G,v):
label v as discovered
let S be a stack
S.push(v)
while S is not empty
t S.peek()
if t is what we're looking for:
return t
for all edges e in G.adjacentEdges(t) do
if edge e is already labelled
continue with the next edge
w G.adjacentVertex(t,e)
if vertex w is not discovered and not explored
label e as tree-edge
label w as discovered
S.push(w)
continue
else if vertex w is discovered
label e as back-edge
else
// vertex w is explored
label e as forward- or cross-edge
label t as explored
S.pop()


Berikut merupakan pseudocode dari algoritma DFS yang dilakukan secara rekursif.

DFS(G,u)
state[u] = discovered
process vertex u if desired
entry[u] = time
time = time + 1
for each v Adj[u] do
process edge (u,v) if desired
if state[v] = undiscovered then
p[v] = u
DFS(G,v)
state[u] = processed
exit[u] = time
time = time + 1

Tugas Besar II IF2211 Strategi Algoritma Halaman 8 dari 16 04/11/13
Bab 3
Analisis Pemecahan Masalah

Proses jalan algoritma yang digunakan di aplikasi ini mirip dengan algoritma BFS dan DFS yang
sudah ada. Pada bab ini hanya akan dijelaskan tentang strategi peletakan pentomino ke papan.

Pengisian papan pentomino dilakukan dengan melihat sel kosong pertama yang ditemukan di
papan pentomino. Ada dua cara penentuan sel kosong pertama, yaitu penentuan berdasarkan
kolom dan penentuan berdasarkan baris. Penentuan sel kosong berdasarkan baris dilakukan
ketika jumlah kolom lebih kecil atau sama dengan jumlah baris. Penentuan sel kosong
berdasarkan kolom dilakukan ketika jumlah baris lebih kecil daripada jumlah kolom.

Setelah penentuan sel kosong, potongan pentomino akan dicoba diletakkan ke papan. Sel kosong
akan menjadi patokan bagaimana pentomino diletakkan ke dalam papan. Ada dua patokan yang
digunakan dalam penempatan pentomino, yaitu patokan kiri dan patokan atas. Penempatan
pentomino dengan patokan kiri dilakukan dengan cara meletakkan bagian pentomino yang
ditemui pertama kali pada sumbu x ke sel kosong. Penenmpatan pentomino dengan patokan atas
dilakukan dengan cara meletakkan bagian pentomino yang ditemui pertama kali pada sumbu y
ke sel kosong. Program akan memprioritaskan peletakan pentomino dengan patokan kiri terlebih
dahulu sebelum melakukan peletakan pentomino dengan patokan atas.

Jika pentomino bisa dimasukkan ke papan, simpan keadaan dari papan ke queue (jika
menggunakan algoritma BFS) atau stack (jika menggunakan algoritma DFS). Jika pentomino
tidak bisa dimasukkan ke papan, lakukan pemutaran/pencerminan pentomino (jika bisa),
kemudian coba lakukan pemasukan pentomino ke papan. Jika masih tidak bisa (untuk semua
kemungkinan keadaan pentomino), ganti dengan pentomino lain.


Tugas Besar II IF2211 Strategi Algoritma Halaman 9 dari 16 04/11/13
Bab 4
Implementasi dan Pengujian

4.1 Spesifikasi Teknis Program
Program memiliki kelas Pentomino, Board, dan Solver dengan struktur data sebagai berikut:
class Piece
{
public int[,] pieceBoard; // The matrix of occupied spaces
public int iTurns; // The number of turns
public bool flippable; // Is the piece flippable?
public int maxRotate; // Maximum number of rotations of a piece before
// returning to current form (not including
// flipped ones)
public int pieceId; // Pentomino piece ID (0 to 11)
public int firstX; // First pentomino part found in x axis
public int firstY; // First pentomino part found in y axis

/*
* Creates a pentomino piece according to the input code.
*/
public Piece(int pieceType);

/*
* Fill the piece board according to the input code.
*/
public void CreatePiece(int iPieceType);

/*
* Rotates the piece 90 degrees counterclockwise.
*/
public void RotatePiece();

/*
* Flips the pentomino piece.
*/
public void FlipPiece();

/*
* Returns the string representation of pentomino piece.
*/
public override string ToString();
}

class Board
{
public int[,] board; // Matrix for the board itself
// Note : Each cell has a code :
// -2 : Cannot be filled
// -1 : Empty
// 0..n : Filled with piece corresponding to the
// code
public int width; // Width of the board

Tugas Besar II IF2211 Strategi Algoritma Halaman 10 dari 16 04/11/13
public int height; // Height of the board
public int numOfPieces; // Number of pieces that can be used
public Piece[] pieces; // Pieces that will be used for the board
public bool[] usedPieces; // Pieces that have been used
public int nextAvailableX; // The first x coordinate available
public int nextAvailableY; // The first y coordinate available
public List<Action> lastActions;// List of pieces used and the position it
// is applied. Piece on the end of the list is
// the last piece used.

/*
* Creates a Board with standard pentominoes count (12) and standard
* Pentomino Board (rectangle-shaped).
*/
public Board(int width, int height);


/*
* Creates a Board with custom pentominoes count and custom
* Pentomino Board. The information about the pentominoes
* and the board are contained in a text file.
*/
public Board(string filename);

/*
* This method will try to put pentomino piece "piece" inside
* the board on position x of "x" and position y of "y".
* Returns true when putting the piece this way is possible and the piece
* fills the first empty cell found.
* Otherwise, returns false.
*/
public bool PutPiece(int positionX, int positionY, Piece piece, int numOfRotate,
int numOfFlip);

/*
* Returns true when putting X piece in position x and y with the left part
* as the base is possible.
*/
public bool PutXPieceLeft (int positionX, int positionY, Piece piece);

/*
* Returns true when putting X piece in position x and y with the upper part
* as the base is possible.
*/
public bool PutXPieceUp (int positionX, int positionY, Piece piece);

/*
* Returns true when putting X piece in position x and y with the right part
* as the base is possible.
*/
public bool PutXPieceRight(int positionX, int positionY, Piece piece);

/*
* Returns true when putting X piece in position x and y with the lower part
* as the base is possible.
*/
public bool PutXPieceDown(int positionX, int positionY, Piece piece);


Tugas Besar II IF2211 Strategi Algoritma Halaman 11 dari 16 04/11/13
/*
* Finds the first empty cell available in the board.
* This method can find the first cell by searching per row
* or searching per column, depending on the circumstances.
*/
public void NextEmptyCell();

/*
* Removes last piece used. Returns true when succeed.
* Otherwise returns false.
*/
public bool RemoveLastPiece();

/*
* Do actions in action list to this board.
*/
public void DoActions(List<Action> actionList);

/*
* Returns string representation of the pentomino board.
*/
public override string ToString();

/*
* Returns a clone of object p.
*/
public static T Copy<T> (T obj);

class Solver
{
public Board solutionBoard; // The solution board for the puzzle

/*
* Solve the pentomino puzzle with bactracking algorithm
* based of DFS. Returns true when a solution is found.
*/
public bool SolveDFS(Board root);

/*
* The recursive part of the algorithm. Returns true when a solution is
* found.
*/
public bool SolveDFSRecursive(Board root);

/*
* Solve the pentomino puzzle with pure BFS method (takes a long time).
*/
public bool SolveBFS(Board root);

/*
* Returns true when current board state is a solution.
* A board state is considered a solution when all the board cells
* are filled with pentominos.
*/
public bool isSolution(Board b);


Tugas Besar II IF2211 Strategi Algoritma Halaman 12 dari 16 04/11/13
4.2 Capture Layar
User interface (anatrmuka) yang digunakan di aplikasi ini ada dua macam, yaitu GUI (graphic-
based interface) dan CLI (command line interface). GUI digunakan untuk antarmuka utama.
Sedangkan CLI digunakan untuk validasi algoritma serta perbandingan langsung.

Berikut merupakan beberapa screen capture Player Mode.



Gambar 3. Capture layar GUI DFS mode Gambar 4. Capture layar GUI DFS mode solved



Gambar 5. Capture layar GUI Player mode Gambar 6. Capture layar GUI BFS mode solved




Tugas Besar II IF2211 Strategi Algoritma Halaman 13 dari 16 04/11/13


Berikut merupakan beberapa screen capture CLI untuk pembandingan algoritma BFS dan DFS



Gambar 7. Contoh eksekusi aplikasi untuk papan berukuran 3 x 20. Gambar kiri merupakan
solusi yang dibuat oleh algoritma runut balik. Gambar kanan merupakan solusi yang dibuat oleh
algoritma BFS.


Gambar 8. Contoh eksekusi aplikasi untuk papan berukuran 4 x 15. Gambar kiri merupakan
solusi yang dibuat oleh algoritma runut balik. Gambar kanan merupakan solusi yang dibuat oleh
algoritma BFS.


Tugas Besar II IF2211 Strategi Algoritma Halaman 14 dari 16 04/11/13


Gambar 9. Contoh eksekusi aplikasi untuk papan berukuran 5 x 12. Gambar kiri merupakan
solusi yang dibuat oleh algoritma runut balik. Gambar kanan merupakan solusi yang dibuat oleh
algoritma BFS.



Gambar 10. Contoh eksekusi aplikasi untuk papan berukuran 6 x 10. Gambar kiri merupakan
solusi yang dibuat oleh algoritma runut balik. Gambar kanan merupakan solusi yang dibuat oleh
algoritma BFS.


4.3 Analisis Hasil Pengujian
Dari gambar 3, 4, 5, dan 6 pada upabab sebelumnya, dapat dilihat bahwa waktu eksekusi
algoritma BFS sangat fluaktuatif, sedangkan waktu eksekusi algoritma DFS cenderung stabil.

Pada awal algoritma BFS, dilakukan pemilihan acak untuk pentomino yang akan dicoba
untuk dimasukkan ke papan pertama kali. Algoritma BFS juga harus menyimpan keadaan
papan ke queue karena algoritma BFS hanya bisa dilakukan dengan cara iterasi. Kedua hal
inilah yang menyebabkan waktu eksekusi algoritma BFS sangat fluktuatif.


Tugas Besar II IF2211 Strategi Algoritma Halaman 15 dari 16 04/11/13
Algoritma DFS cenderung cepat karena algoritma ini tidak melakukan penyimpanan keadaan
papan, sehingga menggunakan memori dan waktu yang jauh lebih sedikit dibandingkan
algoritma BFS. Algoritma DFS juga menggunakan pentomino acak pertama kali pada saat
percobaan pertama. Namun, pemilihan acak ini tidak terlalu memengaruhi waktu eksekusi
algoritma DFS, karena secara umum waktu eksekusinya sudah cepat.

Tugas Besar II IF2211 Strategi Algoritma Halaman 16 dari 16 04/11/13
Bab 5
Kesimpulan dan Saran

Kesimpulan
Algoritma DFS dan bactracking secara umum lebih efektif dalam pencarian solusi pertama dari
suatu permasalahan komputasi.

Saran
Fungsi peletakan pentomino masih belum bisa meletakkan pentomino untuk beberapa papan
dengan bentuk yang unik. Sejauh ini masalah ini baru ditemukan pada papan berbentuk jajaran
genjang berukuran 3x20. Sebaiknya fungsi peletakan ini diperbaiki agar bisa mengakomodasi
peletakan di papan yang unik.

Algoritma BFS sangat lambat dan membutuhkan banyak memori. Sebaiknya digunakan search
pruning untuk meningkatkan performansi algoritma BFS.
Bab 6
Daftar Pustaka
1. Munir, Dr. Ir. Rinaldi. 2009. Diktat Kuliah IF2211 Strategi Algoritma. Program Studi
Informatika Sekolah Teknik Elektro dan Informatika Institut Teknologi Bandung.
2. Skiena, Steven S.. 2008. The Algorithm Design Manual, Second Edition. Springer.
3. Levitin, Anany. 2011. Introduction to the Design and Analysis of Algorithms, Third Edition.
Addison-Wesley.
4. http://en.wikipedia.org/wiki/Breadth-first_search, diakses pada tanggal 4 November 2013
@08:24.
5. http://en.wikipedia.org/wiki/Depth-first_search, diakses pada tanggal 4 November 2013
@08:27.
6. http://en.wikipedia.org/wiki/Backtracking, diakses pada tanggal 4 November 2013 @08:32.
Bab 7
Lampiran
7.1 Pembagian Kerja dalam Kelompok
Nama Bagian
Arief Rahman Membuat kelas Pentomino, Board, Solver (BFS dan DFS),
dan Laporan
Mohamad Rivai Ramandhani Membuat kelas Pentomino, Board, Solver (BFS), dan GUI
Pandu Kartika Putra Membuat GUI, Laporan, dan Solver (DFS)

Anda mungkin juga menyukai