Saya ingin membuat proses Monte Carlo untuk mengisi guci dengan N bola warna I, C [i]. Setiap warna C [i] memiliki jumlah bola minimum dan maksimum yang harus ditempatkan di dalam guci.
Misalnya, saya mencoba memasukkan 100 bola ke dalam guci, dan dapat mengisinya dengan empat warna:
- Merah - Minimum 0, Maksimum 100 # NB, maksimum yang sebenarnya tidak dapat direalisasikan.
- Biru - Minimum 50, Maksimum 100
- Kuning - Minimum 0, Maksimum 50
- Hijau - Minimum 25, Maksimal 75
Bagaimana saya bisa menghasilkan sampel N yang dipastikan akan didistribusikan secara merata di seluruh hasil yang mungkin?
Saya telah melihat solusi untuk masalah ini di mana bola tidak memiliki minimum atau maksimum, atau sebagai alternatif, memiliki minima dan maxima implisit yang sama. Lihat misalnya, diskusi ini tentang topik yang sedikit berbeda:
Hasilkan bobot yang terdistribusi secara seragam yang menghasilkan kesatuan?
Tetapi saya mengalami masalah dalam menggeneralisasikan solusi ini.
Jawaban:
Biarkan menunjukkan jumlah bola warna . Juga, biarkan dan menyatakan jumlah minimum dan maksimum bola warna . Kami ingin mengambil sampel secara seragam pada subjek acak dengan batasan berikut:ni Ci mi Mi Ci (n1,…,nI)
Pertama-tama, Anda dapat menghapus batasan batas bawah (yaitu ) dengan memilih bola warna pada awalnya. Ini memodifikasi dua kendala sebagai berikut:mi≤ni mi Ci
Misalkan menunjukkan distribusi seragam yang kami minati. Kita dapat menggunakan aturan rantai dan pemrograman dinamis untuk mengambil sampel dari efisien. Pertama, kami menggunakan aturan rantai untuk menulis sebagai berikut: mana adalah distribusi marjinal . Perhatikan bahwaP(n1,…,nI∣B,b1:I) P P
Berikut ini adalah implementasi ide Matlab. Kompleksitas algoritma adalah mana . Kode menggunakan dihasilkan secara acak di setiap proses. Akibatnya, beberapa kasus uji yang dihasilkan mungkin tidak memiliki solusi yang valid, dalam hal ini kode mencetak pesan peringatan.O(I×B×K) K=maxIi=1bi mi
di mana fungsi print_constraints adalah
dan fungsi dpfunc melakukan perhitungan pemrograman dinamis sebagai berikut:
dan akhirnya, fungsi discretesample (p, 1) mengambil sampel acak dari distribusi diskrit . Anda dapat menemukan satu implementasi dari fungsi ini di sini .p
sumber
Mari kita pertimbangkan generalisasi masalah ini. Ada kaleng cat warna berbeda dan bola. Bisakah menyimpan hingga bola. Anda ingin membuat konfigurasi bola di kaleng yang memiliki setidaknya bola di can untuk setiap , setiap konfigurasi dengan probabilitas yang sama.m=4 m=4 n(0)=100 i a(0)i=(100,100,50,75) bi=(0,50,0,25) i i
Konfigurasi seperti ini berada dalam korespondensi satu-ke-satu dengan konfigurasi yang diperoleh setelah mengeluarkan bola dari can , membatasi bola tersisa paling banyak per kaleng. Karena itu saya hanya akan menghasilkan ini dan membiarkan Anda menyesuaikannya setelah itu (dengan meletakkan bola kembali ke can untuk setiap ).bi i n=n(0)−∑ibi=100−(0+50+0+25)=25 ai=a(0)i−bi=(100,50,50,50) bi i i
Untuk menghitung konfigurasi ini, perbaiki semua kecuali dua indeks, misalkan dan . Misalkan ada bola sudah di dapat untuk setiap berbeda dari dan . Itu menyisakan bola . Bersyarat di tempat bola bola ini didistribusikan secara seragam di dalam kaleng dan . Kemungkinan konfigurasi yang di nomor (lihat komentar), mulai dari menempatkan sebanyak bola di dapati j sk k k i j si+sj n−(si+sj) i j 1+min(ai+aj−si−sj,si+sj) i mungkin semua jalan melalui menempatkan sebanyak bola di dapat mungkin.j
Jika mau, Anda bisa menghitung jumlah total konfigurasi dengan menerapkan argumen ini secara rekursif ke kaleng tersisa . Namun, untuk mendapatkan sampel kita bahkan tidak perlu tahu jumlah ini. Yang perlu kita lakukan adalah berulang kali mengunjungi semua pasangan kaleng yang tidak berurutan kaleng dan secara acak (dan seragam) mengubah distribusi bola di dalam kedua kaleng itu. Ini adalah rantai Markov dengan distribusi probabilitas terbatas yang seragam pada semua kemungkinan kondisi (seperti yang ditunjukkan dengan menggunakan metode standar). Oleh karena itu sudah cukup untuk memulai di setiapm−2 {i,j} nyatakan, jalankan rantai cukup lama untuk mencapai distribusi membatasi, dan kemudian melacak keadaan yang dikunjungi oleh prosedur ini. Seperti biasa, untuk menghindari korelasi serial, urutan keadaan ini harus "ditipiskan" dengan melewatinya (atau ditinjau kembali secara acak). Menipis dengan faktor sekitar setengah jumlah kaleng cenderung bekerja dengan baik, karena setelah itu banyak langkah rata-rata setiap kaleng dapat terpengaruh, menghasilkan konfigurasi yang benar-benar baru.
Algoritma ini membutuhkan biaya untuk menghasilkan setiap konfigurasi acak rata-rata. Meskipun ada algoritma lain, ini memiliki keunggulan karena tidak perlu melakukan perhitungan kombinatorial sebelumnya.O(m) O(m)
Sebagai contoh, mari kita selesaikan situasi yang lebih kecil secara manual. Misalnya dan . Ada 15 konfigurasi yang valid, yang dapat ditulis sebagai string nomor hunian. Misalnya, tempatkan dua bola ke kaleng kedua dan satu bola di kaleng keempat. Meniru argumen, mari kita pertimbangkan total hunian dari dua kaleng pertama. Ketika itu adalah bola, tidak ada bola yang tersisa untuk dua kaleng terakhir. Itu memberi negaraa=(4,3,2,1) n=3 s1+s2=3
0201
di manas1+s2=2
**
mewakili semua nomor hunian yang mungkin untuk dua kaleng terakhir: yaitu00
,. Ketika , adalahdi mana sekarang3×2=6 s1+s2=1
**
dapat berupa10
atau01
. Itu memberi lebih banyak status. Ketika , adalahdi mana sekarang2×2=4 s1+s2=0 2 1 4+6+4+1=15
**
bisa20
,11
tetapi tidak02
(karena batas dari satu bola di dapat terakhir). Itu memberi lebih banyak status. Akhirnya, ketika , semua bola berada di dua kaleng terakhir, yang harus penuh hingga batas dan . The kemungkinan sama oleh karena itu negara-negara yangDengan menggunakan kode di bawah ini, urutan konfigurasi seperti itu dihasilkan dan ditipiskan ke setiap sepertiga, menciptakan konfigurasi dari negara. Frekuensi mereka adalah sebagai berikut:10,009 3337 15
Sebuah uji keseragaman memberikan nilai , ( derajat kebebasan): bahwa kesepakatan yang indah dengan hipotesis bahwa prosedur ini menghasilkan negara kemungkinan sama.χ2 χ2 11.2 p=0.67 14
Ini
R
kode diatur untuk menangani situasi dalam pertanyaan. Ubaha
dann
untuk bekerja dengan situasi lain. AturN
agar cukup besar untuk menghasilkan jumlah realisasi yang Anda butuhkan setelah penjarangan .Kode ini menipu sedikit dengan bersepeda secara sistematis melalui semua pasangan. Jika Anda ingin menjadi ketat tentang menjalankan rantai Markov, menghasilkan , dan secara acak, seperti yang diberikan dalam kode berkomentar.(i,j)
i
j
ij
sumber
g
g