Analisis Perbandingan Algoritma Fisher Yates Shuffle Dan Naive Shuffle

10
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.

description

Penelitian tentang perbandingan algoritma pengacakan.

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/