Como provar a correção de um algoritmo de reprodução aleatória?


24

Eu tenho duas maneiras de produzir uma lista de itens em uma ordem aleatória e gostaria de determinar se eles são igualmente justos (imparciais).

O primeiro método que eu uso é construir a lista inteira de elementos e, em seguida, fazer um shuffle (por exemplo, um shuffle de Fisher-Yates). O segundo método é mais um método iterativo que mantém a lista embaralhada a cada inserção. No pseudo-código, a função de inserção é:

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

Estou interessado em como alguém mostra a imparcialidade desse embaralhamento em particular. As vantagens desse algoritmo, onde é usado, são suficientes para que, mesmo que um pouco injusto, tudo bem. Para decidir, preciso de uma maneira de avaliar sua justiça.

Minha primeira idéia é que eu preciso calcular o total de permutações possíveis dessa forma versus as totais de permutações possíveis para um conjunto do comprimento final. No entanto, estou um pouco sem saber como calcular as permutações resultantes desse algoritmo. Também não posso ter certeza de que esta é a melhor ou mais fácil abordagem.


Você pode fazer uma amostra estatística de um grande número de execuções do seu algoritmo e compará-lo com o valor esperado ou executar algum tipo de teste de aleatoriedade.
Dave Clarke

Você deseja testar a distribuição. É uniformemente distribuído ou inclinado. Suspeito, no entanto, que você precisaria executá-lo muitas e muitas vezes.
Dave Clarke

Não estou claro como eu faria isso. Não é a aleatoriedade do conteúdo que procuro, mas a aleatoriedade da ordem. Qual abordagem pode medir a distribuição da encomenda?
EdA-qa mort-ora-y

Ah, bobo, eu poderia usar um conjunto de entradas fixas e usar a posição final de cada elemento para obter uma distribuição. Ainda assim, eu preferiria mais uma prova lógica do que uma simulação.
EdA-qa mort-ora-y

@ edA-qamort-ora-y: Seu desejo é o meu comando. ;)
Raphael

Respostas:


22

Primeiro, vamos fazer duas suposições talvez óbvias, mas importantes:

  1. _.random_item pode escolher a última posição.
  2. _.random_itemescolhe todas as posições com probabilidade .1n+1

Para provar a correção do seu algoritmo, você precisa de um argumento indutivo semelhante ao usado aqui :

  • Para a lista de singleton, há apenas uma possibilidade, portanto ela é escolhida uniformemente.
  • Supondo que a lista com elementos tenha sido escolhida uniformemente (de todas as permutações), mostre que aquela com n + 1 elementos obtidos por sua técnica é escolhida uniformemente.nn+1

A partir daqui, a prova está errada. Veja abaixo uma prova correta; Deixo isso aqui porque o erro e as etapas a seguir (que são válidas) podem ser educacionais.

É útil derivar uma propriedade local (isto é, em termos de elementos) que deve ser mantida, porque argumentar sobre toda a permutação é doloroso. Observe que uma permutação é escolhida uniformemente se cada elemento tiver a mesma probabilidade de estar em cada posição, ou seja,

πPermnPr(L=π)=1n!i=1n j=1nPr(Li=j)=1n(1)

onde e assumimos, por uma questão de simplicidade notacional, que inserimos { 1 , , n } na lista.n=|L|{1,,n}

Agora, vamos ver o que sua técnica faz ao inserir o elemento. Temos que considerar três casos (após a troca):n+1

  1. Um dos elementos da lista, não trocado, ou seja, e j { 1 , , n }i{1,,n}j{1,,n}
  2. Um dos elementos da lista foi trocado, ou seja, e j { 1 , , n }i=n+1j{1,,n}
  3. O novo elemento, isto é, e j = n + 1i{1,,n+1}j=n+1

Para cada caso, calculamos a probabilidade do elemento estar na posição i ; tudo tem que vir a ser 1ji (que é suficiente devido a(1)). Sejapn=11n+1(1) ser a probabilidade de um dos primeirosnelementos, sendo em qualquer posição na lista velha (hipótese de indução), eps=1pn=1nn a probabilidade de qualquer posição ser escolhida por(suposições 1, 2). Observe que a escolha da lista comnelementos e a escolha da posição de swap sãoeventos independentes; portanto, as probabilidades de eventos conjuntos são fatores, por exemplo,ps=1n+1random_itemn

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

i,j{1,,n}

  1. njii

    Pr(Li=j)=pn(1ps)=1nnn+1=1n+1

  2. jjii

    Pr(Ln+1=j)=i=1npnps=i=1n1n1n+1=1n+1

  3. ii

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

Tudo acabou bem, sua estratégia de inserção realmente preserva a uniformidade. Pelo poder da indução, isso prova que seu algoritmo cria permutações uniformemente distribuídas.

Uma palavra de advertência: essa prova se decompõe se os elementos inseridos não diferem entre pares. distinguível, porque a primeira equação não é mais válida. Mas seu algoritmo ainda é válido; toda permutação com duplicatas é gerada pelo mesmo número de execuções aleatórias. Você pode comprovar isso marcando duplicados (ou seja, tornando-os distinguíveis), executando a prova acima e removendo as marcações (virtualmente); o último passo recolhe conjuntos de permutações de tamanhos iguais para o mesmo.


(1)

random_itemL(k){1,,k}

πPermn+1{1,,n+1}

π=(π(1),π(2),,π(i1),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)!

o que tivemos que mostrar. Pelo poder da indução, isso prova que seu algoritmo cria permutações uniformemente distribuídas.


  1. {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140

4
'Observe que uma permutação é escolhida uniformemente se todo elemento tem probabilidade igual de estar em cada posição' - isso não é verdade. Por exemplo, o conjunto de quatro permutações em quatro elementos {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} satisfaz sua restrição, mas obviamente não é o conjunto de todas as permutações. Infelizmente, você precisa usar propriedades globais de sua permutação, porque nenhuma condição local é suficiente para determinar a uniformidade.
Steven Stadnicki
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.