OLEH :
1.
PROGRAM STUDI
FAKULTAS ILMU
UNIVERSITAS
KATA PENGANTAR
Penulis
DAFTAR ISI
BAB I
PENDAHULUAN
1.1.
Latar Belakang
Di dalam kehidupannya, manusia selalu menemui masalah atau
persoalan. Hal ini mungkin didasarkan dari sifat dasar manusia itu sendiri
yang selalu ingin tahusegala sesuatu. Deskripsi dari masalah menurut
[NEA96] adalah pertanyaan atau tugas yang kita cari jawabannya. Dalam
menghadapi permasalahan, untuk menyelesaikannya manusiamemerlukan
langkah-langkah
yang
benar
sehingga
permasalah
tersebut
adalahderetan
langkah-langkah
komputasi
yang
pengertian
algoritma
dan
strategi
tersebut,
kita
dapat
1.2.
Rumusan Masalah
Adapun rumusan masalah dalam makalah ini ialah sebagai berikut :
1.3.
Tujuan
Adapun tujuan dari penyusunan makalah ini yaitu Untuk menambah ilmu
dan pengetahuan mengenai masalah yang diangkat dalam makalah ini.
BAB II
PEMBAHASAN
2.
6. Sequential Search
Persoalan: Diberikan n buah bilangan bulat yang dinyatakan sebagai a1,
a2, , an. Carilah apakah x terdapat di dalam himpunan bilangan bulat
tersebut. Jika x ditemukan, maka lokasi (indeks) elemen yang bernilai x
disimpan di dalam peubah idx. Jika x tidak terdapat di dalam himpunan
tersebut, maka idx diisi dengan nilai 0.
7. Bubble Sort
Apa metode yang paling lempang dalam memecahkan masalah
pengurutan? Jawabnya adalah algoritma pengurutan bubble sort.
Algoritma bubble sort mengimplementasikan teknik brute force dengan
jelas sekali.
8. Uji keprimaan
Persoalan: Diberikan sebuah bilangan bilangan bulat positif. Ujilah apakah
bilangan tersebut merupakan bilangan prima atau bukan.
10
{'C':
{'E':
{'D':
{'E':
{'F':
{'F':
{'B':
4, 'G': 9},
6},
6, 'H': 12},
7},
15},
8},
5}}
# Hasil Representasi:
{'A': {'C': 4, 'G': 9},
'C': {'D': 6, 'H': 12},
'D': {'E': 7},
'E': {'F': 8},
'F': {'B': 5},
'G': {'E': 6},
'H': {'F': 15}}
Selanjutnya kita akan membuat fungsi yang mencari jarak terpendek dari graph
yang dibangun, dengan menggunakan algoritma greedy. Definisi dari fungsi
tersebut sangat sederhana, hanya sebuah fungsi yang mengambil graph, titik awal,
dan titik akhir sebagai argumennya:
def shortest_path(graph, source, dest):
Jarak terpendek yang didapatkan akan dibangun langkah demi langkah, seperti
pada algoritma greedy yang mengambil nilai local maximum pada setiap
langkahnya. Untuk hal ini, tentunya kita akan perlu menyimpan jarak terpendek
ke dalam sebuah variabel, dengan source sebagai isi awal variabel tersebut. Jarak
terpendek kita simpan ke dalam sebuah list, untuk menyederhanakan proses
penambahan nilai.
result = []
result.append(source)
Penelusuran graph sendiri akan kita lakukan melalui result, karena variabel ini
merepresentasikan seluruh node yang telah kita kunjungi dari keseluruhan graph.
Variabel result pada dasarnya merupakan hasil implementasi dari langkah 3
algoritma (Tandai graph sekarang sebagai graph yang telah dikunjungi). Titik
awal dari rute tentunya secara otomatis ditandai sebagai node yang telah
dikunjungi.
11
Selanjutnya, kita akan menelusuri graph sampai titik tujuan ditemukan, dengan
menggunakan iterasi:
while dest not in result:
current_node = result[-1]
dengan mengambil node yang sekarang sedang dicari local maximum-nya dari isi
terakhir result. Pencarian local maximum sendiri lebih memerlukan pengetahuan
python daripada algoritma:
# Cari local maximum
local_max = min(graph[current_node].values())
# Ambil node dari local maximum,
# dan tambahkan ke result
# agar iterasi selanjutnya dimulai
# dari node sekarang.
for node, weight in graph[current_node].items():
if weight == local_max:
result.append(node)
Perlu diingat bahwa fungsi ini masih banyak memiliki kekurangan, misalnya tidak
adanya penanganan kasus jika titik tujuan tidak ditemukan, atau jika terdapat node
yang memiliki nilai negatif (bergerak balik). Penanganan hal-hal tersebut tidak
dibuat karena fungsi hanya bertujuan untuk mengilustrasikan cara kerja algoritma
greedy, bukan untuk digunakan pada aplikasi nyata.
B.
12
13
menerapkan
metode
backtracking,
properti
berikut
didefinisikan:
1. 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
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.
3.
Pengorganisasian Solusi
14
15
1
x1 =1
x1 =0
2
x2 =1
9
x2 =0
3
x3 =1
4
x2 =1
6
x3 =0
5
x3 =1
7
x2 =0
13
10
x3 =0
x3 =1
11
x3 =0
12
x3 =1
14
x3 =0
15
16
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
Q
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
A
B
17
C
D
b. Tempatkan queen pada A1.
A
B
C
D
1
Q
c. Satu queen sudah ditempatkan pada A1, selanjutnya penempatan queen pada
baris berikutnya. Langkah yang memungkinkan adalah:
A
B
C
D
1
Q
Langkah A
A
B
C
D
1
Q
4
Q
Langkah B
d. 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.
A
B
C
D
1
Q
4
Q
18
1
A
B
C
D
2
Q
2
Q
2
Q
4
Q
2
Q
4
Q
Q
Q
i. Jadi, solusi untuk pemecahan masalah 4-Queen adalah A2, B4, C1, D3.
Proses backtracking secara lengkap:
19
20
21
22
Objek masalah yang di bagi adalah masukan (input) atau instances yang
berukuran n: tabel (larik), matriks, dan sebagainya, bergantung pada masalahnya.
Tiap-tiap upa-masalah mempunyai karakteristik yang sama (the same type)
dengan karakteristik masalah asal, sehingga metode Divide and Conquer lebih
natural diungkapkan dalam skema rekursif. Sesuai dengan karakteristik
pembagian dan pemecahan masalah tersebut, maka algoritma ini dapat berjalan
baik pada persoalan yang bertipe rekursif (perulangan dengan memanggil dirinya
sendiri). Dengan demikian, algoritma ini dapat diimplementasikan dengan cara
23
iteratif ( perulangan biasa ), karena pada prinsipnya iteratif hampir sama dengan
rekursif. Salah satu penggunaan algoritma ini yang paling populer adalah dalam
hal pengolahan data yang bertipe array ( elemen larik ). Mengapa ? Karena
pengolahan array pada umumnya selalu menggunakan prinsip rekursif atau
iteratif. Penggunaan secara spesifik adalah untuk mencari nilai minimal dan
maksimal serta untuk mengurutkan elemen array. Dalam hal pengurutan ini ada
empat macam algoritma pengurutan yang berdasar pada algoritma Divide and
Conquer, yaitu merge sort, insert sort, quick sort, dan selection sort. Merge sort
dan Quick sort mempunyai kompleksitas algoritma O(n log n). Hal ini lebih baik
jika dibandingkan dengan pengurutan biasa dengan menggunakan algoritma brute
force.
Skema Umum Algoritma Divide and Conquer :
2. Penerapan Algoritma
2.1. Pemecahan Masalah Convex Hull dengan Algoritma Divide and Conquer
Pada penyelasaian masalah pencarian Convex Hull dengan menggunakan
algoritma Divide and Conquer, hal ini dapat dipandang
sebagai generalisasi dari algoritma pengurutan merge sort. Berikut ini merupakan
garis besar gambaran dari algoritmanya:
dengan membagi
kecil, kemudian
independent, dan
sehingga menjadi
Algoritma Divide and Conquer merupakan salah satu solusi dalam penyelesaian
masalah convex hull. Algoritma ini ternyata memiliki kompleksitas waktu yang
cukup kecil dan efektif dalam menyelesaikan permasalahan ini (jika dibandingkan
algoritma lain). Selain itu juga, algoritma ini dapat digeneralisasi untuk
permasalahan convex hull yang berdimensi lebih dari 3.
2.2. Persoalan Minimum dan Maksimum (MinMaks)
Persoalan : Misalnya diketahui table A yang berukuran n eleman sudah berisi nilai
integer. Kita ingin menentukan nilai minimum dan nilai maksimum sekaligus di
dalam table tersebut. Misalkan tabel A berisi elemen-elemen sebagai berikut :
Ide dasar algoritma secara Divide and Conquer :
Ukuran table hasil pembagian dapat dibuat cukup kecil sehingga mencari
minimum dan maksimum dapat diselesaikan (SOLVE) secara lebih mudah. Dalam
hal ini, ukuran kecil yang dipilih adalah 1 elemen atau 2 elemen.
Algoritma MinMaks :
1. Untuk kasus n = 1 atau n = 2,
SOLVE : Jika n = 1, maka min = maks = An. Jika n = 2, maka bandingkan kedua
elemen untuk menentukan min dan maks.
2. Untuk kasus n > 2,
DIVIDE : Bagi dua table A secara rekursif menjadi dua bagian yang
berukuran sama, yaitu bagian kiri dan bagian kanan.
CONQUER : Terapkan algoritma Divide and Conquer untuk masingmasing bagian, dalam hal ini min dan maks dari table bagian kiri
dinyatakan dalam peubah min1 dan maks1, dan min dan maks dari table
bagian kanan dinyatakan dalam peubah min2 dan maks2.
25
26
Persoalan : Diberikan himpunan titik, P, yang terdiri dari n buah titik, (xi,yi), pada
bilangan 2-D. Tentukan jarak terdekat antara dua buah titik di dalam himpunan P.
Jarak dua buah titik p1 = (x1, y1) dan p2 = (x2, y2) :
Penyelesaian dengan Algoritma Divide and Conquer :
a. Asumsi : n = 2k dan titik-titik diurut berdasarkan absis (x).
b. Algoritma Closest Pair :
SOLVE : jika n = 2, maka jarak kedua titik dihitung langsung dengan rumus
Euclidean.
DIVIDE : Bagi titik-titik itu ke dalam dua bagian, PLeft dan PRight, setiap
bagian mempunyai jumlah titik yang sama
CONQUER :Secara rekursif, terapkan algoritma D-and-C pada masingmasing
bagian.
Pasangan titik yang jaraknya terdekat ada tiga kemungkinan letaknya :
Pasangan titik terdekat dipisahkan oleh garis batas L, yaitu satu titik di
PLeft dan satu titik di PRight.
Jika kasusnya adalah (c), maka lakukan tahap COMBINE untuk mendapatkan
jarak dua titik terdekat sebagai solusi persoalan semula.
D.
Programming
(selanjutnya
disebut
DP
saja)
27
f(n3)
dikalkulasikan sebanyak dua kali, dan semakin kita masuk ke dalam pohon
pemanggilan, kita akan melihat semakin banyak fungsi-fungsi yang dipanggil
berkali-kali. Pendekatan DP menghindari kalkulasi fungsi yang berulang kali
seperti ini dengan melakukan memoization, yaitu menyimpan hasil kalkulasi
fungsi tersebut dan menggunakan nilai yang disimpan ketika perhitungan yang
28
sama dibutuhkan kembali. Dengan menyimpan hasil kalkulasi seperti ini, tentunya
jumlah total langkah perhitungan yang harus dilakukan menjadi berkurang.
Misalnya, kita dapat menyimpan hasil kalkulasi dari fungsi fibonacci tersebut
pada sebuah dictionary, seperti berikut:
memo = dict()
def fibonacci_dp(n):
if n in memo.keys():
return memo[n]
elif n <= 2:
hasil = 1
else:
hasil = fibonacci_dp(n - 1) + fibonacci_dp(n - 2)
memo[n] = hasil
return hasil
Dengan menyimpan hasil kalkulasi dari fungsi yang telah ada, maka proses
pemanggilan fungsi akan menjadi seperti berikut:
29
memo = dict()
for i in range(1, n + 1):
if i <= 2:
hasil = 1
else:
hasil = memo[i - 1] + memo[i - 2]
memo[i] = hasil
return memo[n]
Untuk melihat efek langsung dari ketiga fungsi tersebut, coba jalankan ketiga
fungsi tersebut untuk n yang sama, dan lihat perbedaan waktu eksekusinya!
Sebagai latihan tambahan, hitung juga kompleksitas dari ketiga fungsi
perhitungan fibonacci tersebut.
Mari kita rangkum hal yang telah kita pelajari mengenai DP sejauh ini:
1. DP menyelesaikan masalah dengan memecah masalah
menjadi sub-permasalahan.
2. Setiap solusi dari sub-permasalahan yang telah didapatkan
disimpan untuk digunakan kembali jika terdapat subpermasalahan yang sama. Teknik ini dikenal dengan nama
memoization.
3. DP tidak harus menggunakan rekursif. Pemecahan subpermasalahan juga dapat dilakukan dengan iterasi maupun
kalkulasi sederhana.
30
Secara sederhana, algoritma naif untuk melakukan rata penuh teks adalah seperti
berikut:
1. Ambil satu elemen dalam teks, baik berupa kata, simbol, maupun spasi.
Masukkan elemen ini ke dalam baris.
2. Hitung ukuran baris sekarang.
3. Ambil satu elemen lagi dalam teks, dan hitung ukurannya.
4. Tambahkan ukuran baris sekarang dengan ukuran elemen berikutnya.
Hasil pengukuran ini selanjutnya akan disebut Ukuran Baris Selanjutnya
atau UBS.
5. Cek nilai UBS:
1. Jika UBS masih lebih kecil dari lebar halaman, kembali ke langkah
1
2. Jika UBS sudah lebih dari lebar halaman:
1.
32
Hasil algoritma di atas kurang optimal, karena ketika terdapat kata-kata yang
panjang dalam sebuah kalimat, kita terpaksa harus memotong baris terlalu cepat,
dan akhirnya menambahkan banyak spasi. Contoh eksekusi dari algoritma di atas
dapat dilihat pada gambar berikut:
33
Pengukuran tingkat keburukan teks sendiri tentunya ditentukan oleh jumlah ruang
kosong yang ada dari teks sampai ke ujung halaman. Misalnya, pada gambar di
bawah kita dapat melihat contoh ruang kosong dari teks sampai ke ujung halaman:
sebagai awal dan akhir dari kata yang ingin dihitung tingkat keburukannya. Jika
dijadikan kode program, algoritma tersebut dapat dituliskan seperti berikut:
def length(word_lengths, i, j):
return sum(word_lengths[i- 1:j]) + j - i + 1
def break_line(text, L):
# wl = lengths of words
wl = [len(word) for word in text.split()]
# n = number of words in the text
n = len(wl)
# total badness of a text l1 ... li
m = dict()
m[0] = 0
35
s = dict()
for i in range(1, n + 1):
sums = dict()
k = i
while (length(wl, k, i) <= L and k > 0):
# badness calculation
sums[(L - length(wl, k, i))**3 + m[k - 1]] = k
k -= 1
m[i] = min(sums)
s[i] = sums[min(sums)]
return s
Perlu dicatat bahwa kode di atas belum mengikut sertakan spasi dalam
perhitungan, dan juga belum membangun kembali baris-baris yang telah dipecah
menjadi sebuah teks (paragraf).
36
BAB III
PENUTUP
Kesimpulan
Algoritma Simplified-Memory A* bias mengoptimalkan pencarian. Hal ini
dikarenakan algoritma tersebut dapat menyelesaikan solusi dengan menggunakan
solusi yang telah ada sebelumnya. Sedangkan algoritma greedy tidak dapat
memperhitungkan kebenaran biayanya. Seeara optimality, algoritma greedy tidak
selalu dapat menemukan solusi yang terbaik karena diperlukan pengeeekan
langkah langkah algoritma yang berulang-ulang, sehingga tidak menghemat
waktu untuk mendapatkan solusi yang terbaik dan beberapa solusi yang telah
terbentuk. Walaupun greedy eukup terkenal dan favorit untuk kasus penearian
optimasi, tetapi dalam kasus di atas, greedy dengan Greedy-Best First search-nya
masih kurang efektif dibandingkan dengan algoritma Simplified-Memory
Algoritma hanyalah algoritma, yaitu hanyalah sebuah proses yang
mungkin dapat menyelesaikan sebuab masalah. Seperti pengertian heuristik yang
telah dijelaskan sebelumnya. Mungkin jika itu masalah perhitungan soal dapat
diselesaikan. Tetapi jika itu masalah dunia nyata yang tidak akan lepas dan
perubahan seeara dinamis, solusi pun akan cepat bergantian.
Oleh karena itu, pengembangan dan modifikasi algoritma dalam beberapa
kasus sangatlah penting dan patut untuk dieoba.
37
DAFTAR PUSTAKA
https://www.academia.edu/7369726/Backtracking_Algorithm
https://torikiri.wordpress.com/2013/09/10/algoritma-brute-force-dalam-pencarianstring/
http://bertzzie.com/knowledge/analisis-algoritma/Greedy.html
http://azistakata.blogspot.co.id/2014/03/algoritma-branch-and-bound.html
http://bertzzie.com/knowledge/analisis-algoritma/DynamicProgramming.html
https://andikafisma.wordpress.com/algoritma-divide-and-conquer/
38