컬러 볼을 섞는 방법?


10

나는 400 공, 100은 빨간색, 40은 노란색, 50은 녹색, 60은 파란색, 70은 자주색, 80은 검은 색입니다. (같은 색깔의 공은 동일합니다)

효율적인 셔플 알고리즘이 필요하므로 셔플 후 볼이 목록에 있고

연속적인 3 개의 공은 같은 색이 아닙니다. 예를 들어, 나는 "빨강, 빨강, 빨강, 노랑 ..."을 가질 수 없습니다

그리고 모든 순열이 "동일하게"발생할 가능성이 있습니다. (음, 효율성과 편견의 절충이 충분히 좋으면 편견보다 더 많은 효율성을 신경 쓰지 않습니다).

Fisher-Yates-Knuth를 조정하려고 시도했지만 결과가 이상적이지 않습니다.

Fisher-Yates가 충분하지 않은 이유는 무엇입니까? FY는 Monte Carlo 역변환을 채택합니다. 그리고 출력 분포는 동일한 컬러 볼을 다르게 취급합니다. 즉, 내 요구에 대한 바이어스 결과를 생성합니다.

그리고 Naive의 생각은 전체 공간에서 모든 나쁜 순열을 걸러 내거나 역 추적하는 것입니다. 제한이 매우 강한 경우, 예를 들어 300 개의 볼과 100 개의 볼이 빨간색이면 적절한 순열을 얻기 전에 너무 많은 역 추적 / 실패가 발생합니다.

따라서 궁극적으로 모든 순열을 반복 할 수 있기를 바랍니다. 그러나 유효한 순열 수가 너무 많기 때문에 무작위로 일부만 샘플링 할 수 있습니다. 나는 그들 중 "일부"의 통계적 특징이 가능한 한 인구와 비슷하다.


3
다른 질문 의 답변을 수정하려고 했습니까 ? 두 질문 모두 매우 비슷해 보입니다 :).
Gopi

@ Gopi : 예, 두 가지 질문에 대한 답변이 다른 사람에게 영감을 줄 수 있기를 바랍니다.
colinfang

내 마음에 오는 가장 간단한 아이디어는 어떤 색상에서 무작위로 하나의 공을 선택하는 것입니다. 여기서 각 색상은 해당 색상으로 남은 공 수를 기반으로 확률로 선택됩니다. 마지막 두 공이 동일한 색상으로 현재 반복에서 선택할 수 없습니다. 효율성은 나쁘지 않아야하며 그 편견이 보이지 않습니다 (아무것도 없다는 것을 의미하지는 않습니다. 아마도 뭔가를 놓칠 수 있습니다).
George

3
@George B .: 우리는 왜이 과정이 다른 관련 질문 에 편견이 있는지 살펴 보았습니다 . David Eppstein이이 질문에 대한 답변에서 설명했듯이 시간 이 걸리는 동적 프로그래밍 알고리즘이 있습니다. 여기서 k 는 색상 수입니다. θ ( n k / 2 ) 조차도 더 효율적인 것이 좋습니다 . θ(nk)kθ(nk/2)
피터 쇼어

2
@GeorgeB. David Eppstein의 접근 방식이 저렴하더라도 MCMC 접근 방식 으로이 문제를 해결하는 방법에 관심이 있습니다.
피터 쇼어

답변:


7

