Penggabungan/Merging pada model CREW PRAM

Sumber : Parallel Algorithms, Design and Analysis by Pranay Chaudhuri

Algoritma ini ditujukan untuk menggabungkan dua buah list yang panjangnya sama, n., dan jumlah prosesor yang digunakan juga n buah.

Algoritma MERGE1_CREW

Input : Dua buah list terurut

p { margin-bottom: 0.21cm; }

Input : Dua buah list terurut yaitu X={ x1, x2, … ,xn} dan Y={ y1, y2, … ,yn}

Ouput : List terurut Z={ z1, z2, … , z2n} yang merupakan hasil penggabungan dari X dan Y

for i = 1 to n dopar

temukan yj yang paling kecil sedemikian sehingga (such that) xi < yj

if yj ditemukan (exists)

then zi+j -1 :=xi

else zn+i :=xi

fi

temukan xj yang paling kecil sedemikian sehingga (such that) yi < xj

if xj ditemukan (exists)

then zi+j -1 :=yi

else zn+i :=yi

fi

odpar

Semua n prosesor mengeksekusi 4 langkah di dalam loop pada algoritma MERGE1_CREW secara paralel.

Untuk menemukan  yyang paling kecil sedemikian sehingga xi < yj  dan  xj yang paling kecil sedemikian sehingga yi < xj   kita bisa menggunakan algoritma serial  binary search. Binary Search ini membutuhkan waktu O(log n)  pada single prosesor untuk setiap i. Sedang untuk proses yang lainnya hanya membutuhkan waktu O(1) saja. Karena itu secara keseluruhan kompleksitas dari algoritma ini adalah O(log n) dengan menggunakan n buah prosesor.

Walaupun algoritma ini cukup sederhana dan mudah dimengerti tapi  :

  • hanya berlaku jika kedua list terurut yang akan digabungkan memiliki panjang yang sama
  • hanya berlaku jika tidak ada elemen yang sama yang muncul antara X dan Y, jika terdapat yang sama maka algoritma ini bisa digunakan dengan asumsi bahwa elemen yang sama di X dianggap lebih kecil dari elemen yang sama di Y
  • secara cost masih sangat mahal, yaitu O(n log n)

Selanjutnya akan dikenalkan algoritma lain yang lebih umum, yang tidak mengharuskan ukuran List Terurut nya sama, jumlah prosesor pun dapat dibatasi sesuai dengan ketersediaan/kebutuhan. Algoritma ini bernama Algorithm MERGE2_CREW.

p { margin-bottom: 0.21cm; }

Input : Dua buah list terurut yaitu X={ x1, x2, … ,xm} dan Y={ y1, y2, … ,yn}, dimana m ?n

Ouput : List terurut Z={ z1, z2, … , zm+n} yang merupakan hasil penggabungan dari X dan Y

for i = 1 to P-1 dopar

/* Setiap prosesor i akan menemukan xis dan yis dari list X dan Y secara berurutan sehingga membentuk list Xs ={ x1s, x2s, … ,x(P-1)s} dan Ys ={ y1s, y2s, … ,y(P-1)s} */

x1s = xi? m/P?;

y1s = yi? n/P?;

odpar

for i = 1 to P-1 dopar

/* Langkah berikut ini akan membentuk list L yang panjangnya 2P-2. L dihasilkan dalam bentuk array (2P-2) x 3, dimana setiap k ( 1 ? k ? 2P-2), L(k,1) memuat nilai dari elemen ke-k dalam gabungan dari Xs dan Ys ; L(k,2) memuat index dari posisi aslinya di dalam Xs atau Ys ; dan L(k,3) mencatat dari mana X atau Y yang menjadi sumber dari nilai tersebut) */

Temukan j yang paling kecil sedemikian sehingga xis < yjs ;

If yjs exists/ada

Then do

L(i+j-1,1) := xis ;

L(i+j-1,2) := i ;

L(i+j-1,3) := X ;

od

