Anda di halaman 1dari 5

TUGAS RUTIN DESAIN DAN ANALISIS ALGORITMA

Dosen Pengampu : Kana Syaputra, S.Kom

DISUSUN OLEH :

Nama : Beby Yolanda

Nim : 4192550002

Kelas : Ilmu Komputer 19 A

PROGRAM STUDI ILMU KOMPUTER


JURUSAN MATEMATIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS NEGERI MEDAN

2020

ALGORITMA DINAMIC PROGRAMMING


Dynamic Programming merupakan salah satu teknik perancangan algoritma yang
dikembangkan untuk menyelesaikan permasalahan yang sangat kompleks dengan memecah
permasalahan tersebut menjadi banyak sub-permasalahan. Perbedaan utama Dynamic
Programming dengan Divide and Conquer adalah pada Dynamic Programming kita
menggunakan kembali hasil kalkulasi sub-masalah yang telah dilakukan sebelumnya.
Untuk mempermudah penjelasan, mari kita selesaikan masalah sederhana yang telah kita
bahas berkali-kali: perhitungan bilangan fibonacci. Algoritma untuk menyelesaikan perhitungan
fibonacci secara naif adalah seperti berikut:

def fibonacci(n):
if n <= 2:
hasil = 1
else:
hasil = fibonacci(n - 1) + fibonacci(n - 2)

return hasil

Algoritma fibonacci sederhana seperti di atas dapat dikatakan sebagai algoritma D&C,
karena kita membagikan perhitungan fibonacci ke dua fungsi fibonacci, sampai didapatkan nilai
hasil terkecilnya. Pemanggilan fungsi fibonacci di atas dapat digambarkan seperti berikut:

Pemanggilan Fungsi Fibonacci


Perhatikan bagaimana f(n−2)f(n−2) dan f(n−3)f(n−3) 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 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:

Pemanggilan Fungsi Fibonacci Dynamic Programming


Seperti yang dapat dilihat, pohon pemanggilan fungsi terpotong setengahnya! Tentunya
perhitungan fibonacci akan menjadi sangat efisien dengan menggunakan fungsi yang baru ini.
Pendekatan lain dalam menghitung fibonacci lagi, yang masih adalah DP, yaitu dengan
menghitung nilai fibonacci dari bawah pohon (pada kode sebelumnya kita melakukan
perhitungan dari atas pohon):

def fibonacci_dp_bu(n):
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 Dynamic Programming sejauh ini:

1. Dynamic Programming menyelesaikan masalah dengan memecah masalah menjadi sub-


permasalahan.
2. Setiap solusi dari sub-permasalahan yang telah didapatkan disimpan untuk digunakan
kembali jika terdapat sub-permasalahan yang sama. Teknik ini dikenal dengan
nama memoization.
3. Dynamic Programming tidak harus menggunakan rekursif. Pemecahan sub-permasalahan
juga dapat dilakukan dengan iterasi maupun kalkulasi sederha.

Berikut adalah contoh mencari jalur lintas terpendek menggunakan algoritma dynamic.

Mencari jalur lintasan terpendek dari 1 ke 10 dengan Algoritma Dynamic :


Penyelesaian :

Tahap 1 :

S x1 Solusi Optimum
1 F1(s) X1*
2 2 2 1
3 4 4 1
4 3 3 1

Tahap 2 :

S X2 Solusi Optimum
2 3 4 F2(s) X2*
5 9 7 7 7 3 atau 4
6 6 6 4 4 4
7 8 8 8 8 2, 3 atau 4

Tahap 3 :

S X3 Solusi Optimum
5 6 7 F3(s) X3*
8 8 10 11 8 5
9 11 7 11 7 6

Tahap 4 :

S X4 Solusi Optimum
8 9 F4(s) X4*
10 11 11 11 8 atau 9

Maka dapat disimpulkan bahwa jalur terpendek dari 1-10 dengan menggunakan
Algoritma Dynamic adalah 10-8-5-4-1 atau 1-4-5-8-10 dengan cost 11.

Anda mungkin juga menyukai