Dynamic Programming Program dinamik adalah salah satu teknik matematika yang digunakan untuk mengoptimalkan proses pengambilan keputusan secara bertahap ganda. Inti dari teknik ini ialah membagi satu persoalan atas beberapa bagian persoalan (tahap), kemudian memecahkan tiap tahap sampai seluruh persoalan telah terpecahkan. Penggunanan program dinamik untuk mencari bobot minimum dari suatu pohon merentang merupkan salah satu alternatif selain penggunaan algoritma greedy. Prosedur pemecahan persoalan dlam program dinamik dilakukan secara rekursif. Ini berarti bahwa setiap kali diambil keputusan, diperhatikan keadaan yang dihasilkan oleh keputusan sebelumnya.
Terdapat sejumlah berhingga pilihan yang mungkin Program Dinamik (Dynamic Programming) adalah metode pemecahan masalah dengan cara menguraikan solusi menjadi sekumpulan langkah (step) atau tahapan (stage) sedemikian sehingga solusi dari persoalan dapat dipandang dari serangkaian keputusan yang saling berkaitan. Karakteristik penyelesaian masalah dengan algoritma program Dinamik : Terdapat sejumlah berhingga pilihan yang mungkin Solusi pada setiap tahap dibangun dari hasil solusi tahap sebelumnya. Kita menggunakan persyaratan optimasi dankendala untuk membatasi sejumlah pilihan yang harus dipertimbangkan pada satu tahap Program dinamis (dynamic programming) yang ditemukan oleh Richard Bellman pada tahun 1953 merupakan suatu metode penyelesaian masalah di mana solusi persoalan dapat dipandang sebagai serangkaian keputusan yang saling berkaitan. Program dinamis merupakan salah satu metode yang biasanya digunakan untuk menyederhanakan persoalan-persoalan rekursif.
Seperti halnya algoritma greedy, program dinamis juga merupakan suatu ancangan untuk menyelesaikan masalah optimasi. Hanya saja, pada metode greedy hanya satu rangkaian keputusan yang pernah dihasilkan,sedangkan dengan program dinamis lebih dari satu rangkaian keputusan. Program dinamis fokus pada bagian permasalahan yang tumpang-tindih (overlapping subproblems). Rangkaian keputusan dibuat dengan prinsip optimalitas (optimal substructure), dimana solusi optimal dari bagian solusi permasalahan bisa digunakan untuk menemukan solusi optimal untuk masalah secara keseluruhan. Dalam matematika dan ilmu komputer, pemrograman dinamis adalah metode untuk memecahkan masalah yang kompleks dengan membagi mereka ke dalam subproblems yang lebih sederhana. Hal ini berlaku untuk masalah menunjukkan sifat overlapping subproblem yang hanya sedikit lebih kecil dan optimal substruktur (dijelaskan di bawah). Ketika diterapkan, metode ini membutuhkan waktu jauh lebih sedikit daripada metode naif.
Ide kunci di balik pemrograman dinamis adalah cukup sederhana Ide kunci di balik pemrograman dinamis adalah cukup sederhana. Secara umum, untuk memecahkan persoalan yang diberikan, kita perlu untuk memecahkan berbagai masalah (submasalah), kemudian menggabungkan solusi dari submasalah untuk mencapai solusi secara keseluruhan. Seringkali, banyak dari submasalah ini benar-benar sama. Pendekatan pemrograman dinamis berusaha untuk memecahkan setiap subproblem hanya sekali, sehingga mengurangi jumlah perhitungan. Hal ini sangat berguna ketika jumlah subproblems mengulangi secara eksponensial besar. Penerapan program dinamis ini sangat luas. Di antaranya, yang sederhana, adalah untung menghitung angka koefisien binominal. Juga terdapat sejumlah algoritma lain yang didasarkan pada program dinamis, seperti algoritma Cocke-Younger-Kasami (CYK) untuk menentukan apakah string dapat diterima suatu context-free grammar, algoritma Viterbi untuk model hidden Markov, algoritma Earley untuk chart parser, algoritma Needleman-Wunsch yang dipakai dalam bionformatik, algoritma Floyd’s Warshall untuk mencari lintasan terpendek, algoritma Selinger untuk optimal query suatu basis data, algoritma De Boor untuk evaluasi kurva B-spline, dan lain-lain.
Koefisien Binomial (a + b)³ = a³ + 3a²b + 3ab² + b³ Koefisien binomial merupakan bilangan-bilangan yang muncul dari hasil penjabaran penjumlahan dua peubah yang dipangkatkan, misalnya (a + b)ⁿ. Sepintas terlihat bahwa ekspresi (a + b)ⁿ tidak ada hubungannya dengan kombinasi, tetapi kenyataannya kita bisa mendapatkan rumus untuk penjabaran (a + b)ⁿ dengan menggunakan rumus banyaknya kombinasi-r dari n unsur. Teori untuk menurunkan rumus yang diperoleh dari penjabaran (a +b)ⁿ dengan menggunakan kombinasi dikenal dengan Teorema Binomial. Sebelum membahas teorema ini, perhatikan ilustrasi berikut ini. Dalam al-jabar kita tahu bahwa (a + b)³ = a³ + 3a²b + 3ab² + b³ Penjabaran dari (a + b)³ yang merupakan perkalian 3 faktor (a + b), yaitu (a + b)³ = (a + b)(a + b)(a + b) = aaa, aab, aba, abb, baa, bab, bba, bbb Maka akan diperoleh a³, a²b, a²b, ab², a²b, ab², ab², b³ Jika semua suku-suku diatas dijumlahkan, maka hasilnya adalah a³ + 3a²b + 3ab² + b³
(a + b)ⁿ = (a + b)(a + b). . .(a + b) Bilangan 3 yang merupakan koefisien dari a²b muncul dari pemilihan a dari faktor dan b dari 1 faktor sisanya. Hal ini bisa dilakukan dalam C (3, 2) atau C (3, 1) cara. Cara yang sama bisa dilakukan untuk memperoleh koefisien b³ yang dalam hal ini merupakan pemilihan a dari 0 faktor dan b dari 3 faktor lainnya yang dapat dilakuk an dalam C (3, 0) atau C (3, 3) cara, dan seterusnya. Sehingga secara umum koesien-koesien tersebut bisa ditentukan berdasarkan Teorema Binomial berikut ini. Jika a dan b adalah bilangan real dan n adalah bilangan bulat positif, maka (a + b)ⁿ = ∑nk=0 C (n, k)an-k bk Penjabaran dari (a + b)ⁿ merupakan perkalian (a + b) sebanyak n factor yaitu (a + b)ⁿ = (a + b)(a + b). . .(a + b) Koefisien dari an-k bk dapat ditentukan dengan banyaknya cara pemilihan a dari n-k faktor diantara n faktor yang ada atau pemilihan b dari k factor diantara n faktor. Hal ini bisa dilakukan dengan C (n, n-k) atau C (n, k) cara. Penentuan koefisien ini berlaku untuk setiap k = 0, 1. . . n. Sehingga (a + b)ⁿ = C(n, 0)an-0 b0 + C(n, 1)an-1b1 + . . . + C (n, n)an-n bn = ∑nk=0 C (n, k)an-k bk
Contoh : Jabarkan (a + b)4 (a + b)4 = C(4, 0)a4-0b0 + C(4, 1)a4-1b1 + C(4, 2)a4- 2b2 + C(4, 3)a4-3b3 + C(4, 4)a4 -4 b4 =a4+ 4a3b + 6a2b2+ 4ab3+ b4 Tentukan koefisien dari a5b6 dalam penjabaran (a + b)11 C (11, 6) = 11! = 11.10.9.8.7 = 462 5!.6! 5.4.3.2.1
Disamping menggunakan kombinasi, kita juga bisa menentukan koefisien binomial dengan menggunakan segitiga Pascal seperti berikut ini. 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 . . . . . . . Batas dari segitiga Pascal diatas terdiri dari 1 dan nilai-nilai didalamnya merupakan hasil penjumlahan dari dua bilangan diatasnya.
Algoritma Floyd-Warshall Algoritma Floyd-Warshall adalah salah satu varian dari pemrograman dinamis, metode untuk memecahkan masalah pencarian rute terpendek. Metode ini melakukan pemecahan masalah dengan memandang solusi yang akan diperoleh sebagai suatu keputusan yang saling terkait. Artinya solusi-solusi tersebut dibentuk dari solusi yang berasal dari tahap sebelumnya dan ada kemungkinan solusi lebih dari satu. Hal yang membedakan pencarian solusi menggunakan pemrograman dinamis dengan algoritma greedy adalah bahwa keputusan yang diambil pada tiap tahap pada algoritma greedy hanya berdasarkan pada informasi yang terbatas sehingga nilai optimum yang diperoleh pada saat itu Jadi pada algoritma greedy, kita tidak memikirkan konsekuensi yang akan terjadi seandainya kita memilih suatu keputusan pada suatu tahap. Algoritma warshall merupakan algoritma yang mengambil jarak minimal dari suatu titik ketitik lainnya. Pada algoritma ini menerapkan suatu algoritma dinamis yang menyebabkan akan mengambil jarak lintasan terpendek secara benar.
Algoritma warshall disebut juga algoritma dinamis Algoritma warshall disebut juga algoritma dinamis. Karakteristik dari algoritma dinamis: Persoalannya dibagi atas beberapa tahap,yang setiap tahapnya diambil satu keputusan. Masing-masing tahap terdiri dari sejumlah status yang saling berhubungan. Hasil keputusan akan di transformasikan. Ongkos tergantung dari ongkos tahapan yang telah berjalan dan ongkos pada tahap itu sendiri. Keputusan terbaik pada tahap bersifat independen. Terdapat hubungan rekursif yang menyatakan bahwa keputusan terbaik dalam setiap status pada tahap -k.
Contoh apabila kita berada dari suatu tempat di titik A akan menuju tempat yang berada di titik E di mana kita harus melewati minimal satu titik titik antara b,c,d dan f . Apabila kita memakai floyd warshall maka kita harus mentotalkan jumlah jaraknya. a-b-d-e = 10+15+10 =35 km a-d-e = 20+5 =25 km a-c-e = 30+25 =55km a-f-e = 20+25 =45 km Apabila semua nya telah terjumlah, maka jarak minimalnya ada di lintasan a-d-e dengan 25 km, sesuai dengan algoritma floyd warshall.