Algoritma Greedy
Algoritma Greedy
Bahan Kuliah
IF3051 Strategi Algoritma
Persoalan minimasi
Contoh 1: tersedia banyak koin 1, 5, 10, 25
Strategi greedy:
Pada setiap langkah, pilihlah koin dengan nilai
terbesar dari himpunan koin yang tersisa.
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 lelaran, solusi yang terbentuk adalah optimum lokal.
Pada akhir kalang 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).
Deklarasi
S : himpunan_koin
x : koin
Algoritma
S {}
while ((nilai semua koin di dalam S) A) and (C {} ) do
x koin yang mempunyai nilai terbesar
C C - {x}
if ((nilai semua koin di dalam S) + nilai koin x A then
S S {x}
endif
endwhile
i 1
1, 2, 3: 5 + (5 + 10) + (5 + 10 + 3 ) = 38
1, 3, 2: 5 + (5 + 3) + (5 + 3 + 10) = 31
2, 1, 3: 10 + (10 + 5) + (10 + 5 + 3) = 43
2, 3, 1: 10 + (10 + 3) + (10 + 3 + 5) = 41
3, 1, 2: 3 + (3 + 5) + (3 + 5 + 10) = 29 (optimal)
3, 2, 1: 3 + (3 + 10) + (3 + 10 + 5) = 34
============================================
Penyelesaian dengan Exhaustive Search
Deklarasi
S : himpunan_pelanggan
i : pelanggann
Algoritma
S {}
while (C {}) do
i pelanggan yang mempunyai t[i] terkecil
C C - {i}
S S {i}
endwhile
return S
• Agar proses pemilihan pelanggan berikutnya optimal,
urutkan pelanggan berdasarkan waktu pelayanan dalam
urutan yang menaik.
Algoritma:
{pelanggan 1, 2, ..., n sudah diurut menaik berdasarkan ti}
for i1 to n do
write(‘Pelanggan ‘, i, ‘ dilayani!’)
endfor
• Algoritma greedy untuk penjadwalan pelanggan
akan selalu menghasilkan solusi optimum.
T =
k 1 j 1
ti j
i si fi
------------------------
1 1 4
2 3 5
3 4 6
4 5 7
5 3 8
6 7 9
7 10 11
8 8 12
9 8 13
10 2 14
11 13 15
• Apa strategi greedy-nya?
1. Urutkan semua aktivitas berdasarkan waktu
selesai dari kecil ke besar
lebih rumit
i si fi durasi
----------------------------------
1 1 4 3
2 3 5 2
3 4 6 2
4 5 7 2
5 3 8 5
6 7 9 2
7 10 11 1
8 8 12 4
9 8 13 5
10 2 14 12
11 13 15 2
Solusi: aktivitas 7, 2, 4, 6, dan 11
4. Integer Knapsack
n
Maksimasi F = p x i i
i 1
w x K
i 1
i i
2. Greedy by weight.
- Pada setiap langkah, pilih objek yang
mempunyai berat teringan.
- Mencoba memaksimumkan keuntungan
dengan dengan memasukkan sebanyak mungkin
objek ke dalam knapsack.
3. Greedy by density.
- Pada setiap langkah, knapsack diisi dengan objek
yang mempunyai pi /wi terbesar.
- Mencoba memaksimumkan keuntungan dengan
memilih objek yang mempunyai keuntungan
per unit berat terbesar.
n
Maksimasi F = p x i i
i 1
w x K
i 1
i i
Asumsi: Seluruh objek sudah terurut berdasarkan nilai pi/wi yang menurun
}
Deklarasi
i, TotalBobot : integer
MasihMuatUtuh : boolean
x : himpunan_solusi
Algoritma:
for i 1 to n do
x[i] 0 { inisialisasi setiap fraksi objek i dengan 0 }
endfor
i 0
TotalBobot 0
MasihMuatUtuh true
while (i n) and (MasihMuatUtuh) do
{ tinjau objek ke-i }
i i + 1
if TotalBobot + C.w[i] K then
{ masukkan objek i ke dalam knapsack }
x[i] 1
TotalBobot TotalBobot + C.w[i]
else
MasihMuatUtuh false
x[i] (K – TotalBobot)/C.w[i]
endif
endwhile
{ i > n or not MasihMuatUtuh }
return x
Persoalan:
- Ada n buah job yang akan dikerjakan oleh
sebuah mesin;
- tiap job diproses oleh mesin selama 1
satuan waktu dan tenggat waktu (deadline)
setiap job i adalah di 0;
- job i akan memberikan keuntungan sebesar pi
jika dan hanya jika job tersebut diselesaikan
tidak melebihi tenggat waktunya;
48
- Bagaimana memilih job-job yang akan
dikerjakan oleh mesin sehingga keuntungan yang
diperoleh dari pengerjaan itu maksimum?
Maksimasi F = p
iJ
i
49
Contoh 7. Misalkan A berisi 4 job (n = 4):
(p1, p2, p3, p4) = (50, 10, 15, 30)
(d1, d2, d3, d4) = (2, 1, 2, 1)
50
Pemecahan Masalah dengan Exhaustive Search
51
Barisan job Total keuntungan (F) keterangan
{} 0 layak
{1} 50 layak
{2} 10 layak
{3} 15 layak
{4} 30 layak
{1, 2} - tidak layak
{1, 3} 65 layak
{1, 4} - tidak layak
{2, 1} 60 layak
{2, 3} 25 layak
{2, 4} - tidak layak
{3, 1} 65 layak
{3, 2} - tidak layak
{3, 4} - tidak layak
{4, 1} 80 layak (Optimum!)
{4, 2} - tidak layak
{4, 3} 45 layak
52
Pemecahan Masalah dengan Algoritma Greedy
53
Contoh: (p1, p2, p3, p4) = (50, 10, 15, 30)
(d1, d2, d3, d4) = (2, 1, 2, 1)
54
function JobSchedulling1(input C : himpunan_job) himpunan_job
{ Menghasilkan barisan job yang akan diproses oleh mesin }
Deklarasi
i : integer
J : himpunan_job { solusi }
Algoritma
J {}
while C {} do
i job yang mempunyai p[i] terbesar
C C – {i}
if (semua job di dalam J {i} layak) then
J J {i}
endif
endwhile
{ C = {} }
return J
55
6. Pohon Merentang Minimum
1 10 2 1 10 2
50
30 45 40 3 45 3
35 35
4 4
25 25
5 5
20 55 20 55
15 15
6 6
56
(a) Algoritma Prim
58
7. Lintasan Terpendek (Shortest Path)
60
Algoritma Dijkstra
Strategi greedy:
)
bps R o u te r 2 R o u te r 3 (4
50
k km
0
,1 ,3
km 0
kb
0
104 ps
( )
bp s)
(8
, 35 k
90
5 km
(122
km
,1
0
s)
kb
kbp
ps
R o u te r 1 20 R o u te r 6
m,
)
k
(340
(2
)
ps
27
kb
5
km
1
,1
,2
km
5
kb
ps
0
21
)
(1
(3 5 0 k m , 5 k b p s )
R o u te r 5
R o u te r 3
66
Lintasan terpendek (berdasarkan delai):
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
67
Asal Tujuan Via Asal Tujuan Via
2 1 4 4 1 4
2 2 - 4 2 4
2 3 4 4 3 6
2 4 2 4 4 -
2 5 2 4 5 2
2 6 4 4 6 4
(5 6 0 k m , 5 6 k b p s )
)
ps R o u te r 2 R o u te r 4 (4
5
kb 0
km
0
,1 ,3
k m 0
Asal Tujuan Via 0 kb
04 ps
1 1 - (1 )
(8 Asal Tujuan Via
bps) 9
1 2 4 , 35 k 0
km 6 1 4
5 km
1 3 4 (122 ,1
0 6 2 4
1 4 4 kb
ps s) 6 3 6
1 5 4 R o u te r 1
) 20 kbp R o u te r 6
40 km, 6 4 6
1 6 4 (3 6 5 3
(2
s)
27 6 6 -
p
kb
5
km
1
,1
,2
km
5
kb
ps
10
)
2
(1
(3 5 0 k m , 5 k b p s )
R o u te r 5
R o u te r 3
Asal Tujuan Via
Asal Tujuan Via
5 1 2
3 1 6
5 2 5
3 2 6
5 3 5
3 3 -
5 4 2
3 4 6
5 5 -
3 5 3
5 6 3
3 6 3
68
8. Pemampatan Data dengan Algoritma
Huffman
69
Fixed-length code
Karakter a b c d e f
----------------------------------------------------------------
Frekuensi 45% 13% 12% 16% 9% 5%
Kode 000 001 010 011 100 111
70
Variable-length code (Huffman code)
Karakter a b c d e f
------------------------------------------------------------------------
Frekuensi 45% 13% 12% 16% 9% 5%
Kode 0 101 100 111 1101 1100
Nisbah pemampatan:
71
Algoritma Greedy untuk Membentuk Kode Huffman:
72
• Contoh 9.
Karakter a b c d e f
-------------------------------------------------------
Frekuensi 45 13 12 16 9 5
73
1. f:5 e:9 c :1 2 b :1 3 d :1 6 a :4 5
2. c :1 2 b :1 3 fe :1 4 d :1 6 a :4 5
f:5 e:9
3. fe :1 4 d :1 6 c b :2 5 a :4 5
74
4. c b :2 5 fe d :3 0 a :4 5
c:1 2 b :1 3 fe :1 4 d :1 6
f:5 e:9
75
5. c b fe d :5 5 a :4 5
c b :2 5 fe d :3 0
c :1 2 b :1 3 fe :1 4 d :1 6
f:5 e:9
6 a c b fe d :1 0 0
0 1
a :4 5 c b fe d :5 5
0 1
c b :2 5 fe d :3 0
0 1 0 1
c :1 2 b :1 3 fe :1 4 d :1 6
0 1
f:5 e:9 76
9. Pecahan Mesir (Egyptian Fraction)
2 1 1 5 1 1 1 87 1 1 1
Contoh:
5 3 15 7 2 5 70 100 2 5 11
77
• Pecahan yang diberikan mungkin
mempunyai lebih dari satu representasi
Mesir
Contoh: 8/15 = 1/3 + 1/5
8/15 = 1/2 + 1/30
78
Strategi greedy: pada setiap langkah, tambahkan unit
pecahan terbesar ke representasi yang baru terbentuk
yang jumlahnya tidak melebihi nilai pecahan yang
diberikan
Algoritma:
Input: p/q
1. Mulai dengan i = 1
2. Jika p = 1, maka ki = q. STOP
3. 1/ki = pecahan terbesar yang lebih kecil dari p/q
4. p/q = p/q – 1/ki
5. Ulangi langkah 2.
79
• Contoh keluaran:
8/15 = 1/2 + 1/30
80
10. Connecting wires
• There are n white dots and n black dots, equally spaced,
in a line
• You want to connect each white dot with some one black
dot, with a minimum total length of “wire”
• Example: