(LCM) Algoritma dari metode Linear Congruent ini

advertisement
4.
BILANGAN ACAK dan Pembangkitannya
4.1. Pengantar Bilangan Acak
Bilangan acak merupakan suatu besaran dasar dalam modeling dan teknikteknik simulasi. Pada modeling dan simulasi banyak sekali memanfaatkan
bilangan acak sebagai besaran untuk mendapatkan penyelesaian suatu
permasalahan simulasi.
Untuk mendapatkan bilangan yang benar-benar acak, secara manual dapat
dilakukan dengan menggunakan undian, arisan, atau pemakaian mesin
roullete. Tetapi secara komputasi, hal ini sulit dilakukan. Hal ini disebabkan
bahwa komputer merupakan mesin deterministik, sedangkan bilangan acak
muncul sebagai kejadian yang probabilistic. Satu-satunya cara untuk
mendapatkan bilangan acak adalah dengan meng-gunakan pseudo random
generator (pembangkit bilangan acak semu), dimana bilangan acak diperoleh
secara deterministik (aritmatik).
Berbagai metode untuk membangkitkan bilangan acak banyak dibahas, dalam
modul ini hanya dibahas beberapa macam metode saja,
- LCM (linear Congruent Method),
- Suffle Method, d
- Rejection Method.
1
4 . 2 . M4.2.
eto
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Metode
Metode Linear Congruent ini sangat banyak digunakan untuk
membangkitkan bilangan acak r1, r2, …, rn yang bernilai [0,m] dengan
memanfaatkan nilai sebelumnya. Untuk membangkitkan bilangan acak
ke n+1 (rn+1) dengan metode Linear Congruent, didefinisikan:
rn 1  arn  c mod m
dimana a,c dan m dinamakan nilai pembangkit,
r0 dinamakan nilai awal, biasanya nilai ini yang di-gunakan dalam
proses randomize (mengacak di awal atau state awal).
Contoh 4.1.
Misalkan ditentukan a=4, c=1 dan r1=3, maka bilangan acak 0 s/d 8
(m=9) dapat dihitung:
r2=((4)(3)+1) mod 9 = 4
r3=((4)(4)+1) mod 9 = 8
r4=((4)(8)+1) mod 9 = 6
dan seterusnya.
2
4 . 2 . M4.2.
eto
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Metode
Algoritma
•
•
•
dari
metode
Linear
Congruent
ini
Masukkan a, c, m dan r1
Masukkan berapa bilangan acak yang akan dibangkitkan (n)
Untuk i=1 s/d n : hitung r(i+1)=(a.r(i)+c) mod m
Implementasi dari metode Linear Congruet ini dengan MATLAB adalah
s
e
b
a
g
a
i
b
e
r
i
k
u
t
:
% Mendefinisikan nilai pembangkit
a=4; c=1; m=9;
% Mendefinisikan nilai state awal
r(1)=3;
%Proses pembangkitan 20 bilangan acak
for k=1:20
r(k+1)=mod(a*r(k)+c,m);
end
%Menampilkan bilangan acak
disp(r)
3
4 . 2 . M4.2.
eto
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Metode
Simpan program ini ke dalam file acak.m. Untuk menampilkan hasil
bilangan acak dapat dituliskan nama variabelnya yaitu r:
Coba tampilkan hasilnya, seperti contoh berikut:
>> acak
Columns 1 through 8
3 4 8 6 7 2
Columns 9 through 16
5 3 4 8 6 7
Columns 17 through 21
1 5 3 4 8
0
1
2
0
Perhatikan bahwa bilangan yang dihasilkan akan berulang setiap 9
bilangan, sehingga dapat dikatakan bahawa hasilnya tidak benarbenar acak! Disinilah menariknya mem-pelajari pembangkitan
bilangan acak, yaitu mengubah mesin aritmatik menjadi mesin acak.
Salah satu cara adalah dengan mengubah nilai pembangkitnya,
misalkan dengan nilai pembangkit (a,c,m,r1) = (51,1,256,10)
4
4 . 2 . M4.2.
eto
Metode
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Untuk menganti nilai pembangkit, ubah nilai a,c, m dan r(1). Misalkan ubah
dengan nilai (a,c,m,r1) = (327,1,512,11), maka ubah empat baris teratas
dari program di atas yang tertulis:
% Mendefinisikan nilai pembangkit
a=4; c=1; m=9;
% Mendefinisikan nilai state awal
r(1)=3;
menjadi
% Mendefinisikan nilai pembangkit
a=327; c=1; m=512;
% Mendefinisikan nilai state awal
r(1)=11;
Perhatikan bagaimana hasilnya. Bila program ini dijalankan hasilnya akan
menjadi:
>> acak
Columns 1 through 8
11 14 483 246 59 350 275 326
Columns 9 through 16
107 174 67 406 155 510 371 486
Columns 17 through 21
203 334 163 54 251 Terlihat sampai 21 bilangan belum terdapat pengulangan.
5
4 . 2 . M4.2.
eto
Metode
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Tugas 4.1.
Dengan menggunakan program ini dapatkan sampai berapa bilangan angka
11 muncul lagi.
Contoh 4.3.
Jalankan program acak.m berkali-kali, perhatikan hasilnya akan sama. Bila
dijalankan lagi hasilnya akan:
>> acak
Columns 1 through 8
11 14 483 246 59 350 275 326
Columns 9 through 16
107 174 67 406 155 510 371 486
Columns 17 through 21
203 334 163 54 251
Hasil ini sama dengan hasil sebelumnya
Program acak.m di atas ubah nilai r(1) dengan :
t=fix(clock);
r(1)=floor(mod(t(6),m));
di baris paling atas. Fungsi fix dan floor adalah fungsi pem-bulatan digunakan
untuk menjamin bilangan yang dihasilkan selalu bilangan bulat, dan fungsi
mod adalah fungsi sisa pembagian yang digunakan untuk menjamin6
bilangan yang dihasilkan selalu lebih kecil dari m.
4 . 2 . M4.2.
eto
Metode
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Hasil dijalankan pertama:
>> acak
Columns 1 through 7
47 10 199 50 479 474 375
Columns 8 through 14
258 399 426 39 466 319 378
Columns 15 through 21
215 162 239 330 391 370 159
Hasil dijalankan kedua:
>> acak
Columns 1 through 7
24 169 480 289 296 25 496
Columns 8 through 14
401 56 393 0 1 328 249
Columns 15 through 21
16 113 88 105 32 225 360
Perhatikan hasilnya tidak pernah sama karena r(1) merupakan
pengambilan nilai 1 ms.
7
4 . 2 . M4.2.
eto
Metode
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Contoh 4.4.
Membangkitkan 20 bilangan acak 0 s/d 1dengan menggunakan fungsi
standard dari MATLAB
% Mendefinisikan state awal menggunakan waktu
t=fix(clock)
srand(t(6))
% Membangkitkan 20 bilangan acak
% dilakukan dengan ukuran 1 baris 20 kolom
x=rand(1,20)
% Menampilkan bilangan acak
disp(x)
Simpan dengan nama file acak1.m, kemudian jalankan dengan
menuliskan acak1. Hasil dari setiap komputer tidak akan sama.
8
4 . 2 . M4.2.
eto
Metode
d e LLinear
i n e a rCongruent
C o n g r (LCM)
uent (LCM)
Contoh 4.5.
Membangkitkan 20 bilangan acak 0 s/d 1 menggunakan LCM dengan
nilai pembangkat (a,c,m) = (327,1,512) dan r1 adalah state awal
yang dibangkitkan berdasarkan wkatu.
% Mendefinisikan nilai pembangkit
a=327; c=1; m=512;
% Mendefinisikan nilai state awal
t=fix(clock)
r(1)=mod(t(6),m);
%Proses pembangkitan 20 bilangan acak
for k=1:19
r(k+1)=mod(a*r(k)+c,m);
end
r=r/m;
%Menampilkan bilangan acak
disp(r)
Simpan dengan nama file acak2.m
9
4.2. Metode Linear
Congruent (LCM)
Tugas 4.2.
Jalankan kedua program di atas (acak1.m dan acak2.m) dengan terlebih
dahulu mengubah jumlah bilangan acaknya dengan 1000 bilangan
acak, kemudian tuliskan perintah untuk menghitung histogram dari
masing-masing bilangan acak sebagai berikut:
h1=hist(x,10);
h2=hist(r,10);
Untuk menggambar histogramnya sebagai berikut:
subplot(1,2,1), plot(h1), grid
subplot(1,2,2), plot(h2), grid
Perhatikan kemunculan setiap kejadian (range angka 0.1) dan apa yang
berbeda.
Untuk menjelaskan perbedaan bisa digunakan perhitungan statistik
untuk:
• Menghitung ekspektasi dari kedua bilangan acak tersebut.
• Menghitung pengujian interval dari kedua distribusi di atas
10
dengan menganggap salah satu sebagai nilai acuan.
4.3. Metode Shuffle Untuk Memperbaiki Bilangan Acak
Untuk memperbaiki hasil distribusi bilangan acak yang dibangkitkan
dengan metode linear congruent agar seakan-akan tidak berulang,
dapat digunakan metode suffle, yaitu mengganti kedudukan
bilangan acak berdasarkan indeks pada barisan bilangan acaknya.
Algoritma metode suffle ini adalah:
1.
2.
3.
4.
5.
Bangkitkan n bilangan acak ai [0,1] dengan LCM
Bangkitkan bilangan acak baru b [0,1] dengan LCM
Hitung k = n  b
Hitung r = ak
Hitung ak = b
Ambil nilai r sebagai sebagai bilangan acak baru dan ulangi langkah 2.
Kedua macam metode pembangkitan bilangan acak di atas (LCM dan
Suffle) akan menghasilkan bilangan acak dengan distribusi uniform,
dalam arti banyak kemungkinan munculnya setiap bilangan adalah
sama. Berikut ini akan dibahas bagaimana membangkitkan
11
bilangan acak dengan distribusi tertentu.
4.3. Metode Shuffle Untuk Memperbaiki Bilangan Acak
Tugas 4.2.
Jalankan kedua program di atas (acak1.m dan acak2.m) dengan terlebih
dahulu mengubah jumlah bilangan acaknya dengan 1000 bilangan
acak, kemudian tuliskan perintah untuk menghitung histogram dari
masing-masing bilangan acak sebagai berikut:
h1=hist(x,10);
h2=hist(r,10);
Untuk menggambar histogramnya sebagai berikut:
subplot(1,2,1), plot(h1), grid
subplot(1,2,2), plot(h2), grid
Perhatikan kemunculan setiap kejadian (range angka 0.1) dan apa yang
berbeda.
Untuk menjelaskan perbedaan bisa digunakan perhitungan statistik
untuk:
• Menghitung ekspektasi dari kedua bilangan acak tersebut.
• Menghitung pengujian interval dari kedua distribusi di atas
12
dengan menganggap salah satu sebagai nilai acuan.
4.3. Metode Shuffle Untuk Memperbaiki Bilangan Acak
Contoh 4.6.
Bangkitkan 10 bilangan acak 0 s/d 9 atau ditulis [0 9] meng-gunakan
metode LCM (a,c,m,r1)=(4,1,9,3), kemudian lakukan resuffle 3 kali.
Tuliskan program di bawah ini, kemudian simpan dalam file
acakre1.m
% Nilai pembangkitan dan state awal
a=4; c=1; m=9; r(1)=3;
% membangkitkan 9 bilangan acak
% karena state awal dianggap 1 bilangan
for i=1:9
r(i+1)=mod(a*r(i)+c,m);
end
disp('Sebelum resuffle:')
disp(r)
% resuffle 3 kali
for i=1:3
r(10+1)=mod(a*r(9+i)+c,m);
p=r(10+i);
r(p+1)=p;
end
13
disp('Sesudah resuffle:')
4.3. Metode Shuffle Untuk Memperbaiki Bilangan Acak
Jalankan program dengan menuliskan acakre1, dan hasilnya adalah:
>> acakre1
Sebelum resuffle:
Columns 1 through 8
3 4 8 6 7 2
Columns 9 through 10
5 3
Sesudah resuffle:
Columns 1 through 8
3 4 8 6 4 2
Columns 9 through 10
8 3
0
1
6
1
14
4.4.Membangkitkan Bilangan Acak Berdistribusi Non-Uniform
Untuk membangkitkan bilangan acak ak yang berdistribusi non-uniform
dengan fungsi f(a) yang didefinisikan berada pada [amin, amax]. Jika
integral dari fungsi f(a) dapat dihitung misalkan F(a) maka kita dapat
membangkitkan bilangan acak ak dengan mentransformasikan
bilangan acak 0<y< 1 dengan:
a = F-1(y)
Sebagai contoh dibangkitkan bilangan acak berdistribusi eksponensial
sebagai berikut: dimana m adalah konstanta. Maka bangkitkan
bilangan acak berdistribusi uniform y=[0,1], kemudian hitung :
ln( y )
a  F ( y) 
m
1
Bangkitkan bilangan acak [0,1] yang berditribusi Maka integral fungsi f(a)
adalah:
F(a) = ½ e-2ª
Sehingga invers dari F(a) adalah : a = - ln(y) / 2
15
4.4.Membangkitkan Bilangan Acak Berdistribusi Non-Uniform
Implementasi dengan menggunakan MATLAB untuk mem-bangkitkan 10
bilangan acak berdistribusi f(a) adalah sebagai berikut:
Bangkitkan 1000 bilangan acak uniform sebagai berikut:
>> a=rand(1,1000)
a=
Columns 1 through 5
0.7382 0.1763 0.4057 0.9355 0.9169
Columns 6 through 10
0.4103 0.8936 0.0579 0.3529 0.8132
Gunakan fungsi a = -ln(y)/2 untuk membangkitkan bilangan acak
eksponensial.
>> b=-log(a)/2;
>> b=b/max(b)
b=
Columns 1 through 5
0.1065 0.6092 0.3166 0.0234 0.0304
Columns 6 through 10
0.3127 0.0395 1.0000 0.3656 0.072
16
4.4.Membangkitkan Bilangan Acak Berdistribusi Non-Uniform
Bila diperhatikan histogramnya sebagai berikut:
subplot(2,1,1), hist(a,10),grid
title('Histogram Uniform')
subplot(2,1,2), hist(b,10),grid
title('Histogram Eksponensial')
Hasilnya adalah sebagai berikut:
17
4.5. Membangkitkan Bilangan Acak Berdistribusi Poisson
Fungsi kepadatan probabilitas untuk distribusi Poisson dengan nilai
rara-rata m didefinisikan:
p(i)  e m
mi
dimana i = 0,1,2,3,….
i!
Untuk membangkitkan bilangan acak berdistribusi Poisson digunakan
nilai m dan pembangkitan bilangan acak uniform dengan
menggunakan metode invers diperoleh bahwa:
pi 1
m

