(Dijkstra’s algorithm & Huffman
code) – week 9
• Algoritma greedy merupakan metode yang paling populer untuk memecahkan persoalanoptimasi.
• Persoalan optimasi (optimization problems):
➔ persoalan mencari solusi optimum.
• Hanya ada dua macam persoalan optimasi:
1. Maksimasi (maximization)
2. Minimasi (minimization)
Contoh persoalan optimasi:
( Persoalan Penukaran Uang):
Diberikan uang senilai A. Tukar A
dengan koin-koin uang yang ada.
Berapa jumlah minimum koin
yang diperlukan untuk penukaran
tersebut?
➔ Persoalan minimasi
Contoh 1: tersedia banyak koin 1, 5, 10, 25
• Uang senilai A = 32 dapat ditukar dengan
banyak cara berikut:
32 = 1 + 1 + … + 1 (32 koin)
32 = 5 + 5 + 5 + 5 + 10 + 1 + 1 (7 koin)
32 = 10 + 10 + 10 + 1 + 1 (5 koin)
… dst
• Minimum: 32 = 25 + 5 + 1 + 1 (4 koin)
• Greedy = rakus, tamak, loba, …
• Prinsip greedy: “take what you can get now!”.
• Algoritma greedy membentuk solusi langkah per langkah (step by step).
• Pada setiap langkah, terdapat banyak pilihan yang perlu dieksplorasi.
• Oleh karena itu, pada setiap langkah harus dibuatkeputusan yang terbaik dalam menentukan pilihan.
• Pada setiap langkah, kita membuat pilihan optimum
lokal (local optimum)
• dengan harapan bahwa langkah sisanya mengarah ke
solusi optimum global (global optimum).
• Algoritma greedy adalah algoritma yang memecahkan masalah langkah per langkah;
pada setiap langkah:
1. mengambil pilihan yang terbaik yang
dapat diperoleh pada saat itu tanpa
memperhatikan konsekuensi ke depan
(prinsip “take what you can get now!”)
2. berharap bahwa dengan memilih optimum
lokal pada setiap langkah akan berakhir
dengan optimum global.
• Tinjau masalah penukaran uang:
Strategi greedy:
Pada setiap langkah, pilihlah koin dengan nilai
terbesar dari himpunan koin yang tersisa.
• Misal: A = 32, koin yang tersedia: 1, 5, 10, dan 25
Langkah 1: pilih 1 buah koin 25 (Total = 25)
Langkah 2: pilih 1 buah koin 5 (Total = 25 + 5 = 30)
Langkah 3: pilih 2 buah koin 1 (Total = 25+5+1+1= 32)
• Solusi: Jumlah koin minimum = 4 (solusi optimal!)
Elemen-elemen algoritma greedy:
1. Himpunan kandidat, C.
2. Himpunan solusi, S
3. Fungsi seleksi (selection function)
4. Fungsi kelayakan (feasible)
5. Fungsi obyektif
Dengan kata lain:
algoritma greedy melibatkan pencarian sebuah himpunan bagian, S, dari himpunan kandidat, C;
yang dalam hal ini, S harus memenuhi beberapa kriteria yang ditentukan, yaitu menyatakan suatu solusi dan S dioptimisasi oleh fungsi obyektif.
Pada masalah penukaran uang:
• Himpunan kandidat (C): himpunan koin yang merepresentasikan nilai 1, 5, 10, 25, paling sedikitmengandung satu koin untuk setiap nilai.
• Himpunan solusi (S): total nilai koin yang dipilih tepatsama jumlahnya dengan nilai uang yang ditukarkan.
• Fungsi seleksi: pilihlah koin yang bernilai tertinggi darihimpunan kandidat yang tersisa.
• Fungsi layak: memeriksa apakah nilai total darihimpunan koin yang dipilih tidak melebihi jumlah uangyang harus dibayar.
• Fungsi obyektif: jumlah koin yang digunakan minimum.
Skema umum algoritma greedy:
function greedy(input C: himpunan_kandidat)→ himpunan_kandidat { Mengembalikan solusi dari persoalan optimasi dengan algoritma greedy
Masukan: himpunan kandidat C
Keluaran: himpunan solusi yang bertipe himpunan_kandidat
}
Deklarasi
x : kandidat
S : himpunan_kandidat
Algoritma:
S {} { inisialisasi S dengan kosong }
while (not SOLUSI(S)) and (C {} ) do
x SELEKSI(C) { pilih sebuah kandidat dari C}
C C - {x} { elemen himpunan kandidat berkurang satu }
if LAYAK(S {x}) then
S S {x}
endif
endwhile
{SOLUSI(S) or C = {} }
if SOLUSI(S) then
return S
else
write(’tidak ada solusi’)
endif
• Pada akhir setiap iterasi, solusi yang terbentuk adalah optimum lokal.
• Pada akhir loop while-do diperoleh optimum global.
• Warning: Optimum global belum tentu merupakan solusi optimum (terbaik), tetapi sub-optimum atau pseudo-optimum.
• Alasan:
1. Algoritma greedy tidak beroperasi secara menyeluruh
terhadap semua alternatif solusi yang ada
(sebagaimana pada metode exhaustive search).
2. Terdapat beberapa fungsi SELEKSI yang berbeda,
sehingga kita harus memilih fungsi yang tepat jika kita
ingin algoritma menghasilkan solusi optiamal.
• Jadi, pada sebagian masalah algoritma greedy tidak selalu berhasil memberikan solusi yang optimal.
• Contoh 2: tinjau masalah penukaran uang.
(a) Koin: 5, 4, 3, dan 1
Uang yang ditukar = 7.
Solusi greedy: 7 = 5 + 1 + 1 ( 3 koin) → tidak optimal
Solusi optimal: 7 = 4 + 3 ( 2 koin)
(b) Koin: 10, 7, 1
Uang yang ditukar: 15
Solusi greedy: 15 = 10 + 1 + 1 + 1 + 1 + 1 (6 koin)
Solusi optimal: 15 = 7 + 7 + 1 (hanya 3 koin)
(c) Koin: 15, 10, dan 1
Uang yang ditukar: 20
Solusi greedy: 20 = 15 + 1 + 1 + 1 + 1 + 1 (6 koin)
Solusi optimal: 20 = 10 + 10 (2 koin)
• Algoritma Dijkstra
• Huffman code
• Algoritma Prims & Kruskal
• Knapsack Integer
• …
Introduction to Graph Algorithm
Definisi: Dijkstra’s Algorithm
• Algoritma Dijkstra’s merupakan metode umum yang digunakan untuk menyelesaikan masalah “shortest-path”
• Algoritma Dijkstra’s merupakan salah satu contohalgoritma “greedy”
• Algoritma “greedy” menyelesaikan masalah yang ada pada suatu tahap dengan mengerjakan langkahterbaik pada setiap tahapnya.
Edsger W. Dijkstra (1930–2002)
• Edsger Wybe Dijkstra was one of the most influential members of computing science's founding generation. Among the domains in which his scientific contributions are fundamental are
• algorithm design
• programming languages
• program design
• operating systems
• distributed processing
In addition, Dijkstra was intensely interested in teaching, and in the
relationships between academic computing science and the software
industry. During his forty-plus years as a computing scientist, which included
positions in both academia and industry, Dijkstra's contributions brought
him many prizes and awards, including computing science's highest honor,
the ACM Turing Award.
Sumber: http://www.cs.utexas.edu/users/EWD/
procedure Dijkstra (input G: weighted_graph, input a: intial_vertex, output L : array [1..n] of real)
{ Mencari lintasan terpendek dari simpul a ke semua simpul lain di dalam graf berbobot G.
Masukan: graf-berbobot yang terhubung, G = (V, E) dengan V= n
Luaran: L[1..n], L[i] berisi panjang terpendek dari simpul a ke simpul vi }
{ himpunan solusi untuk mencatat simpul-simpul yang sudah dipilih di dalam tur }
Deklarasi:
i : integer
u, v : vertex
S : set of vertex
Algoritma
for i1 to n
L(vi)
endfor
L(a) 0 { jarak dari a ke a adalah 0 }
S { }
for k 1 to n do
u pilih simpul yang belum terdapat di dalam S dan memiliki L(u) minimum
S S {u} { masukkan u ke dalam S }
for semua simpul v yang tidak terdapat di dalam S
{ update jarak yang baru dari a ke v }
{ jarak dari a ke u ditambah bobot sisi dari u ke v lebih kecil dari jarak a ke v }
{ jarak dari a ke v yang baru diganti dengan L(u) + G(u, v) }
if L(u) + G(u, v) < L(v) then
L(v) L(u) + G(u, v)
endif
endfor
enfor20
(Sumber: Rosen, Discrete Mathematics and Its Application, 7th Edition)
Penyelesaian:
Jadi, lintasan terpendek (dimulai dari lintasan yang bobot terkecil) dari:a ke c adalah a, c dengan bobot = 2a ke b adalah a, c, b dengan bobot = 3a ke d adalah a, c, b, d dengan bobot = 8a ke e adalah a, c, b, d, e dengan bobot = 10a ke z adalah a, c, b, d, e, z dengan bobot = 13
28Mencari lintasan terpendek dari router asal ke router tujuan dapat diartikansebagai menentukan lintasan terpendek dari simpul asal ke simpul tujuan didalam jaringan komputer.
Router 1
29
Router Asal Router Tujuan Lintasan Terpendek
1 1 -
2 1, 4, 2
3 1, 4, 6, 3
4 1, 4
5 1, 4, 2, 5
6 1, 4, 6
2 1 2, 4, 1
2 -
3 2, 4, 6, 3
4 2, 4
5 2, 5
6 2, 4, 6
3 1 3, 6, 4, 1
2 3, 6, 4, 2
3 -
4 3, 6, 4
5 3, 5
6 3, 6
4 1 4, 1
2 4, 2
3 4, 6, 2
4 4, 6, 3
5 4, 2, 5
6 4, 6
Router 1
30
Router1
Huffman Code’s
Dari Teori Shannon :
Sebuah source data dapat dikodekan dengan rata-rata
panjang kode mendekati entropy dari source data
Tahun 1952 D.A.Huffman mengajukan teknik encoding
untuk menghasilkan panjang kode terpendek dari suatu
source data dengan memanfaatkan probabilitasnya.
Sejarah Huffman Code’s
Diciptakan oleh David A. Huffman pada tahun 1951 sebagai tugas kuliah ketika di Massachusetts Institute of Technology (MIT).
Dosen pengajar Huffman (bernama Robert M. Fano) menawarkan kepada para mahasiswanya bahwa siapa saja yang dapat menulis sebuah artikel tentang membangun pohon biner yang efisien akan mendapatkan nilai bagus tanpa harus menempuh ujian.
Setelah lama mencoba dan hampir menyerah, Huffman akhirnya menemukan sebuah metode untuk membangun pohon biner berdasarkan frekuensi.
Tekniknya kemudian diakui sebagai teknik yang paling efisien, melebihi teknik buatan sang dosen sendiri.
Binary Tree (pohon biner) yang dibuat oleh Huffman (disebut sebagai Huffman Tree) adalah dasar dari kompresi data dengan format ZIP yang kita kenal sekarang.
Teknik ini juga dipakai sebagai salah satu algoritma penyusun format file gambar JPEG dan format file musik populer MP3.
Jadi, bila kita sekarang bisa mendengarkan MP3 player kita sambil berkegiatan, salah satu faktor yang membuat teknologi ini ada adalah algoritma Huffman.
Algoritma dalam pseudo code
1. Hitunglah probabilitas dari setiap simbol yang ada
2. Pasangkan setiap <simbol,probabilitas> dengan node
3. Temukan 2 buah node dengan probabilitas terendah kemudian
buatkah node parent dengan probabilitas gabungan dari 2
anaknya
4. Berikan label untuk cabang dari anak ke parent dengan 0 dan 1
(sebaiknya konsisten)
5. Update node (node anak diabaikan), lalu periksa jumlah node
yang ada, bila jumlah node > 1 maka ulangi langkah 3
6. Untuk menemukan kode setiap simbol, lakukan traverse dari root
ke leaf, (label branch yang dilalui akan menjadi kode untuk leaf)
Algoritma Huffman Code’s
Huffman Code’s
Misalkan:
Data = “hello world”
Code:
h → 000
e → 001
l → 010
o → 011
<space> → 100
w → 101
r → 110
d→ 111
‘binary code’ adalah cara untuk
merepresentasikan data (seperti gambar,
musik atau text)
Huffman Code’s
Kita akan meng’coding’ suatu pesan text dengan menggunakan huruf. Kita dapat memilih
‘code’ untuk setiap huruf yang ada dengan menggunakan 3 bit untuk setiap karakter nya
(ada 8 karakter).
Code:
h → 000
e → 001
l → 010
o → 011
<space> → 100
w → 101
r → 110
d→ 111
“hello world” → 000 001 010 010
011 100 101 011 110 111
Encode:
11 karakter x 3 bit = 33 bit
Huffman Code’s
Frekuensi
kemunculan:
H → 1
E → 1
L → 3
O → 2
_ → 1
W → 1
R → 1
D → 1
P. Queue
H → 1
E → 1
_ → 1
W → 1
R → 1
D → 1
O → 2
L → 3
1. Hapus dua item yang berada di paling atas
P. Queue
_ → 1
W → 1
R → 1
D → 1
O → 2
L → 3
2. Gabungkan keduanya kedalam bentuk tree
HE
H E
3. Masukkan kembali item yang telah
dikombinasikan kedalam queue
Frekuensi HE = frekuensi H + frekuensi E
Urutan dalam queue adalah
karakter dengan nilai
frekuensi terkecil sampai
terbesar
Huffman Code’s
P. Queue
_ → 1
W → 1
R → 1
D → 1
O → 2
HE → 2
L → 3
1. Hapus dua item yang berada di paling atas
P. Queue
R → 1
D → 1
O → 2
HE →2
L → 3
2. Gabungkan keduanya kedalam bentuk tree
_W
_ W
3. Masukkan kembali item yang telah
dikombinasikan kedalam queue
Frekuensi _W = frekuensi _ + frekuensi W
P. Queue
R → 1
D → 1
O → 2
HE → 2
_W → 2
L → 3
Huffman Code’s
P. Queue
O → 2
HE → 2
_W → 2
L → 3
2. Gabungkan keduanya kedalam bentuk tree
RD
R D
3. Masukkan kembali item yang telah
dikombinasikan kedalam queue
Frekuensi RD = frekuensi R + frekuensi
1. Hapus dua item yang berada di paling atas
P. Queue
O → 2
HE → 2
_W → 2
RD → 2
L → 3
Huffman Code’s
P. Queue
_W → 2
RD → 2
L → 3
2. Gabungkan keduanya kedalam bentuk tree
OHE
O HE
3. Masukkan kembali item yang telah
dikombinasikan kedalam queue
Frekuensi OHE = frekuensi O + frekuensi HE
1. Hapus dua item yang berada di paling atas
H E
P. Queue
_W → 2
RD → 2
L → 3
OHE → 4
P. Queue
L → 3
OHE → 4
2. Gabungkan keduanya kedalam bentuk tree
_WR
D
_
WRD
3. Masukkan kembali item yang telah
dikombinasikan kedalam queue
Frekuensi _WRD = frekuensi _W + frekuensi RD
R D
1. Hapus dua item yang berada di paling atas
Huffman Code’s
_ W
P. Queue
L → 3
OHE → 4
_WRD →
4
Huffman Code’s
P. Queue
_WRD →
42. Gabungkan keduanya kedalam bentuk tree
LOHE
L OHE
3. Masukkan kembali item yang telah
dikombinasikan kedalam queue
Frekuensi LOHE = frekuensi L + frekuensi OHE
O HE
1. Hapus dua item yang berada di paling atas
H E
P. Queue
_WRD →
4
LOHE → 7
Huffman Code’s
2. Gabungkan keduanya kedalam bentuk tree
LOHE
L OHE
O HE
H E
1. Hapus dua item yang berada di paling atas
P. Queue
_WR
D
_
WRD
R D_ W
_WR
DLOH
E
Huffman Code’s
LOHE
L OHE
O HE
H E
_WR
D
_
WRD
R D_ W
_WR
DLOH
E
Generate Huffman Code’s
LOHE
L OHE
O HE
H E
_WR
D
_
WRD
R D_ W
_WR
DLOH
E0 1
0 1
0 0
0
0
0
1
1
1
11
Telusuri
kebawah
R = 010
Panjang 2 bit:
L = 10
Panjang 3 bit:
_ = 000
W = 001
R = 010
D = 011
O = 110
Panjang 4 bit:
H = 1110
E = 1111
Huffman Code’sCODE:
Huffman Code’s
Hasil kompresi:
H = 4 bit
E = 4 bit
L = 2 bit
L = 2 bit
O = 3 bit
_ = 3 bit
W = 3 bit
O = 3 bit
R = 3 bit
L = 2 bit
D = 3 bit
Total jumlah bit hasil kompresi
adalah:
32 bit
Dimana sebelum kompresi
memori yang dibutuhkan
untuk menyimpan file text
HELLO_WORD adalah
sejumlah 33 bit.