Chúng ta hãy xem xét một khái quát của vấn đề này. Có lon sơn màu khác biệt và quả bóng. Có thể có thể chứa đến quả bóng. Bạn muốn tạo ra các cấu hình của quả bóng trong lon có ít nhất bóng trong có thể cho mỗi , mỗi cấu hình với xác suất bằng nhau.m = 4 n ( 0 ) = 100 i một ( 0 ) i = ( 100 , 100 , 50 , 75 ) b i = ( 0 , 50 , 0 , 25 ) i im=4m=4n(0)=100ia(0)i=(100,100,50,75)bi=(0,50,0,25)ii
Các cấu hình như vậy tương ứng một-một với các cấu hình thu được sau khi loại bỏ các bóng khỏi can , giới hạn quả bóng còn lại tối mỗi . Vì vậy, tôi sẽ chỉ tạo ra những điều này và cho phép bạn điều chỉnh chúng sau đó (bằng cách đặt quả bóng trở lại vào thể cho mỗi ).biin=n(0)−∑ibi=100−(0+50+0+25)=25ai=a(0)i−bi=(100,50,50,50)biii
Để đếm các cấu hình này, hãy sửa tất cả trừ hai trong số các chỉ số, giả sử và . Giả sử đã có bóng trong can cho mỗi khác với và . Điều đó để lại bóng. Có điều kiện ở nơi có các bóng khác, chúng được phân phối đồng đều trong lon và . Các cấu hình có thể là về số lượng (xem các nhận xét), từ việc đặt càng nhiều bóng vàoijskkkijsi+sjn−(si+sj)ij1+min(ai+aj−si−sj,si+sj)icàng tốt càng tốt thông qua việc đặt càng nhiều quả bóng vào càng tốt càng tốt.j
Nếu bạn muốn, bạn có thể đếm tổng số cấu hình bằng cách áp dụng đệ quy đối số này cho các lon còn lại . Tuy nhiên, để có được các mẫu, chúng tôi thậm chí không cần biết số lượng này. Tất cả những gì chúng ta cần làm là liên tục truy cập tất cả các cặp không có thứ tự có thể của lon và ngẫu nhiên (và thống nhất) thay đổi sự phân phối các quả bóng trong hai lon đó. Đây là chuỗi Markov với phân phối xác suất giới hạn đồng nhất trên tất cả các trạng thái có thể (như được hiển thị dễ dàng bằng các phương pháp tiêu chuẩn). Vì vậy, nó đủ để bắt đầu trong bất kỳm−2{i,j}trạng thái, chạy chuỗi đủ lâu để đạt được phân phối giới hạn và sau đó theo dõi các trạng thái được truy cập bởi thủ tục này. Như thường lệ, để tránh tương quan nối tiếp, chuỗi trạng thái này phải được "làm mỏng" bằng cách bỏ qua chúng (hoặc xem lại ngẫu nhiên). Làm loãng theo hệ số khoảng một nửa số lon có xu hướng hoạt động tốt, bởi vì sau đó, nhiều bước trung bình mỗi cái có thể bị ảnh hưởng, tạo ra một cấu hình thực sự mới.
Thuật toán này tốn trung bình để tạo trung bình mỗi cấu hình ngẫu nhiên. Mặc dù các thuật toán tồn tại, nhưng thuật toán này có ưu điểm là không cần phải thực hiện các phép tính tổ hợp trước.O(m)O(m)
Ví dụ, chúng ta hãy giải quyết một tình huống nhỏ hơn bằng tay. Hãy để và , ví dụ. Có 15 cấu hình hợp lệ, có thể được viết dưới dạng chuỗi các số chiếm. Ví dụ, đặt hai quả bóng vào hộp thứ hai và một quả bóng trong hộp thứ tư. Mô phỏng lập luận, chúng ta hãy xem xét tổng công suất của hai lon đầu tiên. Khi đó là quả bóng, không còn quả bóng nào trong hai lon cuối cùng. Điều đó mang lại cho các tiểu bangn = 3 s 1 + s 2 = 3a=(4,3,2,1)n=30201
s1+s2=3
30**, 21**, 12**, 03**
trong đó **
đại diện cho tất cả các số chiếm hữu có thể cho hai lon cuối cùng: cụ thể là 00
. Khi , các trạng thái làs1+s2=2
20**, 11**, 02**
ở đâu bây giờ **
có thể là 10
hay 01
. Điều đó cho trạng thái nữa. Khi , các trạng thái làs 1 + s 2 = 13×2=6s1+s2=1
10**, 01**
bây giờ **
có thể 20
, 11
nhưng không 02
(do giới hạn của một quả bóng trong hộp cuối cùng). Điều đó cho trạng thái nữa. Cuối cùng, khi , tất cả các quả bóng nằm trong hai lon cuối cùng, phải đầy đủ giới hạn và . Do đó, trạng thái có thể xảy ra như nhau làs 1 + s 2 = 0 2 1 4 + 6 + 4 + 1 = 152×2=4s1+s2=0214+6+4+1=15
3000, 2100, 1200, 0300; 2010, 2001, 1110, 1101, 0210, 0201; 1020, 1011, 0120, 0111; 0021.
Sử dụng mã dưới đây, một chuỗi gồm cấu hình như vậy đã được tạo và làm mỏng đến từng phần ba, tạo ra cấu hình của trạng thái. Tần số của chúng là như sau:3337 1510,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
Một kiểm tra thống nhất đưa ra một giá trị , ( bậc tự do): đó là thỏa thuận đẹp với giả thuyết rằng thủ tục này tạo ra trạng thái như nhau có thể xảy ra.χ 2 11,2χ2χ211.214p=0.6714
Đây R
đang được thiết lập để xử lý các tình huống trong câu hỏi. Thay đổi a
và n
làm việc với các tình huống khác. Đặt N
đủ lớn để tạo số lượng thực hiện bạn cần sau khi pha loãng .
Mã này gian lận một chút bằng cách đạp xe một cách có hệ thống qua tất cả các cặp . Nếu bạn muốn trở thành nghiêm ngặt về việc chạy chuỗi Markov, tạo ra , và một cách ngẫu nhiên, như được đưa ra trong các mã nhận xét. (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)