Analisis Perbandingan Algoritma Fisher Yates Shuffle Dan Naive Shuffle
-
Upload
ahmad-farisi -
Category
Documents
-
view
122 -
download
19
description
Transcript of Analisis Perbandingan Algoritma Fisher Yates Shuffle Dan Naive Shuffle
-
1
Analisis Perbandingan Algoritma
Fisher Yates Shuffle dan Naive Shuffle
Ahmad Farisi 1406595930
Magister Ilmu Komputer Universitas Indonesia
Email : [email protected]
1. Latar Belakang
Shuffle atau dikenal dengan pengacakan merupakan teknik yang digunakan untuk
mengacak urutan dari sekelompok angka, teks, atau data. Proses pengacakan saat ini
banyak digunakan dalam pengembangan perangkat lunak. Salah satu bidang yang sering
menggunakan proses pengacakan adalah game. Banyak sekali implementasi pengacakan
yang dilakukan dalam game. Beberapa game puzzle tentunya melakukan proses
pengacakan pada awal mula game tersebut dimulai. Selanjutnya game perjudian yang
terkenal di negara-negara yang menghalalkan perjudian tentunya juga membutuhkan
proses pengacakan. Jika tidak ada proses pengacakan, maka game tersebut tidak akan
fair sehingga mudah ditebak dan menyebabkan berkurangnya peminat game tersebut.
Proses pengacakan yang dilakukan terhadap urutan angka, teks, atau data akan
menghasilkan permutasi acak. Apabila proses pengacakan dilakukan secara berulang-
ulang sampai n kali, maka permutasi acak yang dihasilkan adalah sejumlah panjang data!
(panjang data faktorial). Misalnya sebuah urutan ABC diacak sampai n kali, maka
permutasi yang dihasilkan adalah 3! yang artinya 6. Masing-masing permutasi akan
menghasilkan jumlah yang berbeda-beda, sebagai contoh ABC berjumlah k, ACB
berjumlah l, BAC berjumlah m, BCA berjumlah n, CAB berjumlah o, dan CBA
berjumlah p.
Apabila ilustrasi di atas digunakan pada game kartu atau pocker, maka tentunya dalam n
kali pengacakan kartu, jumlah kemunculan urutan tertentu diharapkan tidak dapat
diprediksi dengan mudah yang artinya permutasi yang dihasilkan pada proses
pengacakan seimbang. Apabila terdapat satu urutan kartu tertentu yang sering keluar,
maka game kartu tersebut akan mudah dimenangkan. Sehingga diperlukan metode yang
tidak berat sebelah, atau dengan kata lain dibutuhkan metode yang menghasilkan nilai
atau urutan yang hampir sama untuk setiap kemungkinan kombinasi kartu yang keluar
pada n kali pengacakan.
Dalam perkembangannya, terdapat beberapa metode atau algoritma yang dapat
digunakan untuk melakukan proses pengacakan, seperti naive shuffle dan fisher yates
shuffle. Dalam beberapa forum pengembang perangkat lunak yang terkenal dan populer
saat ini seperti stackoverflow, codinghorror, dan stackexchange, banyak sekali
pembahasan yang dilakukan untuk mencari metode pengacakan yang seimbang.
-
2
Penelitian ini membandingkan dua algoritma yang sering digunakan dalam proses
pengacakan. Kedua algoritma tersebut adalah naive shuffle dan fisher yates shuffle.
Kedua algoritma ini sama-sama dapat melakukan pengacakan dengan cara in place.
Permutasi yang dihasilkan dari pengacakan dengan Algoritma Fisher Yates memiliki
nilai probabilitas yang sama atau dapat dikatakan seimbang1. Sedangkan beberapa
permutasi yang dihasilkan algoritma Naive Shuffle muncul lebih banyak dan sebagian
lagi sedikit.
Oleh karena itu, dalam penelitian ini dilakukan eksperimen untuk mencari tahu dan
membandingkan keseimbangan permutasi yang dihasilkan dalam proses pengacakan
menggunakan algoritma Fisher Yates Shuffle dan Naive Shuffle.
2. Permasalahan
Permasalahan yang menjadi fokus dalam penelitian ini adalah apakah algoritma Fisher
Yates Shuffle atau Naive Shuffle yang memiliki keseimbangan permutasi yang lebih
baik dalam n kali pengacakan yang dilakukan.
3. Tujuan
Perbandingan yang dilakukan dalam proses pengacakan menggunakan algoritma Fisher
Yates Shuffle dan Naive Shuffle ini ditujukan untuk mencari tahu algoritma mana yang
memiliki keseimbangan permutasi yang lebih baik, atau dengan kata lain algoritma mana
yang memberikan jumlah permutasi yang sama atau hampir sama untuk n kali
pengacakan yang dilakukan. Untuk mencapai tujuan tersebut, dilakukan eksperimen
menggunakan kedua algoritma tersebut.
4. Tinjauan Pustaka
4.1. Algoritma Naive Shuffle
Naive Shuffle merupakan metode pengacakan yang umum dilakukan dan juga
bertujuan untuk menghasilkan permutasi yang seimbang.
Langkah-langkah pengacakan menggunakan algoritma Naive Shuffle adalah
sebagai berikut.
1. Siapkan masukan (dalam bentuk angka ataupun karakter) sebanyak N.
2. Ambil sebuah nomor acak k di antara satu sampai i (panjang karakter -1)
jumlah angka yang belum dianggap teracak (dicoret).
3. Hitung dari bawah, coret angka k yang belum dicoret dan tuliskan angka
tersebut di lain tempat.
4. Ulangi langkah 2 dan 3 hingga semua angka tercoret.
1 http://en.algoritmy.net/article/43676/Fisher-Yates-shuffle
-
3
5. Urutan angka yang ditulis di lain tempat tadi (langkah 3) adalah permutasi
acak dari angka awal.
Pseudo code nya adalah sebagai berikut.
function algoNaiveShuffle (A)
for iA.length-1 down to 1 do
s= random number from 0 to A.length-1
swap(A[i],A[s])
endfor
4.2. Algoritma Fisher Yates Shuffle
Algoritma Fisher Yates Shuffle diambil dari nama penemunya, yaitu Ronald
Fisher dan Frank Yates. Algoritma ini ditemukan pada tahun 1938 pada bukunya
Statistical Tables for Biological, Agricultural, and Medical Research. Algoritma
ini digunakan untuk mengubah urutan masukan yang diberikan secara acak.
Permutasi yang dihasilkan oleh algoritma ini muncul dengan probabilitas yang
sama.
Langkah-langkah pengacakan menggunakan algoritma Fisher Yates Shuffle
adalah sebagai berikut.
1. Siapkan masukan (dalam bentuk angka ataupun karakter) sebanyak N.
2. Ambil sebuah nomor acak k di antara satu sampai i jumlah angka yang belum
dianggap teracak (dicoret).
3. Hitung dari bawah, coret angka k yang belum dicoret dan tuliskan angka
tersebut di lain tempat.
4. Ulangi langkah 2 dan 3 hingga semua angka tercoret.
5. Urutan angka yang ditulis di lain tempat tadi (langkah 3) adalah permutasi
acak dari angka awal.
Pseudo code nya adalah sebagai berikut.
function algoFisherYate (A)
for iA.length-1 down to 1 do
s= random number from 0 to i
swap(A[i],A[s])
endfor
Sebagai contoh, apabila ada angka dengan urutan 1 2 3 4 5 6 7 8. Maka
proses pengacakannya dengan algoritma Fisher Yates Shuffle adalah sebagai
berikut.
-
4
Tabel 1. Contoh Pengacakan dengan Algoritma Fisher Yates
Step Range Roll Scratch Result
1 2 3 4 5 6 7 8
1 1-8 4 1 2 3 8 5 6 7 4
2 1-7 6 1 2 3 8 5 7 6 4
3 1-6 2 1 7 3 8 5 2 6 4
4 1-5 2 1 5 3 8 7 2 6 4
5 1-4 1 8 5 3 1 7 2 6 4
6 1-3 3 8 5 3 1 7 2 6 4
7 1-2 2 8 5 3 1 7 2 6 4
8 5 3 1 7 2 6 4
Permutasi yang dihasilkan pada contoh di atas adalah 8 5 3 1 7 2 6 4. Contoh
ini adalah proses pengacakan 1 kali. Dalam penelitian ini, akan dilakukan
eksperimen dengan proses pengacakan lebih dari 1 kali.
4.3. Penelitian Terkait
Penelitian tentang A Simulated Enhancement of Fisher-Yates Algorithm for
Shuffling Virtual Card Games using Domain-Specific Data Structures (OluAde-
Ibijola, 2012) melakukan implementasi terhadap game virtual card menggunakan
algoritma Fisher Yates Shuffle.
Penelitian ini menerapkan algoritma Fisher Yates Shuffle untuk melakukan
pengacakan terhadap 54 kartu. Artinya, kemungkinan permutasi dari 54 kartu
tersebut adalah 54! atau sekitar 2,3 x 1071
urutan yang mungkin. Namun karena
game virtual card yang diimplementasikan adalah Whot Cards, maka dari 54
kartu, hanya 12 urutan kartu saja yang dibutuhkan, sehingga permutasinya dapat
diurutkan dengan kemungkinan 12! urutan atau 479.001.600 urutan yang
mungkin.
Yang dimaksud dengan domain-specific data structures dalam penelitian ini
adalah struktur data generic list. Peneliti menggunakan struktur data generic list
dengan IDE Visual Basic.Net. Generic merupakan object collection pada VB.Net
yang sudah typed-safe yang terdiri dari object collection Array, List, Dictionary,
Sorted Dictionary, Queue, dan Stack. Dalam penelitian ini object collection yang
digunakan adalah List.
Berikut ini adalah contoh screen shot hasil pengacakan yang dilakukan peneliti
terhadap 54 kartu dalam permainan whot!. Contoh berikut ini adalah contoh 6
buah permutasi yang dihasilkan setelah 6 kali pengacakan.
-
5
Gambar 1. Simulasi 6 permutasi yang berbeda dari Whot! Cards
5. Pembahasan
Untuk melihat permutasi yang dihasilkan oleh algoritma Fisher Yates Shuffle dan Naive
Shuffle, maka dilakukan percobaan dengan keterangan berikut ini.
a. Data yang diacak : huruf/alfabet ABC
b. Jumlah permutasi : 3! = 6
c. Jumlah pengacakan : 100.000 Kali
d. Jumlah percobaan : 30 kali / algoritma
Dari keterangan di atas, maka dilakukan percobaan terhadap alfabet ABC dengan
pengacakan sebanyak 100.000 kali untuk satu kali percobaan, dan percobaan dilakukan
30 kali untuk masing-masing algoritma.
Berikut ini adalah tabel yang memperlihatkan jumlah permutasi pada setiap pengacakan
yang dilakukan sebanyak 30 kali dengan Fisher Yates Shuffle.
Tabel 2. Percobaan 1 sampai 10 Algoritma Fisher Yates Shuffle
-
6
Percobaan 1 2 3 4 5 6 7 8 9 10
ABC 16705 16441 16846 16582 16688 16640 16767 16631 16690 16469
ACB 16793 16804 16802 16507 16773 16453 16644 16511 16778 16765
BAC 16645 16652 16587 16587 16718 16759 16696 16518 16486 16560
BCA 16497 16697 16545 16695 16669 16498 16566 16659 16713 16752
CAB 16826 16738 16500 16698 16746 16867 16834 16945 16728 16711
CBA 16534 16668 16720 16931 16406 16783 16493 16736 16605 16743
Total 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000
Tabel 3. Percobaan 11 sampai 20 Algoritma Fisher Yates Shuffle
Percobaan 11 12 13 14 15 16 17 18 19 20
ABC 16569 16941 16586 16792 16907 16723 16743 16505 16774 16715
ACB 16517 16753 16565 16739 16627 16495 16661 16777 16674 16639
BAC 16745 16273 16578 16670 16552 16760 16893 16611 16713 16734
BCA 16698 16532 16718 16670 16625 16693 16546 16717 16564 16429
CAB 16653 16843 16718 16507 16533 16652 16690 16842 16634 16753
CBA 16818 16658 16835 16622 16756 16677 16467 16548 16641 16730
Total 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000
Tabel 4. Percobaan 21 sampai 30 Algoritma Fisher Yates Shuffle
Percobaan 21 22 23 24 25 26 27 28 29 30
ABC 16551 16597 16766 16732 16559 16668 16772 16734 16762 16955
ACB 16603 16616 16635 16469 16567 16605 16699 16495 16577 16706
BAC 16815 16551 16825 16911 16644 16462 16705 16713 16422 16496
BCA 16633 16711 16507 16621 16666 16553 16586 16389 16800 16662
CAB 16431 16838 16566 16882 16899 16739 16740 16784 16756 16489
CBA 16967 16687 16701 16385 16665 16973 16498 16885 16683 16692
Total 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000
Dari 30 kali percobaan di atas, hasil kemunculan permutasi dirata-ratakan sebagai
berikut.
Tabel 5. Rata-Rata kemunculan permutasi pada 30 kali percobaan Fisher Yates
Percobaan Rata-Rata Standar Deviasi
ABC 16.693,67 129,6622
ACB 16.641,63 110,426
BAC 16.642,70 141,5788
BCA 16.620,37 98,67973
CAB 16.718,07 133,1574
CBA 16.683,57 151,98
Total 100000
Rata-rata kemunculan tersebut kemudian digambarkan ke dalam grafik berikut ini
bersama dengan nilai standar deviasinya untuk lebih murah melihat keseimbangan
permutasinya.
-
7
Gambar 2. Rata-rata kemunculan permutasi pada 30 kali percobaan dengan Fisher Yates
Dari percobaan di atas, didapatkan rata-rata kemunculan (AVG ) untuk setiap permutasi
pada 30 kali percobaan dengan 100.000 kali pengacakan yang tidak jauh berbeda antara
satu permutasi dengan permutasi lainnya.
16.620,37 < AVG < 16.718,07
Selisih antara rata-rata terbesar dan terkecil hanya senilai 97,7.
Berikut ini adalah tabel yang memperlihatkan jumlah permutasi pada setiap pengacakan
yang dilakukan sebanyak 30 kali dengan Naive Shuffle.
Tabel 5. Percobaan 1 sampai 10 Algoritma Naive Shuffle
Percobaan 1 2 3 4 5 6 7 8 9 10
ABC 16629 16662 16653 16745 16428 16556 16789 16726 16560 16595
ACB 16601 16547 16608 16505 16691 16811 16828 16519 16666 16521
BAC 16716 16687 16697 16544 16733 16970 16539 16713 16759 16796
BCA 16724 16857 16471 16655 16681 16580 16666 16819 16570 16667
CAB 16723 16772 16745 16680 16709 16540 16594 16719 16631 16850
CBA 16607 16475 16826 16871 16758 16543 16584 16504 16814 16571
Total 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000
Tabel 6. Percobaan 11 sampai 20 Algoritma Naive Shuffle
Percobaan 11 12 13 14 15 16 17 18 19 20
ABC 16599 16638 16608 16577 16657 16560 16789 16655 16560 16595
ACB 16567 16871 16820 16572 16610 16666 16828 16680 16666 16521
16.560,00
16.580,00
16.600,00
16.620,00
16.640,00
16.660,00
16.680,00
16.700,00
16.720,00
16.740,00
ABC ACB BAC BCA CAB CBA
Fisher Yates
Average
-
8
Percobaan 11 12 13 14 15 16 17 18 19 20
BAC 16812 16632 16622 16726 16716 16759 16539 16871 16759 16796
BCA 16825 16644 16696 16659 16623 16570 16666 16745 16570 16667
CAB 16670 16579 16544 16592 16543 16631 16594 16505 16631 16850
CBA 16527 16636 16710 16874 16851 16814 16584 16544 16814 16571
Total 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000
Tabel 7. Percobaan 21 sampai 30 Algoritma Naive Shuffle
Percobaan 21 22 23 24 25 26 27 28 29 30
ABC 16428 16667 16825 16871 16759 16796 16733 16571 16527 16789
ACB 16691 16850 16670 16745 16570 16667 16681 16595 16599 16828
BAC 16733 16571 16527 16505 16631 16850 16709 16521 16567 16539
BCA 16681 16595 16599 16544 16814 16571 16758 16796 16812 16666
CAB 16709 16521 16567 16655 16560 16595 16428 16667 16825 16594
CBA 16758 16796 16812 16680 16666 16521 16691 16850 16670 16584
Total 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000
Dari 30 kali percobaan di atas, hasil kemunculan permutasi dirata-ratakan sebagai
berikut.
Tabel 8. Rata-Rata kemunculan permutasi pada 30 kali percobaan Naive Shuffle
Percobaan Rata-Rata Standar Deviasi
ABC 16.651,57 111,7512
ACB 16.666,47 111,2818
BAC 16.684,63 119,5773
BCA 16.673,03 96,88937
CAB 16.640,77 103,2719
CBA 16.683,53 127,1794
Total 100000
Rata-rata kemunculan tersebut kemudian digambarkan ke dalam grafik berikut ini
bersama dengan nilai standar deviasinya untuk lebih murah melihat keseimbangan
permutasinya.
-
9
Gambar 3. Rata-rata kemunculan permutasi pada 30 kali percobaan Naive Shuffle
Dari percobaan di atas, didapatkan rata-rata kemunculan (AVG ) untuk setiap permutasi
pada 30 kali percobaan dengan 100.000 kali pengacakan yang tidak jauh berbeda antara
satu permutasi dengan permutasi lainnya.
16.651,57 < AVG < 16.684,63
Selisih antara rata-rata terbesar dan terkecil hanya senilai 33,06.
6. Kesimpulan
Dari percobaan yang telah dilakukan pada bab pembahasan, algoritma Fisher Yates
Shuffle memiliki selisih AVG yang lebih besar dari pada algoritma Naive Shuffle.
Keduanya sama-sama memiliki tingkat keseimbangan yang tidak berbeda jauh karena
hanya selisih rata-rata 64,64 saja. Namun dalam percobaan ini, untuk 100.000 data,
dapat disimpulkan bahwa algoritma Naive Shuffle sedikit lebih baik dari pada Fisher
Yates Shuffle.
Adapun standar deviasi yang dihasilkan pada setiap permutasi dalam 30 kali percobaan
menunjukkan keragaman data sampel yang sangat tinggi. Atau dengan kata lain
perbedaan nilai sampel dari masing-masing permutasi terhadap rata-ratanya dalam 30
kali percobaan masih sangat tinggi.
Tingginya nilai standar deviasi menunjukkan keseimbangan permutasi yang dihasilkan
juga tinggi mengingat dalam 30 kali percobaan, kemunculan masing-masing permutasi
seimbang dengan rata-rata angka 16.620 sampai 16.718. Artinya tidak ada permutasi
16.610,00
16.620,00
16.630,00
16.640,00
16.650,00
16.660,00
16.670,00
16.680,00
16.690,00
ABC ACB BAC BCA CAB CBA
Naive Shuffle
Average
-
10
yang mendominasi atau sering muncul. Apabila nilai standar deviasinya rendah, artinya
terdapat permutasi yang cukup sering muncul pada urutan permutasi tertentu.
Dari berbagai forum dikatakan bahwa Naive Shuffle tidak lebih baik daripada Fisher
Yates Shuffle2, untuk itu perlu dilakukan percobaan kembali dengan jumlah data yang
lebih besar sehingga dapat lebih jelas, algoritma mana yang menghasilkan permutasi
yang seimbang untuk n kali pengacakan, mengingat hasil akhir yang tidak jauh berbeda
untuk 100.000 data yang dilakukan dalam penelitian ini.
7. Referensi
OluAde-Ibijola, A. (2012). A Simulated Enhancement of Fisher-Yates Algorithm for
Shuffling in Virtual Card Games using Domain-specific Data Structures.
International Journal of Computer Applications, 54(11), 2428. http://doi.org/10.5120/8612-2469
http://blog.codinghorror.com/the-danger-of-naivete/
http://en.algoritmy.net/article/43676/Fisher-Yates-shuffle
2 http://blog.codinghorror.com/the-danger-of-naivete/