DYNAMIC PROGRAMMING
Disusun Oleh:
Devis Styo Nugroho
NRP 6022201042
DAFTAR ISI.............................................................................................................................................2
BAB I......................................................................................................................................................4
PENDAHULUAN.....................................................................................................................................4
1.1. Latar Belakang Masalah............................................................................................................4
1.2. Maksud dan Tujuan..................................................................................................................4
1.3. Batasan Masalah.......................................................................................................................4
BAB II.....................................................................................................................................................5
LANDASAN TEORI..................................................................................................................................5
2.1. Definisi Dynamic Programming.................................................................................................5
2.2. Struktur dan Tahapan Dynamic Progamming...........................................................................5
2.3. Kelebihan dan Kekurangan Dynamic Programming..................................................................7
BAB III....................................................................................................................................................8
3.1. Deret Fibonacci.........................................................................................................................8
3.1.1. Algoritma.......................................................................................................................8
3.1.2. Program deret Fibonacci:...............................................................................................9
3.1.3. Output program...........................................................................................................10
3.2. Menghitung Factorial..............................................................................................................11
3.2.1. Algoritma Factorial.......................................................................................................11
3.2.2. Program Faktorial:.......................................................................................................11
3.2.3. Output Program Mencari Nilai Faktorial......................................................................13
3.3. Menghitung Bilangan Pangkat (Power Factor)........................................................................13
3.3.1. Algoritma power factor................................................................................................13
3.3.2. Program menghitung bilangan pangkat.......................................................................14
3.3.3. Output program bilangan pangkat:..............................................................................15
3.4. Greatest Common Divisor (GCD)............................................................................................15
3.4.1. Algoritma GCD.............................................................................................................16
3.4.2. Program GCD...............................................................................................................16
3.4.3. Output program GCD...................................................................................................17
3.5. Binomial Coefficient................................................................................................................17
3.5.1. Algoritma Binomial Coefficient....................................................................................18
3.5.2. Program Binomial Coefficient......................................................................................18
3.5.3. Output Program...........................................................................................................20
Halaman | 2
3.6. Menara Hanoi.........................................................................................................................20
3.6.1. Algoritma Menara Hanoi..............................................................................................21
3.6.2. Program Menara Hanoi................................................................................................22
3.6.3. Output program Menara Hanoi ketika dijalankan:......................................................24
3.7. Knapsack.................................................................................................................................24
BAB IV..................................................................................................................................................25
PENUTUP.............................................................................................................................................25
DAFTAR PUSTAKA................................................................................................................................26
Halaman | 3
BAB I
PENDAHULUAN
Halaman | 4
BAB II
LANDASAN TEORI
Halaman | 5
Gambar 2.1 Struktur dynamic programming
Halaman | 6
Dynamic Programming diformulasikan. Selain itu fingsi transformasi juga menyatakan
tentang hubungan fungsional nilai status pada setiap tahap keputusan. Hubngan status
dalam tahap keputusan yang berurutan bersifat berulang, artinya jika terdapat tahap
keputusan n dalam hubungannya dengan thap keputusan n-1 maka perhitungan untuk
nilai status n-1 menggunakan nilai status n dari keputusan pada tahap n.
BAB III
Halaman | 7
STUDI KASUS
Berikut ini adalah contoh study kasus penyelesaian masalah dengan menggunakan
pendekatan dynamic programming, ditulis dengan menggunakan Bahasa pemrograman C+
+, compiler gcc dan ide codeblock.
3.1.1. Algoritma
Algoritma deret Fibonacci adalah sebagai berikut:
1. Mulai
2. Deklarasi variabel
3. Membuat fungsi menghitung deret fibonacci
4. Menentukan array (memo) untuk menyimpan hasil perhitungan.
5. Masukkan n, yaitu banyaknya bilangan fibonacci yang diinginkan
6. Jika n = 0 maka memo[0] = 0, jika n = 1 maka memo[1] dan jika n = memo [2] = 0
7. Jika n >= 3 perulangan i = 3 dan menghitung memo[i] = memo[i - 1] + memo[i - 2]
8. Return fungsi
9. Cetak nilai variabel fibonacci(i)
Halaman | 8
10. Cetak langkah penyelesaian
11. Tanya apakah pengguna masih ingin menampilkan deret fibonacci
12. Bila iya lanjut ke langkah 5
13. Bila tidak, maka program dapat diakhiri
14. Selesai
//deklarasi variabel
char s = 'y';
int z, k, i;
//program utama
int main()
{
/* perulangan */
do
{
system("cls");
switch (s)
Halaman | 9
{
case 'y':
cout << "Aplikasi menghitung deret Fibonacci\n";
cout << "===================================\n";
cout << " " << endl;
cout << "Masukkan batas deret fibonacci: ";
cin >> k;
cout << "\nDeret fibonacci: ";
for (z = 1; z <= k; z++)
{
cout << " " << fibo(z);
}
cout << "\nfibonacci ke-" << k << " adalah = " << fibo(k) << endl;
cout << " ";
cout << "\nLangkah Penyelesaian: " << endl;
//memanggil fungsi langkah penyelesaian
cout << step(k);
break;
case 'n':
return 0;
}
cout << "\n\nApakah ingin mengulang program? tekan (y/n) " << endl;
z = _getch();
s = char(z);
} while (true);
return 0;
}
Halaman | 10
Berikut adalah contoh factorial:
memo[0] = 1;
for (int i = 1; i <= n; ++i)
{
memo[i] = i * memo[i - 1];
}
}
return memo[n];
}
Halaman | 11
cout << " " << endl;
cout << "Result=> ";
return n;
}
//program utama
int main()
{
do
{
/* code */
system("cls");
switch (s)
{
case 'y':
cout << "\nAplikasi Mencari Nilai Faktorial" << endl;
cout << "==================================\n"
<< endl;
cout << "Masukkan nilai: ";
cin >> n;
//memanggil fungsi langkah penyelesaian
cout << step(n);
return (0);
}
Halaman | 12
3.3. Menghitung Bilangan Pangkat (Power Factor)
Bilangan berpangkat merupakan perkalian berulang suatu bilangan, dimana bilangan dapat
berpangkat bulat positif, nol, maupun bulat negatif. Secara sederhana penulisan bilangan jenis
ini adalah sebagai berikut :
an = a * a n-1
a disebut bilangan pokok atau basis, sedangkan n disebut pangkat atau eksponen.
int a, n, i;
char s = 'y';
Halaman | 13
{
memo[0] = 1;
for (int i = 1; i <= n; i++)
memo[i] = a * memo[a, i - 1];
}
return memo[n];
}
//program utama
int main()
{
ofstream newfile("power_factor.dat", ios::app); //fitur menyimpan log
newfile.is_open();
do
{
system("cls"); //clear terminal
switch (s)
{
case 'y':
cout << "# Aplikasi Menghitung bilangan a pangkat n #" << endl;
newfile << "# Aplikasi Menghitung bilangan a pangkat n #" << endl;
Halaman | 14
return (0);
}
Halaman | 15
3.4.2. Program GCD
#include <iostream>
#include <conio.h>
using namespace std;
char s = 'y';
int a, b, n;
int main()
{
do
{
system("cls"); //clear terminal
switch (s)
{
case 'y':
cout << "=====Aplikasi Menghitung GCD=====" << endl;
cout << " " << endl;
cout << "masukkan bilangan pertama : ";
cin >> a;
cout << "masukkan bilangan kedua : ";
cin >> b;
cout << "Pembagi Terbesar antara " << a << " and " << b << " is " << gcd(a,
b)<<endl;
break;
case 'n':
return 0; //keluar program
}
Halaman | 16
cout << "\nApakah ingin mengulang program? tekan (y/n) " << endl;
n = _getch();
s = char(n);
} while (true);
return 0;
}
Koefisien untuk xn-k yk yaitu sukuk e-(k+1) adalah c(n,k). Bilangan C(n,k) disebut Koefisien Binomial
Halaman | 17
3.5.2. Program Binomial Coefficient
Program ini ditulis dengan menggunakan bahas C++.
#include <iostream>
#include <stdio.h>
#include <conio.h>
int binom = 1;
for (int x = 1; x <= m; x++)
{
// menggunakan rekursif
// B(m, x) = B(m, x - 1) * (m - x + 1) / x
binom = binom * (m - x + 1) / x;
printf("%4d", binom);
}
printf("\n");
}
}
int main()
{
Halaman | 18
do
{
system("cls");
switch (s)
{
case 'y':
cout << "Mencari koefisien Binomial C[n][k]" << endl;
cout << "Masukkan nilai n : ";
cin >> n;
cout << "Masukkan nilai k : ";
cin >> k;
cout << "Nilai dari C[" << n << "][" << k << "] = " << binomialCoeff(n, k) << endl
<< endl;
printbinomial(n);
cout << endl;
break;
case 'n':
return 0; //keluar program
}
cout << "\nApakah ingin mengulang program? tekan (y/n) " << endl;
n = _getch();
s = char(n);
} while (true);
return (0);
}
Halaman | 19
3.6. Menara Hanoi
Menara Hanoi adalah sebuah permainan matematis atau teka-teki. Teka-teki ini
ditemukan Eduard Lucas, ahli matematika Perancis di tahun 1883.
Permainan ini terdiri dari tiga tiang dan sejumlah cakram dengan ukuran berbeda-beda
yang bisa dimasukkan ke tiang mana saja.
Permainan Menara Hanoi dimulai dengan cakram-cakram yang tertumpuk rapi dari
cakram paling besar sampai ke cakram paling terkecil dalam salah satu tiang, sehingga
membentuk kerucut.
Objektif dari permainan Menara Hanoi adalah memindahkan tumpukan n buah cakram
berlubang dari tiang asal ke tiang tujuan dengan memanfaatkan sebuah tiang perantara.
Piringan berukuran tidak sama. Jumlah pemindahan dalam n buah cakram adalah sebanyak
2n-1 kali.
Permainan Menara Hanoi memiliki beberapa aturan yang harus dipatuhi untuk
menyelesaikan teka-teki. Dalam melakukan pemindahan cakram harus mengikuti
aturan berikut:
Hanya satu cakram yang boleh dipindahkan dalam setiap kal perpindahan.
Setiap perpindahan berupa pengambilan cakram teratas dari satu tiang dan
memasukkannya ke tiang lain, di atas cakram lain yang mungkin sudah ada di tiang
tersebut.
Tidak boleh meletakkan cakram di atas cakram lain yang lebih kecil.
Permasalahan Menara Hanoi memiliki empat buah parameter dalam penyelesaiannya, H (n,
a, b, c). Sebanyak n buah cakram harus dipindahkan dari tiang a ke tiang c dengan
memakai bantuan tiang b. Permasalahan utama adalah meminimalkan jumlah pemindahan
yang harus dilakukan agar semua cakram bisa dipindahkan dari tiang a ke tiang b dengan
tetap memenuhi aturan dari permainan atau teka-taki Menara Hanoi.
Ide utama dari penyelesaian permainan Menara Hanoi ini adalah memindahkan
cakram terbesar dari tiang awal ke tiang tujuan. Cakram utama dipindahkan dari tiang a ke
tiang b. Hal ini berarti (n-1) cakram sudah di pindahkan satu per satu dari tiang a ke tiang c.
Halaman | 20
Setelah cakram terbesar dipindahkan ke tiang b, maka perlu dipindahkan (n-1) cakram dari
tiang c ke tiang b secara satu per satu.
Dalam pemrograman dinamis, jika ingin mendapatkan solusi yang optimal dalam suatu
masalah maka perlu didapatkan solusi yang optimal pula dalam sub-masalah yang ada.
Begitu pula dengan permainan Menara Hanoi ini. Untuk mendapatkan solusi optimal dalam
permasalahan utama, maka perlu dicari solusi optimal untuk perpindahan (n-1) cakram dari
tiang c ke tiang b. Maka, akan ada fungsi yang menentukan langkah untuk mendapatkan
jumlah perpindahan minimum yang merupakan solusi optimal dari penyelesaian Menara
Hanoi ini. Fungsi rekursif (fmin) yang diperoleh dari penyelesaian Menara Hanoi
if n = 1, then H(n, a, b, c) = (a dipindahkan ke b)
if n > 1, then H (n, a, b, c) = H (n – 1, a, c, b)
(a dipindahkan ke b)
H (n - 1; c; b; a)
Fungsi rekursif ini akan memrlukan 2n-1 langkah untuk menyelesaikan permasalahan
Menara Hanoi. Langkah tersebut merupakan solusi optimal dari penyelesaian Menara
Hanoi.
Halaman | 21
3.6.2. Program Menara Hanoi
Program Hanoi ditulis dengan c++:
// C++ fungsi rekursif untuk menyelesaikan
// menara hanoi
#include <bits/stdc++.h>
#include <conio.h>
// Program Utama
int main()
{
int i, a, n; // jumlah cakram
a = 2;
do
{
system("cls"); //clear terminal
switch (s)
{
case 'y':
cout << "Tower Of Hanoi" << endl;
cout << "++++++++++++++" << endl;
Halaman | 22
cout << "masukkan jumlah cakram: ";
cin >> n;
cout << "\nTerdapat " << step(a, n) - 1 << " langkah penyelesaian\n"
<< endl;
return 0;
}
3.7. Knapsack
Knapsack adalah suatu permasalahan dalam menentukan pemilihan objek dari
sekumpulan objek yang masing-masing mempunyai bobot/berat (weight) dan nilai/profit
(value) untuk dimuat dalam sebuah media penyimpanan tanpa melebihi kapasitas media
penyimpanan tersebut sehingga diperoleh hasil yang optimum. Seringkali hasil yang dicari
tersebut merupakan keuntungan maksimum. Contoh kasusnya adalah seorang penjual yang
sedang memilih berbagai macam barang dagangan miliknya untuk dimasukkan ke dalam
tasnya seperti sketsa gambar berikut ini:
Halaman | 23
Sumber : https://en.wikipedia.org/wiki/Knapsack_problem
Permasalahan pada gambar di atas adalah memilih barang yang akan dimasukkan dalam tas
dengan kapasitas(M) sebesar15 Kg dengan jumlah objek dagangan(n) sebanyak 5 jenis
barang dengan berat masing-masing(Wi) dan keuntungan per barang(Pi) dalam (Wi,Pi)
sebesar : (1,2) , (12,4), (2,2), (1,1) dan (4,10).
Permasalahan knapsack yang dipakai bisa terbagi menjadi dua, yakni 0/1 knapsack dan
fractional knapsack. Persoalan 0/1 knapsack adalah menentukan objek mana saja yang harus
dimuat dan tidak dimuat. Sedangkan dalam fractional knapsack persoalannya adalah
menentukan berapa bagian dari masing-masing objek yang akan dimuat dalam media
penyimpanan.
Terkadang keterbatasan manusia dalam menyelesaikan masalah knapsack tanpa
menggunakan alat bantu merupakan salah satu kendala dalam pencarian solusi optimum.
Apalagi jika dihadapkan dengan jumlah objek yang terlampau banyak. Efisiensi waktu juga
sering menjadi pertimbangan. Oleh karena itu, dibutuhkan suatu metode sekaligus program
aplikasi penerapan metode tersebut yang dapat membantu menyelesaikan masalah knapsack.
Beberapa algoritma atau metode seperti Algoritma Genetik, Algoritma Branch and Bound,
Algoritma Greedy, Algoritma Simpleks, dan Algoritma Program Dinamis dapat dipilih untuk
membantu menyelesaikan permasalahan. Contoh program dari Knapsack dengan
menggunakan C++ sebagai berikut:
//Knapsack rekursif
#include <bits/stdc++.h>
using namespace std;
// Basis
if (n == 0 || W == 0)
return 0;
// solusi optimal
if (wt[n] > W)
return napsack(W, wt, val, n – 1);
Halaman | 24
// Pengembalian nilai apabila telah maksimum
else
return max(
val[n] + napsack(W – wt[n],
wt, val, n – 1),
napsack(W, wt, val, n – 1));
}
Output Program:
Halaman | 25
BAB IV
PENUTUP
Kesimpulan
Berdasarkan studi kasus sebelumnya, kita dapatkan bahwa penyelesaian masalah
dapat dilakukan dengan pendekatan pemrograman dinamis atau dynamic programming.
Pemrograman Dinamis memiliki strategi penyelesaian dengan cara membagi masalal ke
dalam beberapa submasalah.
Dari masing-masing sub-masalah kemudian didapatkan solusi optimal. Dari masing-masing
sub-solusi kemudian digabungkan untuk menjadi solusi optimal dari permasalahan utama.
Halaman | 26
DAFTAR PUSTAKA
Halaman | 27