Anda di halaman 1dari 26

1

5 . M O N T E C A R L O
5.1. Metode Monte Carlo

Metode pencarian acak adalah suatu metode dimana solusi dicari secara
acak dan diulang-ulang sampai dihasilkan solusi yang diharapkan.
Misalkan dicari suatu angka antara 0 sampai dengan 100, maka akan
diacak angka-angka antara 0 dan 100 sampai didapatkan angka yang
dimaksud. Metode ini tampak sangat sederhana, karena hanya
diperlukan bagaimana suatu solusi dinyatakan dan kemudian
mengacak nilainya hingga diperoleh nilai yang diharapkan dari model
solusi yang ada.

Metode pencarian acak ini menjadi tidak popular karena hasilnya
memang tidak bagus, tetapi sudah merupakan konsep dasar yang
menarik untuk dibahas. Ada beberapa hal yang perlu diperbaiki dari
konsep pencarian acak ini, antara lain:

Tidak semua nilai pada solusi harus diubah pada setiap iterasi. Bila sudah
solusi mendekati target tidak perlu perubahan yang terlalu besar.
Perlu pertimbangan bahwa munculnya bilangan acak sangat tergantung
pada distribusi bilangan acak yang digunakan (lihat bab 4).
2
5 . 1 . M e t o d e M o n t e C a r l o
Metode Monte Carlo memperbaiki metode pencarian acak ini dengan
mempertimbangkan kedua hal di atas, sehingga metode ini menjadi
metode simulasi yang banyak digunakan. Metode Monte Carlo
sebenarnya merupakan metode pencarian acak, tetapi dengan
beberapa perbaikan, yaitu: tidak semua nilai pada solusi diacak
ulang, tetapi dipilih satu nilai saja di antara barisan nilai solusi,
dan kemungkinan acak dari setiap kejadian solusi. Sebagai contoh,
pada pencarian kata setiap iterasi hanya mengubah satu nilai saja dari
kelima nilai yang ada dalam satu solusi. Bila pada solusi hanya
mengandung satu nilai saja maka metode Monte Carlo ini sama
dengan metode pencarian acak.

Beberapa impelementasi dasar dari Monte Carlo dalam proses simulasi
adalah sebagai berikut:
Metode Rejection pada pembangkitan bilangan acak yang berdistribusi
non-uniform seperti telah dibahas pada bab 4.
1. Menghitung nilai p.
2. Menghitung nilai integral
3. Pencarian Acak Dengan Monte Carlo
3
5. 2. Mont e Car l o Unt uk Menghi t ung Ni l ai p
Perhatikan lingkaran dengan jari-jari 1, maka dapat dikatakan bahwa luas
lingkaran tersebut adalah p. Bila kita mengacak pasangan (x,y) dengan
bilangan acak [0,1] maka kita cukup memandang pada kuadran I pada
bujursangkar luar dari lingkaran berjari-jari 1 maka kemungkinan titik (x,y)
berada dalam lingkaran adalah:













1
-1
-1
1
4
Dengan kata lain bila dibangkitkan N pasang pasangan korrdinat (x,y)
dengan bilangan acak [0,1] maka ada m=Np/4 pasangan yang
berada dalam lingkaran pada kuadran I. Aturan ini bisa dikatakan
bahwa: nilai t dapat dihitung dengan:





dimana m adalah jumlah titik acak [0,1] yang masuk dalam lingkaran,
dan N adalah jumlah titik yang dibangkitkan.

dimana m adalah jumlah titik acak [0,1] yang masuk dalam lingkaran,
dan N adalah jumlah titik yang dibangkitkan.

Implementasi Monte Carlo untuk menghitung nilai p dalam MATLAB
adalah sebagai berikut:
N
m 4
= t
5. 2. Mont e Car l o Unt uk Menghi t ung Ni l ai p
5
% Memasukkan jumlah titik yang diacak
n=input('Jumlah titik acak = ');
% Mengacak n buah titik
x=rand(1,n);
y=rand(1,n);
% Menghitung jumlah titik
% yang masuk daerah lingkaran
p=(y<(1-x.^2).^0.5);
m=sum(p);
% Menghitung dan menampilkan nilai pi
mpi=4*m/n;
fprintf('pi = %1.5f\n',mpi);

Simpan dalam file hitungpi.m, kemudian jalankan program ini.
Beberapa hasil dari program ini adalah:
5. 2. Mont e Car l o Unt uk Menghi t ung Ni l ai p
6
Jumlah titik acak = 10 pi = 3.20000
Jumlah titik acak = 100 pi = 2.88000
Jumlah titik acak = 1000 pi = 3.15200
Jumlah titik acak = 2000 pi = 3.13800
Jumlah titik acak = 2500 pi = 3.11840
Jumlah titik acak = 4000 pi = 3.12800
Jumlah titik acak = 10000 pi = 3.15760
Jumlah titik acak = 20000 pi = 3.12640
Jumlah titik acak = 50000 pi = 3.13600
Jumlah titik acak = 100000 pi = 3.13876
Jumlah titik acak = 250000 pi = 3.14133
Jumlah titik acak = 500000 pi = 3.14120
Jumlah titik acak = 1000000 pi = 3.14156


