Làm thế nào để xáo trộn bóng màu?


10

Tôi có 400 quả bóng, trong đó 100 quả màu đỏ, 40 màu vàng, 50 màu xanh lục, 60 màu xanh lam, 70 màu tím, 80 màu đen. (những quả bóng cùng màu giống hệt nhau)

Tôi cần một thuật toán xáo trộn hiệu quả, để sau khi xáo trộn, các quả bóng nằm trong một danh sách, và

Bất kỳ 3 quả bóng liên tiếp không cùng màu. ví dụ: tôi không thể có "đỏ, đỏ, đỏ, vàng ...."

Và, tất cả các hoán vị là "như nhau" có khả năng xảy ra. (tốt, nếu sự đánh đổi giữa hiệu quả và không thiên vị là đủ tốt, tôi không bận tâm đến hiệu quả hơn là không thiên vị).

tôi đã cố gắng thích nghi với Fisher-Yates-Knuth, nhưng kết quả không lý tưởng.

Tại sao Fisher-Yates không đủ tốt? Khi FY thông qua chuyển đổi nghịch đảo Monte Carlo. Và phân phối đầu ra xử lý các quả bóng cùng màu khác nhau, nghĩa là nó sẽ tạo ra kết quả sai lệch cho nhu cầu của tôi.

Và, suy nghĩ của Naive sẽ là lọc ra / quay lại tất cả các hoán vị xấu từ toàn bộ không gian. Khi hạn chế rất mạnh, giả sử, nếu chúng ta chỉ có 300 quả bóng và 100 trong số đó có màu đỏ, thì sẽ có quá nhiều lần theo dõi / thất bại trước khi có được hoán vị thích hợp.

Vì vậy, cuối cùng, tôi muốn có thể lặp đi lặp lại qua tất cả các hoán vị tốt. Tuy nhiên, vì số lượng hoán vị hợp lệ quá lớn, tôi chỉ có thể lấy mẫu ngẫu nhiên một số trong số chúng. Tôi muốn các tính năng thống kê của "một số" trong số họ giống với dân số càng nhiều càng tốt.


3
Bạn đã thử điều chỉnh các câu trả lời từ câu hỏi khác mà bạn đã hỏi chưa? Cả hai câu hỏi trông rất giống nhau :).
Gopi

@Gopi: có, và tôi hy vọng câu trả lời cho một trong hai câu hỏi sẽ mang lại cảm hứng cho người khác.
colinfang

Ý tưởng đơn giản nhất xuất hiện trong đầu tôi là bắt đầu chọn ngẫu nhiên một quả bóng từ một màu nào đó, trong đó mỗi màu sẽ được chọn với xác suất dựa trên số lượng bóng còn lại với màu đó, với hạn chế là nếu 2 quả bóng cuối cùng có cùng màu, bạn không thể chọn nó ở lần lặp hiện tại. Hiệu quả không phải là xấu và tôi không thể thấy bất kỳ sự thiên vị nào trong đó (điều đó không có nghĩa là không có gì; có lẽ tôi bỏ lỡ điều gì đó).
George

3
@George B.: Chúng tôi đã đi qua lý do tại sao quá trình này không có sự thiên vị cho câu hỏi liên quan khác. Như David Eppstein giải thích trong câu trả lời của mình cho câu hỏi đó, có một thuật toán lập trình động mất thời gian , trong đó là số lượng màu. Một cái gì đó hiệu quả hơn sẽ tốt hơn - thậm chí . k θ ( n k / 2 )θ(nk)kθ(nk/2)
Peter Shor

2
@GeorgeB. Ngay cả khi cách tiếp cận của David Eppstein rẻ hơn, tôi vẫn quan tâm đến cách giải quyết vấn đề này bằng phương pháp MCMC.
Peter Shor

Câu trả lời:


7

Những gì bạn cần cho một chuỗi Markov hội tụ thành một phân phối bằng nhau trên tất cả các chuỗi bóng có thể là nó có thể đảo ngược: xác suất di chuyển từ chuỗi sang chuỗi giống như di chuyển theo hướng ngược lại. Do đó, tôi đề nghị bạn sử dụng các động tác sau (với một số phân phối xác suất cố định để chọn loại di chuyển sẽ thực hiện) để thực hiện chuỗi Markov trên tất cả các chuỗi có thể. Theo sau, "chạy" là một chuỗi các quả bóng có cùng chiều dài tối đa. Chuỗi Markov này dựa vào việc có ít nhất ba màu.jij

  1. Chọn hai lần chạy ngẫu nhiên. Nếu bạn có thể trao đổi chúng và vẫn có một trình tự pháp lý, hãy làm như vậy.

  2. Chọn hai lần chạy liền kề. Nếu bạn có thể trao đổi chúng và vẫn có một trình tự pháp lý, hãy làm như vậy.

  3. Chọn hai lần chạy cùng màu. Phân phối lại các quả bóng trong chúng một cách ngẫu nhiên giữa các khả năng hợp pháp (vì vậy nếu số lượng bóng tối đa trong một lần chạy là 3 và bạn có tổng số 5 quả bóng trong hai lần chạy được chọn, thì lần đầu tiên có khả năng nhận được 2 hoặc 3 quả bóng; có tổng cộng 3 quả bóng, quả đầu tiên có khả năng nhận được 1 hoặc 2 quả, nếu có tổng số 4 quả bóng thì 1, 2 và 3 đều có khả năng như nhau).

  4. Chọn một số màu ngẫu nhiên. Hãy xem xét chuỗi của các quả bóng với tất cả các quả bóng màu bị loại bỏ. Bây giờ, chọn ngẫu nhiên hai điểm trong nơi các quả bóng liền kề có màu khác nhau chạm vào nhau.S ' C i S 'CiSCiS

    a. Nếu có hai lần chạy màu tại hai điểm này trong dãy ban đầu và không có độ dài tối đa, hãy di chuyển một quả bóng từ điểm này sang điểm khác, với mỗi hướng được chọn với xác suất. SCiS

    b. Nếu có hai lần chạy màu tại hai điểm này trong chuỗi ban đầu , nhưng một điểm có độ dài tối đa và điểm kia thì không, hãy di chuyển một quả bóng từ chiều dài tối đa chạy đến điểm ngắn hơn với xác suất. SCiS

    c. Nếu chỉ có một lần chạy màu tại một trong hai điểm này trong , với xác suất di chuyển một quả bóng từ điểm chạy sang điểm khác. SCiS

    d. Nếu không có màu tại một trong hai điểm này hoặc nếu có các bước chạy có độ dài tối đa ở cả hai điểm này, thì không làm gì cả.Ci

