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 berulangulang 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.
1
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 seimbang 1. 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
2
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.
3
Tabel 1. Contoh Pengacakan dengan Algoritma Fisher Yates Step
Range
Roll
1 2 3 4 5 6 7
1-8 1-7 1-6 1-5 1-4 1-3 1-2
4 6 2 2 1 3 2
1 1 1 1 1 8 8 8
2 2 2 7 5 5 5
Scratch 3 4 5 6 7 8 3 8 5 6 7 3 8 5 7 3 8 5 3 8 3
Result 4 6 2 7 1 3 5 8
4 6 2 7 1 3 5
4 6 2 7 1 3
4 6 2 7 1
4 6 4 2 6 4 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 (OluAdeIbijola, 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.
4
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 5
Percobaan ABC ACB BAC BCA CAB
1 16705 16793 16645 16497 16826
2 16441 16804 16652 16697 16738
3 16846 16802 16587 16545 16500
4 16582 16507 16587 16695 16698
5 16688 16773 16718 16669 16746
6 16640 16453 16759 16498 16867
7 16767 16644 16696 16566 16834
8 16631 16511 16518 16659 16945
9 16690 16778 16486 16713 16728
10 16469 16765 16560 16752 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 ABC ACB
11
12
13
14
15
16
17
18
19
20
16569 16517
16941 16753
16586 16565
16792 16739
16907 16627
16723 16495
16743 16661
16505 16777
16774 16674
16715 16639
BAC BCA CAB
16745 16698 16653
16273 16532 16843
16578 16718 16718
16670 16670 16507
16552 16625 16533
16760 16693 16652
16893 16546 16690
16611 16717 16842
16713 16564 16634
16734 16429 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 ABC ACB BAC BCA CAB
21 16551 16603 16815 16633 16431
22 16597 16616 16551 16711 16838
23 16766 16635 16825 16507 16566
24 16732 16469 16911 16621 16882
25 16559 16567 16644 16666 16899
26 16668 16605 16462 16553 16739
27 16772 16699 16705 16586 16740
28 16734 16495 16713 16389 16784
29 16762 16577 16422 16800 16756
30 16955 16706 16496 16662 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 ABC ACB BAC BCA CAB CBA Total
Rata-Rata 16.693,67 16.641,63 16.642,70 16.620,37 16.718,07 16.683,57 100000
Standar Deviasi 129,6622 110,426 141,5788 98,67973 133,1574 151,98
Rata-rata kemunculan tersebut kemudian digambarkan ke dalam grafik berikut ini bersama dengan nilai standar deviasinya untuk lebih murah melihat keseimbangan permutasinya. 6
Fisher Yates 16.740,00 16.720,00 16.700,00 16.680,00 16.660,00 Average
16.640,00 16.620,00 16.600,00 16.580,00 16.560,00 ABC
ACB
BAC
BCA
CAB
CBA
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 ABC ACB
1 16629 16601
2 16662 16547
3 16653 16608
4 16745 16505
5 16428 16691
6 16556 16811
7 16789 16828
8 16726 16519
9 16560 16666
10 16595 16521
BAC BCA CAB
16716 16724 16723
16687 16857 16772
16697 16471 16745
16544 16655 16680
16733 16681 16709
16970 16580 16540
16539 16666 16594
16713 16819 16719
16759 16570 16631
16796 16667 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 ABC ACB
11
12
13
14
15
16
17
18
19
20
16599 16567
16638 16871
16608 16820
16577 16572
16657 16610
16560 16666
16789 16828
16655 16680
16560 16666
16595 16521
7
Percobaan BAC BCA CAB
11
12
13
14
15
16
17
18
19
20
16812 16825 16670
16632 16644 16579
16622 16696 16544
16726 16659 16592
16716 16623 16543
16759 16570 16631
16539 16666 16594
16871 16745 16505
16759 16570 16631
16796 16667 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 ABC ACB BAC BCA
21 16428 16691 16733 16681
22 16667 16850 16571 16595
23 16825 16670 16527 16599
24 16871 16745 16505 16544
25 16759 16570 16631 16814
26 16796 16667 16850 16571
27 16733 16681 16709 16758
28 16571 16595 16521 16796
29 16527 16599 16567 16812
30 16789 16828 16539 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 ABC ACB BAC BCA CAB CBA Total
Rata-Rata
16.651,57 16.666,47 16.684,63 16.673,03 16.640,77 16.683,53
Standar Deviasi 111,7512 111,2818 119,5773 96,88937 103,2719 127,1794
100000
Rata-rata kemunculan tersebut kemudian digambarkan ke dalam grafik berikut ini bersama dengan nilai standar deviasinya untuk lebih murah melihat keseimbangan permutasinya.
8
Naive Shuffle 16.690,00 16.680,00 16.670,00 16.660,00 16.650,00
Average
16.640,00 16.630,00 16.620,00 16.610,00 ABC
ACB
BAC
BCA
CAB
CBA
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 9
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), 24–28. 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/
10