Memang dibutuhkan jumlah titik yang besar untuk dapat mendekati nilai
p yang sebenarnya. Tetapi ide ini merupakan ide dasar pencarian
yang sangat bagus.
5. 2. Mont e Car l o Unt uk Menghi t ung Ni l ai p
7
Persoalan menghitung integral adalah persoalan dasar dalam kalkulus,
tetapi ternyata tidak semua fungsi dapat dihitung integralnya dengan
mudah. Metode Monte Carlo dapat digunakan untuk menghitung
integral dengan menghitung jumlah titik yang berada di dalam suatu
kawasan fungsi f(x) pada interval yang ditentukan.















5. 3. Mont e Carl o Unt uk Menghi t ung I nt egral
8
5. 3. Mont e Carl o Unt uk Menghi t ung I nt egral
Untuk menghitung integral f(x) dari [a,b] dengan menggunakan metode
Monte Carlo, maka dibangkitkan pasangan (x,y) secara acak dengan
nilai x=[a,b] dan nilai y=[0,1], Hitung jumlah titik (x,y) dimana y<f(x)
dengan f(x) didefinisikan












Nilai integral dapat dihitung dengan :

dimana : M=jumlah titik yang terletak di dalam fungsi f(x)
N=jumlah titik yang dibangkitkan
N
M
I =
9
5. 3. Mont e Carl o Unt uk Menghi t ung I nt egral
Contoh 5.1.

Menghitung nilai:

Implementasi Monte Carlo untuk menghitung integral di atas dalam MATLAB
adalah:

% Memasukkan jumlah titik yang diacak
n=input('Jumlah titik acak = ');
% Mengacak n buah titik
x=rand(1,n);
y=rand(1,n);
% Menghitung jumlah titik
% yang masuk daerah integral fungsi
p=(y<x.*exp(-x));
m=sum(p);
% Menghitung dan menampilkan nilai integral
L=m/n;
fprintf('Integral = %1.5f\n',L);
}

1
0
2
. dx e x
x
10
5. 3. Mont e Carl o Unt uk Menghi t ung I nt egral
Simpan dalam file integral1.m, kemudian jalankan. Salah satu contoh
hasilnya adalah sebagai berikut:
Jumlah titik acak = 10 Integral = 0.40000
Jumlah titik acak = 1000 Integral = 0.26800
Jumlah titik acak = 1500 Integral = 0.24800
Jumlah titik acak = 2000 Integral = 0.26950
Jumlah titik acak = 5000 Integral = 0.26440
Jumlah titik acak = 10000 Integral = 0.26470
Jumlah titik acak = 50000 Integral = 0.26316
Jumlah titik acak = 100000 Integral = 0.26270
Jumlah titik acak = 500000 Integral = 0.26416
Jumlah titik acak = 1000000 Integral = 0.26451

Hasil eksak dari nilai integral di atas adalah sebagai berikut:





| | ( ) | | 0.2642 1
1 1
1
0
1
0
= = =
=
}
e e e xe dx xe
x x x
11
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Metode paling sederhana dalam menyelesaikan suatu
permasalahan tanpa harus melibatkan banyak
operasional matematis dan struktur data yang rumit
adalah metode pencarian secara acak, dimana suatu
penyelesaian diperoleh dengan mencoba-coba (trial and
error) dengan memanfaatkan bilangan acak. Misalkan
untuk mencari nilai terbesar dari f(x,y)=x*exp(-y) dapat
dihitung dengan mengacak pasangan nilai (x,y), dan
hitung nilai f(x,y), kemudian acak lagi pasangan nilai
(x,y) dan hitung nilai f(x,y), bila f(x,y) yang baru lebih
besar dicatat demikian seterusnya sehingga diperoleh
f(x,y) yang paling besar.

Algoritma dari pencarian acak untuk mencari nilai
maksimal suatu fungsi f(x) dari barisan nilai x=[xk ]
dapat dituliskan sebagai berikut:
12
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )

Acak satu penyelesaian x yang mungkin.
Hitung nilai fungsi dari penyelesaian tersebut f(x)
anggap sebagai f_maksimal
Acak lagi satu penyelesaian yang mungkin, dengan
mengubah satu atau beberapa bagian kejadian
pada ruang solusi.
Hitung nilai fungsi dari penyelesaian tersebut f(x)
Bila f(x)>f_maksimal maka f_maksimal=f(x)
Ulangi langkah 2 sampai dinyatakan stop dengan
kriteria stop yang ditentukan. Kriteria stop yang
banyak dilakukan adalah jumlah iterasi atau nilai
maksimal acuan.