Nếu phân tích của tôi là đúng, đây là chuỗi Markov có thể đảo ngược, cuối cùng hội tụ thành một phân phối đồng đều các chuỗi màu, vì vậy nếu bạn chạy chuỗi này đủ lâu, bạn sẽ tiến rất gần đến phân phối thống nhất này.

Làm thế nào bạn có thể nói khi điều này đã hội tụ? Tôi sẽ đề nghị xem entropy của chuỗi này và dừng khi nó ngừng tăng. Làm thế nào để bạn tính toán entropy? Có hai thuật ngữ chính trong tính toán entropy: phân phối độ dài chạy và chuỗi màu mỗi lần chạy. Để phân phối độ dài chạy, giả sử rằng có chạy màu với độ dài . Đóng góp của những thứ này cho entropy là Trong đó là chiều dài tối đa cho phép của một lần chạy. Bây giờ, chúng ta hãy xem xét sự đóng góp của chuỗi màu cho entropy. Giả sử có tôi kni,kik rmi,jijmi,i=0ilog2(jmi,j

i log2 (kni,kni,1 ni,2  ni,r),
rmi,jnhững nơi mà một màu chạy ngay lập tức được theo sau bởi một màu (vì vậy ). Đóng góp của điều này cho entropy là Trong đó là số lượng màu. ijmi,i=0c
i log2 (jmi,jmi,1 mi,2  mi,c),
c

(Vì lợi ích của sự chính xác, tôi xin lưu ý rằng chúng tôi đang bỏ ra một số đóng góp cho entropy, bao gồm màu của quả bóng đầu tiên, nhưng đây là những thuật ngữ có thứ tự thấp hơn nên an toàn để bỏ qua.)

CẬP NHẬT:

Cần có cách để tăng tốc điều này. Tôi tin rằng đối với các bước c và d, bạn có thể sử dụng phân tích để thực hiện cả hai bước này trên tất cả các lần chạy một màu. Đối với các bước a và b, điều này tương đương với câu hỏi tìm một chuỗi các quả bóng màu ngẫu nhiên với ràng buộc là không có hai quả bóng cùng màu chạm vào nhau. Cần có một số cách tốt để thực hiện pha trộn cho vấn đề này. Sau đó, bạn chỉ cần xen kẽ các bước a / b với các bước c / d, trong đó mỗi bước trộn hoàn toàn hai bước đó. Tôi nghĩ rằng điều này sẽ hội tụ khá nhanh, mặc dù tôi không có bất kỳ phân tích nghiêm ngặt nào cho chuỗi Markov này.


0

Như bạn đã nói, không thể đảm bảo rằng mọi hoán vị đều có khả năng như nhau đảm bảo rằng các màu được phân bố đều, bởi vì một trong các hoán vị có tất cả các màu đỏ liên tiếp.

Một phương pháp rất thanh lịch, nhưng chắc chắn không rõ ràng, để đảm bảo màu sắc được phân bố đồng đều là tận dụng một chuỗi chênh lệch thấp.

Giả sử bạn có quả bóng, được đánh số từ đến và giá trị hạt giống, .N=4001Ns

Đảm bảo rằng tất cả các quả bóng cùng màu được đánh số liên tiếp. Đó là, trong trường hợp của bạn, hãy để 100 quả bóng đầu tiên có màu đỏ, 40 quả tiếp theo có màu vàng, 50 quả xanh tiếp theo, v.v.

Sau đó, phân bổ bóng giá trị, sao cho: trong đókthxk

xk=(s+kϕ)(mod1),
  • ϕ=1+52=1.61803399... , tỷ lệ vàng
  • các điều hành mà có phần phân đoạn của các đối số(mod1)
  • s là bất kỳ giá trị 'hạt giống' không đổi mà bạn muốn.

Nghĩa là, mỗi quả bóng sẽ được phân bổ một giá trị sẽ luôn nằm trong khoảng từ 0 đến 1.Nxk

Bây giờ chỉ cần sắp xếp các quả bóng, theo thứ tự tăng dần theo giá trị của chúng .xk

Ví dụ: sử dụng giá trị hạt giống của , các quả bóng sẽ được sắp xếp như sau: s=0B K

{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}
(trong đó "B"= Màu xanh và" "= Đen).K

Cuối cùng, nếu bạn muốn lấy một mẫu khác, chỉ cần chọn một giá trị hạt giống khác, .s

Mã Python cho việc phân bổ này như sau: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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.