Comment prouver l'exactitude d'un algorithme de lecture aléatoire?

24

J'ai deux façons de produire une liste d'articles dans un ordre aléatoire et je voudrais déterminer s'ils sont également équitables (sans biais).

La première méthode que j'utilise est de construire la liste complète des éléments puis de faire un shuffle dessus (disons un shuffle de Fisher-Yates). La deuxième méthode est plus une méthode itérative qui maintient la liste mélangée à chaque insertion. En pseudo-code, la fonction d'insertion est:

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

Je m'intéresse à la façon de montrer l'équité de ce brassage particulier. Les avantages de cet algorithme, où il est utilisé, sont suffisants pour que même s'il est légèrement injuste, ce serait correct. Pour décider, j'ai besoin d'un moyen d'évaluer son équité.

Ma première idée est que je dois calculer les permutations totales possibles de cette façon par rapport aux permutations totales possibles pour un ensemble de la longueur finale. Je suis cependant un peu perdu sur la façon de calculer les permutations résultant de cet algorithme. Je ne peux pas non plus être certain que c'est l'approche la meilleure ou la plus simple.

edA-qa mort-ora-y
la source
Vous pouvez faire un échantillon statistique sur un grand nombre d'exécutions de votre algorithme et le comparer à la valeur attendue, ou effectuer une sorte de test d'aléatoire sur celui-ci.
Dave Clarke
Vous souhaitez tester la distribution. Est-il uniformément réparti ou asymétrique? Je soupçonne cependant que vous auriez besoin de l'exécuter plusieurs fois.
Dave Clarke
Je ne sais pas comment je ferais cela. Ce n'est pas le caractère aléatoire du contenu que je recherche, mais le caractère aléatoire de la commande. Quelle approche peut mesurer la distribution de la commande?
edA-qa mort-ora-y
Ah, idiot, je pourrais utiliser un ensemble d'entrée fixe et utiliser la position finale de chaque élément pour obtenir une distribution. Pourtant, je préférerais en fait davantage une preuve logique qu'une simulation.
edA-qa mort-ora-y
@ edA-qamort-ora-y: Votre souhait est ma commande. ;)
Raphael

Réponses:

22

D'abord, faisons deux hypothèses peut-être évidentes mais importantes:

  1. _.random_item peut choisir la dernière position.
  2. _.random_itemchoisit chaque position avec probabilité .1n+1

Afin de prouver l'exactitude de votre algorithme, vous avez besoin d'un argument inductif similaire à celui utilisé ici :

  • Pour la liste singleton, il n'y a qu'une seule possibilité, elle est donc uniformément choisie.
  • En supposant que la liste avec éléments a été uniformément choisie (parmi toutes les permutations), montrez que celle avec n + 1 éléments obtenue par votre technique est uniformément choisie.nn+1

A partir de là, la preuve est fausse. Veuillez voir ci-dessous pour une preuve correcte; Je laisse cela ici parce que l'erreur et les étapes suivantes (qui sont saines) peuvent être éducatives.

Il est utile de dériver une propriété locale (c'est-à-dire au niveau des éléments) qui doit tenir, car discuter de la permutation entière est douloureux. Observez qu'une permutation est uniformément choisie si chaque élément a une probabilité égale d'être à chaque position, c'est-à-dire

πPermnPr(L=π)=1n!je=1n j=1nPr(Lje=j)=1n(1)

et nous supposons par souci de simplicité de notation que nous insérons { 1 , , n } dans la liste.n=|L|{1,,n}

Voyons maintenant ce que fait votre technique lors de l'insertion du er élément. Nous devons considérer trois cas (après l'échange):n+1

  1. Un des éléments de la liste, non échangé, à savoir et j { 1 , , n }je{1,,n}j{1,,n}
  2. Un des éléments de la liste, échangé, ie et j { 1 , , n }je=n+1j{1,,n}
  3. Le nouvel élément, ie et j = n + 1je{1,,n+1}j=n+1

Pour chaque cas, nous calculons la probabilité que l'élément soit en position i ; tous doivent se révéler être 1jje (ce qui est suffisant en raison de(1)). Soitpn=11n+1(1) la probabilité qu'un desnpremierséléments se trouve à n'importe quelle position dans l'ancienne liste (hypothèse d'induction), etps=1pn=1nn la probabilité que n'importe quelle position soit choisie par(hypothèses 1, 2). Notez que le choix de la liste avecnéléments et le choix de la position de swap sontdes événements indépendants, donc les probabilités d'événements conjoints facteur, par exempleps=1n+1random_itemn

Pr(Lje=j,je troqué)=Pr(Lje=j)Pr(je troqué)=pnps

pour . Maintenant, pour les calculs.je,j{1,,n}

  1. Nous ne considérons que les anciens éléments . Un tel élément j est en position i si et seulement s'il était là avant la dernière insertion et i n'est pas sélectionné comme position de swap, c'est-à-dire njjeje

    .Pr(Lje=j)=pn(1-ps)=1nnn+1=1n+1

  2. Ici, nous considérons que l'un des anciens éléments est remplacé par la dernière position. L'élément aurait pu être à n'importe laquelle des anciennes positions, donc nous additionnons toutes les probabilités que j était à la position i et i est choisi comme position de swap, c'est-à-direjjjeje

    .Pr(Ln+1=j)=je=1npnps=je=1n1n1n+1=1n+1

  3. Le nouvel élément se retrouve à la position si et seulement si i est choisi comme position de swap, c'est-à-direjeje

    .Pr(Lje=j)=ps=1n+1

Tout s'est bien passé, votre stratégie d'insertion préserve en effet l'uniformité. Par la puissance de l'induction, cela prouve que votre algorithme crée des permutations uniformément réparties.

Un mot d'avertissement: cette preuve tombe en panne si les éléments insérés ne sont pas différents par paire resp. se distingue, car alors la toute première équation n'est plus valable. Mais votre algorithme est toujours valide; chaque permutation avec doublons est générée par le même nombre d'exécutions aléatoires. Vous pouvez le prouver en marquant les doublons (c'est-à-dire en les rendant reconnaissables), effectuer la preuve ci-dessus et supprimer les marquages ​​(virtuellement); la dernière étape réduit les mêmes ensembles de permutations de taille égale.


(1)

random_itemL(k){1,,k}

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

π=(π(1),π(2),,π(je-1),n+1,π(je+1),,π(n),π(je))

πPermnje{1,,n+1}Pr(L(n)=π)=1n!random_itemje1n+1πje

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

que nous devions montrer. Par la puissance de l'induction, cela prouve que votre algorithme crée des permutations uniformément réparties.


  1. {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140
Raphael
la source
4
«Observez qu'une permutation est uniformément choisie si chaque élément a une probabilité égale d'être à chaque position» - ce n'est pas vrai. Par exemple, l'ensemble de quatre permutations sur quatre éléments {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} satisfait votre contrainte, mais n'est évidemment pas l'ensemble de toutes les permutations. Malheureusement, vous devez utiliser les propriétés globales de votre permutation car aucune condition locale n'est suffisante pour déterminer l'uniformité.
Steven Stadnicki