Bagaimana cara mengocok bola warna?

10

Saya memiliki 400 bola, di mana 100 berwarna merah, 40 berwarna kuning, 50 berwarna hijau, 60 berwarna biru, 70 berwarna ungu, 80 berwarna hitam. (Bola dengan warna yang sama identik)

saya butuh algoritma pengocokan yang efisien, sehingga setelah pengocokan, bola ada dalam daftar, dan

3 bola berurutan tidak memiliki warna yang sama. misal, saya tidak bisa punya "merah, merah, merah, kuning ...."

Dan, semua permutasi "sama" kemungkinan terjadi. (well, jika pertukaran efisiensi dan ketidakberpihakan cukup baik, saya tidak keberatan efisiensi lebih dari ketidakberpihakan).

saya mencoba untuk beradaptasi Fisher-Yates-Knuth, tetapi hasilnya tidak ideal.

Mengapa Fisher-Yates tidak cukup baik? Ketika TA mengadopsi transformasi terbalik Monte Carlo. Dan distribusi output memperlakukan bola warna yang sama secara berbeda, yaitu akan menghasilkan hasil yang bias untuk kebutuhan saya.

Dan, pemikiran Naif adalah untuk menyaring / melacak semua permutasi buruk dari seluruh ruang. Ketika batasannya sangat kuat, katakanlah, jika kita hanya memiliki 300 bola dan 100 di antaranya berwarna merah, maka akan ada terlalu banyak pelacakan / kegagalan sebelum mendapatkan permutasi yang sesuai.

Jadi, pada akhirnya, saya ingin dapat mengulangi melalui semua permutasi yang baik. Namun, karena jumlah permutasi yang valid terlalu besar, saya hanya dapat mengambil sampel secara acak. Saya ingin fitur statistik "beberapa" dari mereka menyerupai populasi sebanyak mungkin.

colinfang
sumber
3
Sudahkah Anda mencoba mengadaptasi jawaban dari pertanyaan lain yang Anda ajukan? Kedua pertanyaan terlihat sangat mirip :).
Gopi
@Gopi: ya, dan saya harap jawaban untuk kedua pertanyaan akan membawa inspirasi bagi yang lain.
colinfang
Gagasan paling sederhana yang muncul di benak saya adalah mulai memilih secara acak satu bola dari beberapa warna, di mana setiap warna akan dipilih dengan probabilitas berdasarkan jumlah bola yang tersisa dengan warna itu, dengan batasan bahwa jika 2 bola terakhir memiliki warna yang sama, Anda tidak dapat memilihnya pada iterasi saat ini. Efisiensi tidak boleh buruk dan saya tidak bisa melihat bias di dalamnya (yang tidak berarti tidak ada; mungkin saya melewatkan sesuatu).
George
3
@ George B .: kami membahas mengapa proses ini memiliki bias pada pertanyaan terkait lainnya. Seperti David Eppstein menjelaskan dalam jawabannya atas pertanyaan itu, ada algoritma pemrograman dinamis yang mengambil waktu, di mana k adalah jumlah warna. Sesuatu yang lebih efisien akan menyenangkan - bahkan θ ( n k / 2 ) . θ(nk)kθ(nk/2)
Peter Shor
2
@GeorgeB. Bahkan jika pendekatan David Eppstein lebih murah, saya akan tertarik pada bagaimana menyelesaikan masalah ini dengan pendekatan MCMC.
Peter Shor

Jawaban:

7

ij

  1. Pilih dua run secara acak. Jika Anda dapat menukarnya dan masih memiliki urutan hukum, lakukanlah.

  2. Pilih dua putaran yang berdekatan. Jika Anda dapat menukarnya dan masih memiliki urutan hukum, lakukanlah.

  3. Pilih dua run dengan warna yang sama. Mendistribusikan kembali bola di dalamnya secara acak di antara kemungkinan hukum (jadi jika jumlah bola maksimum dalam satu kali lari adalah 3, dan Anda memiliki total 5 bola dalam dua putaran yang dipilih, yang pertama kemungkinan sama akan mendapatkan 2 atau 3 bola; jika ada total 3 bola, yang pertama kemungkinan sama untuk mendapatkan 1 atau 2; jika ada total 4 bola, 1, 2, dan 3 semuanya sama-sama mungkin).

  4. CiSCiS

    CiS

    CiS

    CiS

    Ci

