Nim : 4193250008
SOAL :
Pada prinsipnya Program Dinamis berdasarkan pada Graf multitahap (multistage graph).
Tiap simpul didalam garaf tersebut menyatakan status, sedanagkan V1,V2,… menyatakan
tahap.
Pada Persoalan Graph Multitaphap dikaitkan dengan program dinamis, dikenal :
1.Tahap (k) adalah proses memilih simpul tujuan berikutnya (Gambar 1, ada 5
tahap).
2. Status (s) yang berhubungan dengan masing-masing tahap adalah simpul-simpul
di dalam garaf.
Relasi rekurens berikut menyatakan lintasan terpendek dari status s ke x 4 pada tahap
k:
Dynamic Programming (DP) merupakan salah satu teknik perancangan algoritma yang
dikembangkan untuk menyelesaikan permasalahan yang sangat kompleks dengan memecah
permasalahan tersebut menjadi banyak sub-permasalahan. Perbedaan utama DP dengan Divide
and Conquer (D&C) adalah pada DP kita menggunakan kembali Perbedaan utama dari DP
dengan D&C adalah DP melakukan penyimpanan hasil penyelesaian sub-masalah sehingga
kita tidak perlu menyelesaikan sub-masalah yang sama berulang kali.
Contoh :
Perbedaan Dynamic programming dan Divide and Conquer (D&C) dalam perhitungan
bilangan fibonacci. Algoritma untuk menyelesaikan perhitungan fibonacci secara naif adalah
seperti berikut:
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:
Perhatikan bagaimana f(n−2) dan 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:
Dengan menyimpan hasil kalkulasi dari fungsi yang telah ada, maka proses pemanggilan
fungsi akan menjadi seperti berikut:
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):
Untuk ketiga fungsi tersebut, ketika ketiga fungsi tersebut dijalankan untuk n yang sama, akan
tampak perbedaan waktu eksekusinya.