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=4m=4n(0)=100ia(0)i=(100,100,50,75)bi=(0,50,0,25)ii
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 ).biin=n(0)−∑ibi=100−(0+50+0+25)=25ai=a(0)i−bi=(100,50,50,50)biii
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 dapatijskkkijsi+sjn−(si+sj)ij1+min(ai+aj−si−sj,si+sj)imungkin 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=30201
s1+s2=3
30**, 21**, 12**, 03**
di mana **
mewakili semua nomor hunian yang mungkin untuk dua kaleng terakhir: yaitu 00
,. Ketika , adalahs1+s2=2
20**, 11**, 02**
di mana sekarang **
dapat berupa 10
atau 01
. Itu memberi lebih banyak status. Ketika , adalah3×2=6s1+s2=1
10**, 01**
di mana sekarang **
bisa 20
, 11
tetapi tidak 02
(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 yang2×2=4s1+s2=0214+6+4+1=15
3000, 2100, 1200, 0300; 2010, 2001, 1110, 1101, 0210, 0201; 1020, 1011, 0120, 0111; 0021.
Dengan 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,009333715
State: 3000 2100 1200 0300 2010 1110 0210 1020 0120 2001 1101 0201 1011 0111 0021
Count: 202 227 232 218 216 208 238 227 237 209 239 222 243 211 208
Sebuah uji keseragaman memberikan nilai , ( derajat kebebasan): bahwa kesepakatan yang indah dengan hipotesis bahwa prosedur ini menghasilkan negara kemungkinan sama.χ2χ211.2p=0.6714
Ini R
kode diatur untuk menangani situasi dalam pertanyaan. Ubah a
dan n
untuk bekerja dengan situasi lain. Atur N
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
#
# Gibbs-like sampler.
#
# `a` is an array of maximum numbers of balls of each type. Its values should
# all be integers greater than zero.
# `n` is the total number of balls.
#------------------------------------------------------------------------------#
g <- function(j, state, a) {
#
# `state` contains the occupancy numbers.
# `a` is the array of maximum occupancy numbers.
# `j` is a pair of indexes into `a` to "rotate".
#
k <- sum(state[j]) # Total occupancy.
x <- floor(runif(1, max(0, k - a[j[2]]), min(k, a[j[1]]) + 1))
state[j] <- c(x, k-x)
return(state)
}
#
# Set up the problem.
#
a <- c(100, 50, 50, 50)
n <- 25
# a <- 4:1
# n <- 3
#
# Initialize the state.
#
state <- round(n * a / sum(a))
i <- 1
while (sum(state) < n) {
if (state[i] < a[i]) state[i] <- state[i] + 1
i <- i+1
}
while (sum(state) > n) {
i <- i-1
if (state[i] > 0) state[i] <- state[i] - 1
}
#
# Conduct a sequence of random changes.
#
set.seed(17)
N <- 1e5
sim <- matrix(state, ncol=1)
u <- ceiling(N / choose(length(state), 2) / 2)
i <- rep(rep(1:length(state), each=length(state)-1), u)
j <- rep(rep(length(state):1, length(state)-1), u)
ij <- rbind(i, j)
#
# Alternatively, generate `ij` randomly:
# i <- sample.int(length(state), N, replace=TRUE)
# j <- sample.int(length(state)-1, N, replace=TRUE)
# ij <- rbind(i, ((i+j-1) %% length(state))+1)
#
sim <- cbind(sim, apply(ij, 2, function(j) {state <<- g(j, state, a); state}))
rownames(sim) <- paste("Can", 1:nrow(sim))
#
# Thin them for use. Each column is a state.
#
thin <- function(x, stride=1, start=1) {
i <- round(seq(start, ncol(x), by=stride))
x[, i]
}
#
# Make a scatterplot of the results, to illustrate.
#
par(mfrow=c(1,1))
s <- thin(sim, stride=max(1, N/1e4))
pairs(t(s) + runif(length(s), -1/2, 1/2), cex=1/2, col="#00000005", pch=16)