else do

L(i+P-1,1) := xis ;

L(i+P-1,2) := i ;

L(i+P-1,3) := X ;

od

fi

Temukan j yang paling kecil sedemikian sehingga yis < xjs ;

If xjs exists/ada

Then do

L(i+j-1,1) := yis ;

L(i+j-1,2) := i ;

L(i+j-1,3) := Y ;

od

else do

L(i+P-1,1) := yis ;

L(i+P-1,2) := i ;

L(i+P-1,3) := Y ;

od

fi

odpar

for i = 1 to P dopar

/* Setiap prosesor i akan menemukan titik awalnya BX(i) dan BY(i) untuk penggabungan dua sublist dari X dan Y, dengan kata lain prosesor i akan bertanggung jawab terhadap penggabungan sublists yang diawali dengan xBX(i) dan yBX(i) di dalam X dan Y, secara berurutan */

if i = 1

then do

BX(1) := 1;

BY(1) := 1

od

else if L(2i – 2,3) = X

then do

Temukan j yang paling kecil sedemikian sehingga L(2i – 2,1) < yj ;

BX(i) := L(2i – 2,1) ? m/P? ;

BY(i) := j

od

else do

Temukan j yang paling kecil sedemikian sehingga L(2i – 2,1) < xj ;

BX(i) := j;

BY(i) := L(2i – 2,2) ? n/P? ;

od

fi

fi

odpar

for i = 1 to P dopar

/* Setiap prosesor menggabungkan dua sublist X dan Y dan memasukkan hasilnya di Z secara serial */

if i < P

then

gabungkan sublist di X yang diawali di xBX(i) dan sublist Y yang diawali di yBY(i) hingga sebuah

elemen yang lebih besar dari atau sama dengan L(2i,1) dicapai dan setiap X dan Y dan

memasukkan hasilnya di Z diawali pada posisi BX(i) + BY(i) -1

else

gabungkan sublist dari X yang diawali di xBX(P) dan sublist Y yang diawali di yBY(P) hingga tidak

ada lagi elemen yang tersisa baik di X maupun di Y dan masukkan hasilnya ke dalam Z yang

diawali pada posisi BX(P) + BY(P) -1

fi

odpar

Variabel Acak Geometri (Geometric Random Variables)

Misalkan ada suatu percobaan yang independent . Setiap kali percobaan itu akan memiliki kemungkinan sukses (probabilitas) sebesar p.

Jika X mewakili banyaknya percobaan awal sebelum akhirnya sebuah sukses terjadi, maka :

Sebenarnya rumus di atas dapat mudah dipahami bahwa untuk mendapatkan sukses yang ke-n maka pastilah (n-1) percobaan sebelumnya adalah gagal. Rumus ini berlaku dengan syarat setiap percobaan terjadi secara independent. (percobaan sebelumnya tidak mempengaruhi percobaan berikutnya).

Sebuah Variabel Acak yang memiliki probability mass function seperti di atas disebut Variabel Acak Geometri dengan parameter p.

Mean dari variabel acak geometri ini diperoleh dengan cara sebagai berikut :

dimana persamaan diatas tersebut menggunakan identitas alajabar untuk 0<x<1,

Sehingga dengan demikian tidak lah sulit untuk menghitung variansinya yaitu :

Metode Penolakan (Rejection Method) pada Variabel Acak Diskrit

Misalkan kita telah memiliki sebuah metode yang efisien untuk mensimulasikan variabel acak. Model tersebut memiliki fungsi probabilitas massa (Probability Mass Function) \(\{ q_{j},j\geq 0 \}\) . Kita bisa menggunakan metode ini sebagai basis simulasi dari distribusi yang memiliki fungsi massa \inline \left \{ p_{j},j \geqslant 0 \right \} dengan cara mensimulasikan terlebih dahulu sebuah variabel acak Y yang memiliki fungsi massa \inline \left \{ q_{j} \right \} dan kemudian menerima nilai simulasi ini dengan probabilitas proporsional \( p_{y}/q_{y} \)