Markov 체인이 가능한 모든 볼 시퀀스에서 동일한 분포로 수렴하기 위해 필요한 것은 가역적이라는 것입니다. 시퀀스 에서 시퀀스 j 로 이동할 확률ij 반대 방향으로 이동할 때와 같습니다. 따라서 가능한 모든 시퀀스에서 Markov 체인을 수행하기 위해 다음 이동 (고정 확률 분포를 사용하여 이동 유형 선택)을 사용하는 것이 좋습니다. 이하에서, "런 (run)"은 동일한 컬러의 볼의 최대 길이 연속 서브 시퀀스이다. 이 Markov 체인은 3 가지 이상의 색상에 의존합니다.

  1. 무작위로 두 런을 선택하십시오. 교환 할 수 있고 여전히 법적 순서가있는 경우 교환하십시오.

  2. 인접한 두 런을 선택하십시오. 교환 할 수 있고 여전히 법적 순서가있는 경우 교환하십시오.

  3. 같은 색깔의 두 런을 선택하십시오. 합법적 가능성 중에서 무작위로 공을 재분배하십시오. (단일 런의 최대 공 수가 3 개이고 선택한 두 번의 런에서 총 5 개의 공이있는 경우 첫 번째 공은 2 개 또는 3 개의 공을 얻을 가능성이 동일합니다. 총 3 개의 공이 있었고 첫 번째 공은 1 또는 2를 얻을 가능성이 높습니다. 총 4 개의 공이 있으면 1, 2 및 3이 모두 똑같이 가능합니다).

  4. 색상 를 임의로 선택하십시오. 모든 색상 C i의 볼이 제거 된 볼의 시퀀스 S ' 를 고려하십시오 . 이제 서로 다른 색상의 인접한 볼이 닿는 S ' 에서 임의의 두 점을 선택하십시오 .CiSCiS

    ㅏ. 컬러 두 실행이 경우 원래 시퀀스에서 두 점 SCiS , 어느 쪽과 최대 길이없는, ½ 확률로 선택된 각 방향으로, 다른 하나에서 공 이동.

    CiS 하지만, 하나의 최대 길이이고, 다른 하나가 아닌, ½ 확률로 한 짧은에 최대 길이 실행에서 공을 이동합니다.

    CiS 있는 경우 확률로 ½을 한 공에서 다른 점으로 이동합니다.

    디. 컬러 가 없으면Ci 이러한 점 중 하나에서이 점 모두에서 최대 길이의 실행이있는 경우, 또는 아무것도하지 않습니다.

내 분석이 옳다면, 이것은 뒤집을 수있는 Markov 체인으로 결국 컬러 볼의 합법적 시퀀스의 균일 한 분포로 수렴되므로이 체인을 오랫동안 오래 사용하면이 균일 한 분포에 매우 가까워집니다.

ni,kik

i log2 (kni,kni,1 ni,2  ni,r),
rmi,jijmi,i=0
i log2 (jmi,jmi,1 mi,2  mi,c),
c 는 색상 수입니다.

(정확도를 위해 첫 번째 공의 색상을 포함하여 엔트로피에 많은 기여를하지는 않지만 무시하기에 안전 해야하는 하위 용어입니다.)

최신 정보:

속도를 높이는 방법이 있어야합니다. c 단계와 d 단계의 경우 분석을 사용하여 한 번에 한 가지 색상의 모든 실행에서 두 단계를 모두 수행 할 수 있다고 생각합니다. 단계 a 및 b에서, 이는 동일한 컬러의 두 개의 볼이 접촉하지 않는다는 제약을 갖는 임의의 컬러 볼의 시퀀스를 찾는 문제와 동일하다. 이 문제에 대한 혼합을 수행하는 좋은 방법이 있어야합니다. 그런 다음 c / d 단계로 a / b 단계를 번갈아 가면됩니다. 여기서 각 단계는이 두 동작을 완전히 혼합합니다. 이 Markov 체인에 대한 엄격한 분석은 없지만, 이것이 매우 빠르게 수렴되어야한다고 생각합니다.


0

말했듯이, 순열 중 하나에 모든 빨간색이 연속되어 있기 때문에 모든 순열이 똑같이 가능 하고 색상이 고르게 분포 되어 있는지 확인할 수 없습니다 .

색상이 고르게 분포되도록하는 매우 우아하지만 확실하지 않은 방법은 낮은 불일치 시퀀스를 이용하는 것입니다.

N=4001Ns

동일한 색상의 모든 볼에 연속적으로 번호가 매겨 져야합니다. 즉, 귀하의 경우 처음 100 개의 공을 빨간색으로, 다음 40 개의 공을 노란색으로, 다음으로 50 개의 녹색을 시키십시오.

kthxk

xk=(s+kϕ)(mod1),
  • ϕ=1+52=1.61803399... , 황금 비율
  • (mod1)
  • s

Nxk 항상 0과 1 사이 될 것이다.

이제 에 따라 오름차순으로 공을 주문하십시오.xk 값 .

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}
BK

s

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.