13
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Contoh 5.1.

Mencari nilai maksimum dari fungsi:
dimana

Sebelum mencari penyelesaiannya sebaiknya terlebih dahulu
digambarkan fungsi ini dengan cara:
>> x=0:0.1:2;
>> y=x.*exp(-2*x);
>> plot(x,y), grid
x
xe x f
2
) (

=
2 0 s s x
Dari grafik di atas, terlihat
bahwa nilai maksimum sekitar
0.18 sampai dengan 2, yang
terjadi di nilai x sekitar 0.4
sampai dengan 0.6.
Implementasi pencarian acak
dalam MATLAB untuk mem-
peroleh nilai maksimum dari
fungsi f(x).
14
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Contoh 5.1.

Mencari nilai maksimum dari fungsi:
dimana

Sebelum mencari penyelesaiannya sebaiknya terlebih dahulu
digambarkan fungsi ini dengan cara:
>> x=0:0.1:2;
>> y=x.*exp(-2*x);
>> plot(x,y), grid
x
xe x f
2
) (

=
2 0 s s x
Dari grafik di atas, terlihat
bahwa nilai maksimum sekitar
0.18 sampai dengan 2, yang
terjadi di nilai x sekitar 0.4
sampai dengan 0.6.
Implementasi pencarian acak
dalam MATLAB untuk mem-
peroleh nilai maksimum dari
fungsi f(x).
15
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
% Memasukkan jumlah iterasi
n=input(Jumlah iterasi = );
% Pengacakan nilai awal
x=rand;
y=x*exp(-2*x);
% Random walk dengan n iterasi
for iterasi=1:n
x1=rand;
y1=x1*exp(-2*x1);
if y1>y
x=x1;
y=y1;
end
end
% Hasil
fprintf('Iterasi %d : ',n);
fprintf('Nilai maksimum %1.3f ',y);
fprintf('terjadi di x = %1.3f\n',x);
16
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Simpan program ini dalam file rndwalk1.m, dan hasil dari
implementasi ini untuk setiap jumlah iterasi tertentu
adalah sebagai berikut:

Iterasi 10 : Nilai maksimum 0.184 terjadi di x = 0.500
Iterasi 50 : Nilai maksimum 0.184 terjadi di x = 0.499
Iterasi 100 : Nilai maksimum 0.184 terjadi di x = 0.499
Nilai maksimal yang diperoleh adalah 0.184.

Contoh 5.2.
Mencari kata acak sampai diperoleh kata yang disimpan
oleh komputer, misalkan kata acaknya adalah STATE.
Sebelumnya pastikan nilai target (kata yang disimpan)
dibentuk dalam array integer sehingga didefinisikan:
target = { 19 20 1 20 5 }, dimana nilai-nilai tersebut
menyatakan urutan dari alfabet pada kata target.
17
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Implementasinya dalam bahasa MATLAB adalah:

% Menyimpan kata target
target=[19 20 1 20 5];
katatarget=char(target+64);
% Membuat kata secara acak
s=floor(rand(1,5)*26)+1;
% Menghitung jarak antara kata target dan s
e=sum(abs(target-s));
% Proses iterasi pencarian sebanyak 300 kali
for iterasi=1:300
% Menyimpan s ke dalam s1
s1=s;
% Melakukan update dengan mengubah
% salah satu huruf saja
18
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
k=floor(rand*5)+1;
s1(k)=floor(rand*26)+1;
% Menghitung jarak s1 dengan target
e1=sum(abs(target-s1));
% Menguji apakah s baru diterima
if(e1<=e)
s=s1;
e=e1;
end
% Setiap 20 iterasi ditampilkan
if mod(iterasi,25)==0
kata=char(s+64);
fprintf('Iterasi ke %d : %s\n',iterasi,kata);
end
end
19
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Simpan dalam file carikata.m, lalu jalankan. Salah satu
hasilnya adalah sebagai berikut:
>> carikata
Iterasi ke 25 : VUJTC
Iterasi ke 50 : VUETC
Iterasi ke 75 : VUATE
Iterasi ke 100 : UTATE
Iterasi ke 125 : QTATE
Iterasi ke 150 : QTATE
Iterasi ke 175 : STATE
Iterasi ke 200 : STATE
Iterasi ke 225 : STATE
Iterasi ke 250 : STATE
Iterasi ke 275 : STATE
Iterasi ke 300 : STATE
20
5 . 4 . P e n c a r i a n A c a k ( R a n d o m Wa l k )
Tugas 3.2.

1. Buat program sederhana dalam MATLAB untuk
meng-hitung nilai integral :


untuk x = 0 s/d 1

2. Buatlah grafik yang menghubungkan jumlah titik yang
dibangkitkan dan nilai integral yang diperoleh.

( )
x
e x f

= t 2 ) (
21
5 . 6 . A l g o r i t m a M e t r o p o l i s
Sampel data yang diperoleh dengan konfigurasi spin dari lattice
diletakkan pada suatu kesatuan. Kita pilih data yang mempunyai
bobot w,


dimana Hi adalah energi pada konfigurasi i, teknik ini dinamakan
dengan algoritma Metropolis. Hal ini berguna untuk memilih
kandidat berikutnya pada proses pencarian acak (random walk),
dimana konfigurasi solusi yang dapat diterima adalah konfigurasi
solusi dengan bobot:



Bila proses ini dilakukan secara terus-menerus akan diperoleh kumpulan
data sampling yang mempunyai distribusi:



Z H
i
e w
/ |
=
i
trial
H
H
e
e
w
|
|

=
Z H
i
e Z f
/
) (
|
=
22
5 . 6 . A l g o r i t m a M e t r o p o l i s
Contoh 5.3.
Bangkitkan 10 bilangan acak [-1 1] yang menyatakan
komposisi elektron dari suatu atom. Misalkan:
S = [1 1 1 1 1 1 1 1 1 1]
Energi yang terpancar dalam suatu komposisi elektron
adalah energi yang terjadi ketika terjadi dua kutub
yang berbeda yang berada secara berdampingan.
Energi untuk S dapat dihitung dengan:
S = [1 1 1 1 1 1 1 1 1 1]
dE = [ 0 1 1 1 0 0 1 0 1 ]
Total Energi E=5.

Algoritma metropolis bersama-sama random walk dari
Monte Carlo akan mengubah komposisi di atas
menjadi komposisi dengan Energi yang minimum.
23
5 . 6 . A l g o r i t m a M e t r o p o l i s
Proses 1:
Nomor state yang berubah = 3
S = [1 1 1 1 1 1 1 1 1 1]
dE = [ 0 0 0 1 0 0 1 0 1 ]
Total Energi E = 3
State ini diterima
Proses 2:
Nomor state yang berubah = 5
S = [1 1 1 1 1 1 1 1 1 1]
dE = [ 0 0 0 0 1 0 1 0 1 ]
Total Energi E = 3
State ini diterima
Proses 3:
Nomor state yang berubah = 6
S = [1 1 1 1 1 1 1 1 1 1]
dE = [ 0 0 0 1 1 1 1 0 1 ]
Total Energi E = 5
State ini tidak diterima
24
5 . 6 . A l g o r i t m a M e t r o p o l i s
Proses di atas hanya melakukan pertimbangan perubahan state
dilakukan ketika energi lebih kecil. Perhatikan pada proses 1 dan
proses 2, meskipun kedua state ini berbeda tetapi energinya
sama. Hal ini membuat teknik perubahan state hanya dengan
pertimbangan besar-kecilnya energi masih terlalu dini untuk
dapat menyatakan kondisi terbaik.

Contoh Implementasi Algoritma Metropolis:
Algoritma metropolis untuk membangkitkan sejumlah bilangan acak xk
dengan distribusi f(xk).

1. Bangkitkan N pasangan bilangan acak (x,y)
2. Untuk Xn=xn Hitung ratio Metropolis dari masing-masing
pasangan bilangan acak:


3. Tentukan :


) (
) (
x f
y f
r =
p x
y
x
n

=
+
1 dengan
r) min(1, p dengan

1
25
5 . 6 . A l g o r i t m a M e t r o p o l i s
Contoh 5.4.
Membangkitkan bilangan acak berdistribusi exponensial :

, untuk 0 < x < 1

Implementasi Algoritma Metropolis untuk membangkitkan bilangan acak
dengan distribusi eksponensial di atas adalah sebagai berikut:
% Memasukkan jumlah bilangan acak
% yang akan dibangkitkan
n=input('Jumlah bilangan acak = ');
% Membangkitkan n pasangan bilangan acak (x,y)
for i=1:n
x=rand;
y=rand;
% Menghitung nilai ratio metropolis
fx=exp(-x)/0.4323;
fy=exp(-y)/0.4323;
r=fy./fx;
p=rand;
x
e x p
2
4323 . 0
1
) (

=
26
5 . 6 . A l g o r i t m a M e t r o p o l i s
if p<r
s(i)=y;
else
s(i)=x;
end
end
disp(s)

Simpan dalam file acakmet.m, kemudian jalankan.
Perhatikan hasil dari pembangkitan bilangan acak
dengan algoritma metropolis. Untuk membangkitkan
bilangan acak dengan fungsi distribusi yang berbeda,
tinggal mengganti fx dan fy pada program di atas.