Read more

Menghitung Integral dengan menggunakan Bilangan Acak

Misalkan g(x) adalah sebuah fungsi. Kita ingin menghitung \( \theta \) yaitu :

\dpi{100} \theta = \int_{0}^{1} g(x) dx

Apa yang menjadi dasar bahwa integral di atas dapat dihitung dengan menggunakan bilangan  random \( \theta \)

Penjelasan :

Ambil U suatu bilangan acak yang terdistribusi secara uniform dan independent di interval (0,1).

Kemudian misalnya kita nyatakan \( \theta \) sebagai :

\theta = E[g(U)]

Jika \(U_{1}, … , U_{k}\) adalah variabel random yang independent dan uniform di interval (0,1), maka menjadikan juga \(g( u_{i} )\) adalah sebagai variabel random yang independent dan terdistribusi secara identik dengan mean \( \theta \). Karena itu, dengan menggunakan dasar hukum kuat dari bilangan besar (the strong law of large numbers), mengikuti ketentuannya dengan probabilitas 1.

\(\large \sum_{i=1}^{k}\frac{g(U_{i})}{k} \to E[g(U)]= \theta \;\;\;\; ketika \; k \to \infty\)

Karena itu kita dapat mendekati \( \theta \) dengan cara membangkitkan sebanyak mungkin bilangan random \( u_{i}\) dan mengambilnya sebagai pendekatan kita terhadap nilai rata-rata (average) dari \(g( u_{i} ) \). Pendekatan semacam ini sering disebut sebagai pendekatan Monte Carlo.

Berikut ini adalah contoh algoritma dari bahasa BASIC yang dapat digunakan untuk mendekati nilai \( \theta \) :


10 RANDOMIZE
20 INPUT K
30 S = 0
40 FOR I = 1 TO k
50 U = RND
60 S = S + g(U)
70 NEXT
80 PRINT S/K

Nilai yang dihasilkan dari alogoritma ini adalah nilai dari \( \theta = \int_{0}^{1} g(x) dx \).

Kasus 1 :

Jika kita ingin menghitung :

\( \theta = \int_{a}^{b} g(x) dx \)

maka kita menggunakan substitusi \( y = (x-a)/(b – a), dy = dx / (b-a) \), sehingga :

dimana h(y) = (b – a) g(a + [b – a] y ).

Dengan demikian kita dapat mendekati nilai \( \theta \) dengan membangkitkan bilang random secara kontinyu dan mengambil nilai rata-rata (average) dari h yang dihitung pada bilangan-bilangan random tadi.

Kasus 2 :

Jika kita ingin menghitung :

kita bisa menggunakan substitusi

Substitusi ini menggambarkan bahwa

  1. ketika \( x \to 0\) maka \( y \to 0\)
  2. ketika \( x \to \infty \) maka \( y \to 1\)

Catatan : ingat sifat integral tertentu :

selanjutnya karena :

kemudian

sehingga didapatkan identitas :

dimana


Pembangkit Bilangan Acak Pesudo

Salah satu pendekatan yang sering digunakan dalam membangkitkan bilangan acak pseudo (pseudorandom numbers) adalah memulainya dengan sebuah nilai awal x0 yang sering disebut sebagai bibit/seed, kemudian komputer akan membangkitkan bilangan nilai-nilai berikutnya yaitu xn, \(n\geq 1\) secara rekursif, dengan cara memisalkan :

\(x_{n}= a x_{n-1} \; modulo \; m\) … (3.1)

dimana dan adalah bilangan bulat positif yang sudah ditentukan, dan dimana hal diatas artinya bahwa \(a x_{n-1}\) dibagi dengan dan sisa baginya diambil sebagai nilai dari  \( x_{n}\). Dengan demikian setiap  \( x_{n}\) bisa bernilai salah satu diantara \(0,1,\cdots,m-1\) dan kuantitas dari \(x_{n}/m\) – disebut sebuah bilangan acak pseudo (pseudorandom number)- diambil sebagai nilai pendekatan untuk nilai dari variabel acak uniform (0,1).

