셔플 알고리즘의 정확성을 증명하는 방법?


24

임의의 순서로 항목 목록을 생성하는 두 가지 방법이 있으며 이들이 공정하게 공정한지 (비 편향적인지) 확인하고 싶습니다.

내가 사용하는 첫 번째 방법은 전체 요소 목록을 구성한 다음 셔플을 수행하는 것입니다 (예 : Fisher-Yates 셔플). 두 번째 방법은 매번 삽입 할 때마다 목록을 셔플 링하는 반복적 인 방법입니다. 의사 코드에서 삽입 기능은 다음과 같습니다.

insert( list, item )
    list.append( item )
    swap( list.random_item, list.last_item )

나는이 특정 셔플 링의 공정성을 보여주는 방법에 관심이 있습니다. 이 알고리즘이 사용되는 곳의 장점은 약간 불공평하더라도 괜찮을 것입니다. 결정하기 위해서는 공정성을 평가할 방법이 필요합니다.

첫 번째 아이디어는이 방법으로 가능한 총 순열 대 최종 길이 집합에 가능한 총 순열을 계산해야한다는 것입니다. 그러나이 알고리즘으로 인한 순열을 계산하는 방법에 대해서는 약간의 손실이 있습니다. 또한 이것이 최선의 방법인지 또는 가장 쉬운 방법인지 확신 할 수 없습니다.


많은 수의 알고리즘 실행에 대한 통계 샘플을 수행하여 예상 값과 비교하거나 일종의 임의성 테스트를 수행 할 수 있습니다.
— Dave Clarke

분포를 테스트하려고합니다. 균일하게 분포되어 있습니까? 그러나 여러 번 실행해야한다고 생각합니다.
— Dave Clarke

내가 어떻게 할 지 잘 모르겠습니다. 그것은 내가 따르는 내용의 무작위가 아니라 순서의 무작위입니다. 주문 분포를 측정 할 수있는 방법은 무엇입니까?
— edA-qa mort-ora-y

아, 바보 나, 고정 입력 세트를 사용하고 각 요소의 최종 위치를 사용하여 분포를 얻을 수 있습니다. 그래도 실제로 시뮬레이션보다 더 많은 논리적 증거를 선호합니다.
— edA-qa mort-ora-y

@ edA-qamort-ora-y : 당신의 소원은 나의 명령입니다. ;)
— Raphael

답변:


22

먼저 두 가지 명백하지만 중요한 가정을 가정 해 보겠습니다.

  1. _.random_item 마지막 위치를 선택할 수 있습니다.
  2. _.random_item확률로 모든 위치를 선택 .1엔+1

알고리즘의 정확성을 입증하려면 여기에 사용 된 것과 유사한 유도 인수가 필요합니다 .

  • 싱글 톤리스트의 경우 하나의 가능성 만 있으므로 균일하게 선택됩니다.
  • 원소를 가진리스트가 (모든 순열에서) 균일하게 선택 되었다고 가정하면 , 당신의 기술에 의해 얻어진 n + 1 개의 원소를 가진리스트 가 균일하게 선택되었음을 보여라 .엔엔+1

여기에서 증거는 잘못되었습니다. 올바른 증거는 아래를 참조하십시오. 나는 실수와 다음 단계 (소리가 좋은)가 교육적 일 수 있기 때문에 여기에 남겨 둡니다.

전체 순열에 대한 논쟁은 고통스럽기 때문에 유지해야하는 로컬 (즉, 요소 ​​별) 속성을 파생시키는 것이 유용합니다. 모든 요소가 각 위치에있을 확률이 동일한 경우 순열이 균일하게 선택됩니다. 즉

∀π∈Permn⁡Pr⁡(L=π)=1n!⟺∀i=1n⁡ ∀j=1n⁡Pr⁡(Li=j)=1n(1)

여기서 우리는 표기법의 단순성을 위해 { 1 , … , n } 을 목록에 삽입한다고 가정 합니다.n=|L|{1,…,n}

이제, 우리가 삽입 할 때 당신의 기술이 무엇을 볼 수 있도록 번째 요소. 스왑 후 세 가지 경우를 고려해야합니다.n+1

  1. 목록에서 교환되지 않은 요소 중 하나, 즉 및 j ∈ { 1 , … , n }i∈{1,…,n}j∈{1,…,n}
  2. 목록의 요소 중 하나가 바뀌 었습니다. 즉, 및 j ∈ { 1 , … , n }i=n+1j∈{1,…,n}
  3. 새로운 요소, 즉 및 j = n + 1i∈{1,…,n+1}j=n+1