Jika analisis saya benar, ini adalah rantai Markov yang dapat dibalik yang pada akhirnya menyatu dengan distribusi seragam dari urutan bola berwarna, jadi jika Anda menjalankan rantai ini cukup lama, Anda akan menjadi sangat dekat dengan distribusi seragam ini.

ni,kik

i log2 (kni,kni,1 ni,2  ni,r),
rmi,j tempat di mana rangkaian warna segera diikuti oleh salah satu dari warna (jadi ). Kontribusi ini untuk entropi adalah dimana adalah jumlah warna. ijmi,i=0
i log2 (jmi,jmi,1 mi,2  mi,c),
c

(Demi kepentingan akurasi, izinkan saya mencatat bahwa kami meninggalkan sejumlah kontribusi untuk entropi, termasuk warna bola pertama, tetapi ini adalah istilah urutan yang lebih rendah yang harus aman untuk diabaikan.)

MEMPERBARUI:

Seharusnya ada cara mempercepat ini. Saya percaya bahwa untuk langkah c dan d, Anda dapat menggunakan analisis untuk melakukan kedua langkah ini di atas semua menjalankan satu warna sekaligus. Untuk langkah a dan b, ini setara dengan pertanyaan menemukan urutan acak bola berwarna dengan kendala yang tidak ada dua bola dengan sentuhan warna yang sama. Seharusnya ada cara yang baik untuk melakukan pencampuran untuk masalah ini. Maka Anda hanya perlu mengganti langkah-langkah a / b dengan langkah-langkah c / d, di mana setiap langkah mencampurkan kedua langkah itu sepenuhnya. Saya pikir ini harus menyatu cukup cepat, meskipun saya tidak memiliki analisis yang ketat untuk rantai Markov ini.

Peter Shor
sumber
0

Seperti yang Anda katakan, tidak mungkin untuk memastikan bahwa setiap permutasi memiliki kemungkinan yang sama dan memastikan bahwa warna terdistribusi secara merata, karena salah satu permutasi memiliki semua merah dalam satu baris.

Metode yang sangat elegan, tetapi tentu saja tidak jelas, untuk memastikan warna didistribusikan secara merata adalah dengan memanfaatkan urutan perbedaan yang rendah.

Misalkan Anda memiliki bola, dinomori dari hingga , dan nilai seed, .N=4001Ns

Pastikan semua bola dengan warna yang sama diberi nomor urut. Artinya, dalam kasus Anda, biarkan 100 bola pertama menjadi merah, 40 berikutnya menjadi kuning, 50 berikutnya hijau, dll.

Kemudian, alokasikan bola nilainya, sedemikian rupa sehingga: manakthxk

xk=(s+kϕ)(mod1),
  • ϕ=1+52=1.61803399... , rasio emas
  • yang operator yang mengambil bagian pecahan dari argumen(mod1)
  • s adalah nilai 'seed' konstan yang Anda inginkan.

Artinya, masing-masing bola akan dialokasikan nilai yang akan selalu antara 0 dan 1.Nxk

Sekarang cukup pesan bola, dalam urutan naik sesuai dengan nilai mereka .xk

Misalnya, menggunakan nilai seed , bola akan dipesan sebagai berikut: s=0

{B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K}
(di mana "B"= Biru, dan" "= Hitam).K

Akhirnya, jika Anda ingin mengambil sampel yang berbeda, cukup pilih nilai benih yang berbeda, .s

Kode python untuk alokasi ini adalah sebagai berikut:xk

n=400

phi = (1+pow(5,0.5))/2
x = np.zeros(n)                 
s = np.random.uniform(0,1)
for i in range(n):
    x = (s + phi*(i+1)) %1

print (s)
print (x)
Martin Roberts
sumber