Pendekatan yang ditentukan dengan persamaan 3.1 dalam membangkitkan bilangan acak tersebut sering disebut Multiplicative Congruential Method. Karena setiap angka  \( x_{n}\) yang  akan bernilai salah satu dari  \(0,1,\cdots,m-1\), pada suatu saat setelah sejumlah  pembangkitan tertentu akan terjadi perulangan; dan seketika ini terjadi, keseluruhan deret bilangan akan kembali berulang. Dengan demikian, kita seyogyanya ingin memilih konstanta a dan m sedemikian sehingga, untuk sembarang seed  \( x_{0}\), banyaknya variable yang dapat dibangkitkan sebelum terjadi perulangan terjadi cukup besar.

Secara umum konstanta dan dapat dipilih untuk memenuhi 3 kriteria :

  1. Untuk sembarang nilai awal seed , deretan hasil memiliki pemunculan deret variable acak yang independent uniform (0,1)
  2. Untuk sembarang nilai awal seed , banyaknya variable yang dapat dibangkitkan sebelum terjadi perulangan cukup besar.
  3. Nilai-nilai ini dapat dihitung secera efisien dengan menggunakan komputer

Untuk memenuhi ketiga kondisi tersebut di atas, sebaiknya m dipilih dari bilangan prima yang cukup besar, biasanya disesuaikan dengan kemampuan komputer yang digunakan dan ukuran word. Untuk mesin 32 bit (dimana bit pertama digunakan sebagai bit penanda / sign bit), pemilihan m = \( 2^{31} – 1\) dan \( a = 7^5 = 16807\) menghasilkan hasil yang diinginkan.

Pembangkit bilangan acak lainnya adalah :

\(x_{n}= (a x_{n-1}+c) \; modulo \; m\)

pembangkit ini diberi nama mixed congruential generators. Pembangkit ini dianggap lebih baik hasilnya dari pembangkit sebelumnya.

Kebanyakan bahasa pemrograman komputer sudah menyediakan pembangkit bilangan acak nya sendiri. Misalnya dalam bahasa BASIC, bahasa ini menggunakan 2 (dua) buah perintah yaitu :

1 RANDOMIZE

2 U = RND

Contoh program yang menghasilkan 10 (sepuluh) buah bilangan acak :

10  RANDOMIZE

20  FOR I = 1 TO 10

30  U = RND

40  PRINT U

50  NEXT

 

 

Bilangan Acak

Salah satu faktor penting dalam teori simulasi adalah kemampuan untuk membangkitkan bilangan acak. Bilangan acak ini mewakili nilai dari variabel acak yang berdistribusi uniform pada rentang (0,1). Pada bab ini akan dijelaskan bilangan-bilangan acak seperti itu yang dibangkitkan dengan menggunakan komputer dan beberapa ilustrasi penggunaannya.

> Pembangkit Bilangan Acak Pesudo

Ruang Sample dan Kejadian

Mari kita bayangkan andai ada sebuah percobaan yang kejadian yang mungkin terjadi nya belum kita ketahui pada saat awal.

Semua kejadian yang mungkin terjadi pada percobaan tersebut lalu kita kumpulkan menjadi sebuah kumpulan atau himpunan. Maka kumpulan atau himpunan semacam ini kita sebut dengan Ruang Sample dari suatu percobaan dan biasanya ditandai dengan notasi  S.

Contoh, Misalkan ada sebuah balapan kuda yang diikuti oleh 7 ekor kuda.  Masing-masing kuda yang diberi nomor punggung 1 hingga 7, maka :

S = {  semua urutan dari  (1, 2, 3, 4, 5, 6, 7) }

