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 tergantung1 pada distribusi bilangan acak yang digunakan (lihat bab 4). 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 2 3. Pencarian Acak Dengan Monte Carlo 5.2. Monte Carlo Untuk Menghitung Nilai 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 3 5.2. Monte Carlo Untuk Menghitung Nilai p 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 p dapat dihitung dengan: 4m p N 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: 4 5.2. Monte Carlo Untuk Menghitung Nilai p % 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 5.2. Monte Carlo Untuk Menghitung Nilai p Jumlah titik acak = 10 Jumlah titik acak = 100 Jumlah titik acak = 1000 Jumlah titik acak = 2000 Jumlah titik acak = 2500 Jumlah titik acak = 4000 Jumlah titik acak = 10000 Jumlah titik acak = 20000 Jumlah titik acak = 50000 Jumlah titik acak = 100000 Jumlah titik acak = 250000 Jumlah titik acak = 500000 Jumlah titik acak = 1000000 pi = 3.20000 pi = 2.88000 pi = 3.15200 pi = 3.13800 pi = 3.11840 pi = 3.12800 pi = 3.15760 pi = 3.12640 pi = 3.13600 pi = 3.13876 pi = 3.14133 pi = 3.14120 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. 6 5.3. Monte Carlo Untuk Menghitung Integral 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. 7 5.3. Monte Carlo Untuk Menghitung Integral 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 : M I N dimana : M=jumlah titik yang terletak di dalam fungsi f(x) N=jumlah titik yang dibangkitkan 8 5.3. Monte Carlo Untuk Menghitung Integral Contoh 5.1. Menghitung nilai: 1 x.e 2 x dx 0 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); 9 5.3. Monte Carlo Untuk Menghitung Integral 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: 1 xe dx xe e x x e e x 1 0 1 1 1 0.2642 0 10 5.4. Pencarian Acak (Random Walk) 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 11 ] dapat dituliskan sebagai berikut: 5.4. Pencarian Acak (Random Walk) • 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. 12 5.4. Pencarian Acak (Random Walk) Contoh 5.1. Mencari nilai maksimum dari fungsi: dimana 0 x2 f ( x) xe Sebelum mencari penyelesaiannya digambarkan fungsi ini dengan cara: >> x=0:0.1:2; >> y=x.*exp(-2*x); >> plot(x,y), grid 2 x sebaiknya terlebih dahulu 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 memperoleh nilai maksimum dari fungsi f(x). 13 5.4. Pencarian Acak (Random Walk) Contoh 5.1. Mencari nilai maksimum dari fungsi: dimana 0 x2 f ( x) xe Sebelum mencari penyelesaiannya digambarkan fungsi ini dengan cara: >> x=0:0.1:2; >> y=x.*exp(-2*x); >> plot(x,y), grid 2 x sebaiknya terlebih dahulu 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 memperoleh nilai maksimum dari fungsi f(x). 14 5.4. Pencarian Acak % 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); (Random Walk) 15 5.4. Pencarian Acak (Random Walk) 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. 16 5.4. Pencarian Acak (Random Walk) 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 17 5.4. Pencarian Acak (Random Walk) 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 18 5.4. Pencarian Acak (Random Walk) 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 19 5.4. Pencarian Acak (Random Walk) Tugas 3.2. 1. Buat program sederhana dalam MATLAB untuk meng-hitung nilai integral : f ( x) 2 p e x untuk x = 0 s/d 1 2. Buatlah grafik yang menghubungkan jumlah titik yang dibangkitkan dan nilai integral yang diperoleh. 20 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, we H i / Z 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: H trial e w H i e Bila proses ini dilakukan secara terus-menerus akan diperoleh kumpulan data sampling yang mempunyai distribusi: f ( Z ) e H i / Z 21 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. 22 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 23 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 f ( y ) bilangan acak: r f ( x) 3. Tentukan : p min(1, r) y dengan xn 1 dengan 1 p x 24 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 : p( x) 1 2 x , e 0.4323 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; 25 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. 26