각 경우에 대해 요소 가 위치 i에 있을 확률을 계산합니다 . 모두 1 로 밝혀 져야한다ji ((1)때문에 충분합니다). pn=1이라고하자1n+1(1) 은 첫 번째n 개요소중 하나가이전 목록의 임의 위치에있을 확률(유도 가설)이며ps=1입니다.pn=1nn (가정 1, 2)에의해 임의의 위치가 선택 될 확률. n 개의요소가있는 목록의 코이 스와스왑 위치 선택은독립적 인 이벤트이므로 공동 이벤트의 확률은 다음과 같습니다.ps=1n+1random_itemn

Pr⁡(Li=j,i swapped)=Pr⁡(Li=j)⋅Pr⁡(i swapped)=pnps

위한 . 이제 계산합니다.i,j∈{1,…,n}

  1. 우리는 단지 오래된 요소 만을 고려합니다 . 이러한 요소 j는 위치에있는 난 과 마지막 삽입 전에 거기 경우만 제가 교환 위치로서 선택되어 있지이며 njii

    .Pr⁡(Li=j)=pn(1−ps)=1n⋅nn+1=1n+1

  2. 여기서 우리는 이전 요소 중 하나가 마지막 위치로 바뀌 었다고 생각합니다. 요소 는 이전 위치 중 하나에 있었을 수 있으므로 j 가 i 위치에 있었고 i 가 스왑 위치로 선택된 모든 확률에 대해 합산 합니다.jjii

    .Pr⁡(Ln+1=j)=∑i=1npnps=∑i=1n1n⋅1n+1=1n+1

  3. 새 요소는 i 가 교체 위치로 선택된 경우에만 위치 에서 끝납니다.ii

    .Pr⁡(Li=j)=ps=1n+1

삽입 전략은 실제로 균일 성을 유지합니다. 유도의 힘으로, 알고리즘이 균일하게 분포 된 순열을 생성 함을 증명합니다.

경고의 한마디 : 삽입 된 요소가 서로 다른 조합이 아닌 경우이 증명은 분해됩니다. 그 이유는 첫 번째 방정식이 더 이상 유효하지 않기 때문입니다. 그러나 알고리즘은 여전히 ​​유효합니다. 중복이있는 모든 순열은 동일한 수의 임의 실행으로 생성됩니다. 중복을 표시하여 (즉, 구별 가능하게)이를 증명하고, 위의 증명을 수행하고, 표시를 사실상 제거 할 수 있습니다. 마지막 단계는 동일한 크기의 순열 세트를 동일하게 축소합니다.


스티븐 이 주석에서 올바르게 언급 했듯이 , 위의 증거는 근본적으로 이 보유하지 않기 때문에 결함이있다 . 오른쪽을 충족하지만 왼쪽 ¹을 충족시키지 않는 순열 세트에 분포를 구성 할 수 있습니다.(1)

따라서 순열의 확률을 다루어야 할 것입니다. 결국 그다지 나쁘지 않은 것으로 판명되었습니다. random_item포스트의 시작 부분에 요약 된 가정과 유도 구조는 그대로 유지됩니다. 하자 후리스트 나타내는 { 1 , ... , K가 } 삽입되어있다.L(k){1,…,k}

이 { 1 , … , n + 1 } 의 임의 순열 이라고하자 . 다음 과 같이 고유하게 쓸 수 있습니다.π′∈Permn+1{1,…,n+1}

π′=(π(1),π(2),…,π(i−1),n+1,π(i+1),…,π(n),π(i))

π∈Permni∈{1,…,n+1}Pr⁡(L(n)=π)=1n!random_itemi1n+1πi

Pr⁡(L(n+1)=π′)=Pr⁡(L(n)=π)⋅Pr⁡(i swapped)=1(n+1)!

which we had to show. By the power of induction, that proves that your algorithm creates uniformly distributed permutations.


  1. For example, assign every permutation in {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)} probability 14 and all others 0. There are also examples that assign every permutation a non-zero probability.

4
'Observe that a permutation is uniformly chosen if every element has equal probability of being at each position' - this isn't true. For instance, the set of four permutations on four elements {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3)} satisfies your constraint, but obviously isn't the set of all permutations. Unfortunately you have to use global properties of your permutation because no local conditions are enough to determine uniformity.
— Steven Stadnicki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.