Pemunculan urutan  (3,4,1,7,6,5,2) akan berarti bahwa, kuda dengan nomor punggung 3 akan datang paling dulu, baru kemudian disusul oleh kuda nomor 4 dan seterusnya.

Semua himpunan bagian A dari Ruang Sampel disebut sebagai kejadian (event). Karena itu, sebuah kejadian adalah sebuah kumpulan yang mengandung peristiwa yang mungkin muncul dalam suatu percobaan. Jika peristiwa kejadian yang muncul dalam percobaan itu terdapat di dalam A, kita katakan bahwa  kejadian A terjadi.

Contoh : A = { semua kejadian di S yang didahului oleh 5 }

Maka A adalah semua peristiwa, dimana kuda nomor 5 yang masuk finish paling dulu.

Untuk sembarang kejadian A dan B, misalkan kita menentukan kejadian baru \(A\cup B\)  , yang disebut juga union/gabungan A dan B, gabungan ini mengandung semua kejadian yang mungkin muncul yang mungkin saja berada di dalam A atau di dalam B atau berada dikeduanya A dan B. Sejalan dengan hal tersebut, kita tentukan kejadian, AB, yang disebut sebagai irisan/ intersection dari A dan B, dimana kejadian AB terjadi jika A dan B juga terjadi. Kita juga bisa menentukan gabungan dan irisan untuk lebih dari 2(dua) kejadian. Gabungan dari kejadian-kejadian \(A_1, \cdots , A_n\) ditulis \(\bigcup_{i=1}^{n} = A_i\)  ditentukan memuat semua kejadian yang berada di sembarang \(A_i\). Begitu pula dengan irisan dari kejadian-kejadian \(A_1, \cdots , A_n\)  ditulis dengan \(A_1A_2 \cdots A_n\)  yang mengandung semua kejadian yang mungkin muncul (outcome) berada di semua \(A_i\).

Untuk semua kejadian A ada kejadian yang disebut \(A^c\)  , sering disebut sebagai komplemen dari A. mengandung semua kejadian di ruang sample S tapi tidak berada di A. Karena itu, \(A^c\) terjadi jika dan hanya jika tidak terjadi. Karena kejadian yang mungkin muncul haruslah berada di ruang sample S, akibatnya \(S^c\) tidak mengandung kejadian apapun, karenanya tidak muncul apapun. Kita sebut \(S^c\) himpunan null dan ditulis dengan \small \inline \o  . Jika \small \inline AB =\o, dikatakan bahwa A dan B mutualy exclusive

Membangkitkan Sebuah Variabel Acak Binomial

Misalkan kita ingin membangkitkan nilai dari sebuah variabel acak X, binomial (n,p). X sedemikian sehingga : P\left \{ X=i \right \}=\frac{n!}{i!(n-i)!}p^{i}(1-p)^{n-i}, \;\;\;\;\;i=0,1, \cdots ,n

Untuk membangkitkan variabel acak binomial, kita akan menggunakan metode transformasi kebalikan (inverse transform method) dengan membuat penanda rekursif sebagai berikut : P\left \{ X=i+1 \right \}=\frac{n-i}{i+1}\frac{p}{1-p}P\left \{ X=i \right \}

Dengan i menunjukkan nilai yang diiginkan, pr = P{X= i} probabilitas dimana X sama dengan i, dan F = F(i) sebagai probabilitas dimana X lebih kecil atau sama dengan i, algoritma dapat disusun sebagai berikut :

STEP 1: Bangkitkan bilangan acak U

STEP 2: c=p/(1-p),i=0,pr=(1-p)^{n},F=pr

STEP 3: Jika U < F, tentukan X = i, stop.

STEP 4:pr = \left [ c(n-i)/(i+1) \right ]pr, F=F+pr,i=i+1

STEP 5: Lanjut ke STEP 3

[ Sumber : Simulation, Sheldon M. Ross]

Membangkitkan Sebuah Variabel Acak Poisson

Variabel acak X adalah Poisson dengan mean \( \lambda \)  jika