pi
i 1
dimana i  0
Algoritma untuk membangkitkan bilangan acak berdistribusi Poisson
adalah sebagai berikut:
Dengan mengetahui rata-rata distribusi poisson m, maka :
p0  e  m
Seterusnya tinggal memanfaatkan model rekursi dari pi.
18
4.5. Membangkitkan Bilangan Acak Berdistribusi Poisson
Contoh 4.9.
Membangkitkan n bilangan acak berdistribusi poisson dengan rata-rata
m adalah sebagai berikut:
% Set nilai rata-rata poisson (m) dan Jumlah bilangan acak yang
dibangkitkan (n)
m=input(‘Rata-rata poisson = ‘);
n=input(‘Jumlah bilangan acak = ‘);
% Membangkitkan 10 bilangan acak berdistribusi poisson
for bil=1:n
u=rand;
i=0; p=exp(-m); F=p;
sw=0;
while sw==0;
if u<F
x(bil)=i;
sw=1;
else
p=m*p/(i+1);
F=F+p;
i=i+1;
end
end
end
% Menampilkan bilangan acak
disp(x);
19
4.5. Membangkitkan Bilangan Acak Berdistribusi Poisson
Simpan dalam file poisson1.m, kemudian jalankan dengan memasukkan
m=3 dan n=1000, hasilnya adalah:
>> poisson1
Rata-rata poisson = 3
Jumlah bilangan acak = 10
Columns 1 through 8
4 3 3 4 1 3 1 2
Columns 9 through 10
2 5
Dengan histogram sebagai berikut:
% Menampilkan
histogram dari bilangan
acak yang diperoleh
t=min(x):max(x);
h=hist(x,t);
bar(t,h), grid
20
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
Metode Rejection ini merupakan metode pembangkitan
bilangan acak yang secara langsung memanfaatkan
fungsi ditsribusi bilangan acak f(a).
Bila bilangan acak yang dibangkitkan berada pada daerah
fungsi f(a) maka a diterima dan bila tidak, maka a
ditolak. Metode ini sangat sederhana tetapi untuk
membangkitkan banyak bilangan acak diperlukan waktu
yang cukup lama.
Algoritma metode rejection:
1. Bangkitkan 2 bilangan acak berditribusi uniform x dan y
dengan [0,1].
2. Bila y<f(x) maka x diterima dan bila tidak x ditolak.
21
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
Contoh 4.9.
Bangkitkan 10 bilangan acak berdistribusi Poisson :
e m m a
f (a) 
a! m adalah nilai rata-rata
dimana
Hasil dari pembangkitkan bilangan acak berdistribusi poisson dengan rata-rata
2 untuk a=[0,10] menggunakan metode rejection adalah sebagai berikut:
x y f(x)
8 3 0.00 ditolak
1 4 0.27 ditolak
3 10 0.18 ditolak
2 1 0.27 diterima
7 6 0.00 ditolak
2 5 0.27 ditolak
4 8 0.09 ditolak
4 4 0.09 ditolak
10 5 0.00 ditolak
10 0 0.00 diterima
x y f(x)
3 9 0.18 ditolak
7 0 0.00 diterima
7 0 0.00 diterima
3 8 0.18 ditolak
0 9 0.14 ditolak
0 7 0.14 ditolak
4 9 0.09 ditolak
0 10 0.14 ditolak
6 5 0.01 ditolak
2 3 0.27 ditolak
22
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
Dari hasil di atas terlihat bahwa untuk membangkitkan 10 bilangan
acak, diperlukan 97 kali percobaan, ini menunjukkan bahwa
metode ini tidak terlalu cepat untuk membangkitkan suatu bilangan
acak. Tetapi metode ini memang sangat mudah diimplementasikan
karena tidak berurusan dengan inversi dari fungsi distribusi f(a)
yang terkadang cukup rumit.
Metode rejection ini merupakan suatu metode pem-bangkitan bilangan
acak yang banyak dibicarakan, meskipun tidak terlalu cepat
ternyata membawa implikasi yang menarik yang akan
mengantarkan ke arah pencarian acak (random walk) yang sangat
terkenal. Metode ini juga menjadi dasar dari Metode Monte Carlo
yang akan di bahas pada bab 5.
Implementasi Metode Rejection untuk membangkitkan bilangan acak
[0,9] berdistribusi poisson dalam MATLAB adalah sebagai berikut:
23
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
% Memasukkan jumlah bilangan acak yang dibangkitkan
n=input('Jumlah bilangan acak ? ');
% Menentukan nilai parameter poisson
% misalkan m=3
m=3;
% Metode rejection
k=0;
i=0;
while k<=n
i=i+1;
x=floor(11*rand);
y=rand;
p=exp(-m)*m^x/factorial(x);
fprintf('iterasi ke %d : %d %1.2f %1.2f ---> ',i,x,y,p);
24
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
if y<=p
k=k+1;
b(k)=x;
fprintf('diterima\n');
else
fprintf('ditolak\n');
end
end
%Menampilkan bilangan acak poisson
disp(b)
Simpan dalam file acakn.m, kemudian jalankan dengan menuliskan
acakn, perhatikan untuk sejumlah bilangan diperlukan jumlah iterasi
yang sangat besar dibandingkan dengan jumlah bilangan acak
yang dihasilkan.
25
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
Tugas 4.3.
Dengan menggunakan program acakn di atas, bangkitkan n bilangan
berkali-kali sesuai tabel berikut ini:
Jumlah bilangan yang dibangkitkan
1
2
4
8
10
15
16
20
32
40
50
64
100
Jumlah iterasi
26
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
Gambarkan hasilkan sebagai berikut:
Jumlah Iterasi
Jumlah bilangan
27
4
.
6
.
M
e
t
o
d
e
R
e
j
e
c
t
i
o
n
Tugas 4.3.
Buatlah program sederhana untuk membangkitkan
bilangan acak [0,1] berdistribusi normal dengan ratarata =0.5 dan standard deviasi =0.2 dengan
menggunakan metode rejection.
1. Distribusi normal dengan rata-rata  dan standard
deviasi  didefinisikan :
f ( x) 
1
e
  x   2

 2 2





 2
2. Hitung waktu yang dibutuhkan untuk membangkitkan
100, 1000, 10000 dan 100000 bilangan acak.
28
Download