p_{i}=P\left \{ X=i \right \}=e^{-\lambda} \frac{\lambda ^{i}}{i!} \;\;\;\;\;\; i=0,1,\cdots

Kunci penggunaan metode transformasi kebalikan (inverse transform method) dalam rangka  untuk membangkitkan variabel acak seperti ini adalah dengan mengikuti penanda di bawah ini :

\120dpi p_{i+1}= \frac{\lambda }{i+1} p_{i}, \;\;\;\;\;\; i\geq 0

Berdasarkan pada rumus rekursif untuk menghitung probabilitas Poisson dengan mean ? di atas, maka kita dapat menggunakan algoritma berikut ini :

STEP 1: Bangkitkan bilangan acak U

STEP 2: \120dpi \inline i=0, p=e^{-\lambda },F=p

STEP 3: Jika U<F, jadikan X=i dan berhenti

STEP 4: \120dpi \inline p=\lambda p / \left ( i+1 \right ), F = F + p, i = i+1.

STEP 5: Go to STEP 3

[ source : Simulation, Sheldon M. Ross ]

Metode Rejection untuk Membangkitkan Variabel Acak Kontinyu

Misalkan kita memiliki sebuah metode pembangkit bilangan acak dengan fungsi densitas \(g(x) \). Kita dapat menggunakan fungsi tersebut sebagai basis/dasar untuk membangkitkan variabel acak dari distribusi kontinyu lain yang memiliki fungsi densitas \(f(x) \) dengan cara membangkitkan Y dari g dan kemudian menerima nilai yang dibangkitkan ini dengan sebuah proporsi probabilitas terhadap \(f(Y)/g(Y) \)

Secara lebih spesifik, misalkan \(c \) adalah sebuah konstanta sedemikian sehingga

\( \frac{ f(y) }{ g(y) } \leq c \) untuk semua y

Berikut adalah penggambaran langkah-langkahnya :

Langkah 1 : Bangkitkan Y yang memiliki densitas g
Langkah 2 : Bangkitkan sebuah bilangan acak U
Langkah 3 : Jika \(U \leq \frac{f(Y)}{c g(Y)} \leq c, jadikan X = Y \). Lainnya, kembali ke langkah 1

Contoh 5d :
Gunakanlah metode Rejection untuk membangkitkan variabel acak yang memiliki fungsi densitas sebagai berikut :

\( f(x) = 20 x (1 – x)^3, : : : : 0<x<1 \)

Karena variabel acak ini (dimana berdistribusi beta dengan parameter 2,4) berkumpul di internal (0,1), mari kita ambil metode rejection dengan

\(g(x)=1, ; ; 0<x<1 \)

Untuk menentukan konstanta c sedemikian sehingga \(frac{f(y)}{g(y)}leq c \), kita gunakan kalkulus untuk menemukan nilai maksimum dari

\(frac{f(x)}{g(x)} = 20 x (1 – x)^3 \)

Diferensiasi atau turunan pertama dari kuantitas ini adalah :

Dengan menjadikan persamaan ini sama dengan 0 akan menunjukkan :

jadi nilai maksimum dicapai bila x = 1/4 dan dengan demikian :

\(frac{f(x)}{g(x)} = 20left ( frac{1}{4} right )left ( frac{3}{4} right ) ^3 = frac{135}{64}equiv c \)

Karenanya

\(frac{f(x)}{c g(x)} = frac{256}{27}x left ( 1 – x right )^3 \)

Karenanya prosedur rejection menjadi sebagai berikut :

Langkah 1 : Bangkitkan bilangan acak \(U_1 dan U_2 \).
Langkah 2 : \(jika U_2 leq frac{256}{27} U_1 left ( 1 – U_1 right )^3 \), berhenti dan jadikan \(X = U_1 \). Lainnya kembali ke langkah 1.

Rata banyak nya langkah 1 dilakukan adalah \(large c = frac{135}{64} approx 2.11\).

1 10 11 12 13