Algorithme efficace pour générer au hasard deux permutations diffuses et dérangées d'un multiset

13

Contexte

Supposons que j'ai deux lots identiques de billes. Chaque marbre peut être l'une des couleurs , où c≤n . Soit n_i le nombre de billes de couleur i dans chaque lot.nccnnii

Soit S le multiset {1,,1n1,2,,2n2,,1c,,cnc} représentant un lot. Dans la représentation fréquentielle , S peut également s'écrire (1n12n2cnc) .

Le nombre de permutations distinctes de S est donné par le multinomial :

|SS|=(nn1,n2,,nc)=n!n1!n2!nc!=n!i=1c1ni!.

Question

Existe-t-il un algorithme efficace pour générer au hasard deux permutations diffuses et dérangées P et Q de S ? (La distribution doit être uniforme.)

  • Une permutation P est diffus si pour chaque élément distinct i de P , les instances de i sont espacées à peu près uniformément dans P .

    Par exemple, supposons S=(1424)={1,1,1,1,2,2,2,2} .

    • {1,1,1,2,2,2,2,1} n'est pas diffus
    • {1,2,1,2,1,2,1,2} est diffus

    Plus rigoureusement:

    • Si , il n'y a qu'une seule instance de pour «espacer» dans , alors soit .i P Δ ( i ) = 0ni=1iPΔ(i)=0
    • Sinon, soit est la distance entre instance  et l' instance  de dans . Soustrayez-en la distance attendue entre les instances de , en définissant ce qui suit: Si est régulièrement espacé dans , alors doit être nul, ou très proche de zéro si .j j + 1 i P i δ ( i , j ) = d ( i , j ) - nd(i,j)jj+1iPi i P Δ ( i ) n in
      δ(i,j)=d(i,j)nniΔ(i)=j=1ni1δ(i,j)2
      iPΔ(i)nin

    Définir maintenant la statistique pour mesurer combien chaque est régulièrement espacées dans . Nous appelons diffus si est proche de zéro, ou à peu près . (On peut choisir un seuil propre à pour que soit diffus si )i P P s ( P ) s ( P ) n 2 k 1s(P)=i=1cΔ(i)iPPs(P)s(P)n2k1 P s ( P ) < k n 2SPs(P)<kn2

    Cette contrainte rappelle un problème d'ordonnancement en temps réel plus strict appelé problème de moulin à vent avec multiset (de sorte que ) et la densité . L'objectif est de programmer une séquence cyclique infinie telle que toute sous-séquence de longueur contienne au moins une instance de . En d'autres termes, un programme réalisable nécessite tout ; si est dense ( ), alors et . Le problème du moulinet semble être NP-complet.a i = n / n i ρ = c i = 1 n i / n = 1 P a i i d ( i , j ) a i A ρ = 1 d ( i , j ) = a i s ( P ) = 0A=n/Sai=n/niρ=i=1cni/n=1Paiid(i,j)aiAρ=1d(i,j)=ais(P)=0

  • Deux permutations et sont dérangées si est un dérangement de ; c'est-à-dire pour chaque index .Q P Q P iQ i i [ n ]PQPQPiQii[n]

    Par exemple, supposons .S=(1222)={1,1,2,2}

    • {1,2,1,2} et ne sont pas dérangés{1,1,2,2}
    • {1,2,1,2} et sont dérangés{2,1,2,1}

Analyse exploratoire

Je m'intéresse à la famille des multisets avec et pour . En particulier, laissez .n=20ni=4i4D=(1424344352617181)

  • La probabilité que deux permutations aléatoires et de soient dérangées est d'environ 3%.PQD

    Ceci peut être calculé comme suit, où est le ème polynôme de Laguerre: Voir ici pour une explication.Lkk

    |DD|=0dteti=1cLni(t)=0dtet(L4(t))3(L3(t))(L2(t))(L1(t))3=4.5×1011|SD|=n!i=1c1ni!=20!(4!)3(3!)(2!)(1!)3=1.5×1013p=|DD|/|SD|0.03
  • La probabilité qu'une permutation aléatoire de soit diffuse est d'environ 0,01%, fixant le seuil arbitraire à environ .PDs(P)<25

    Ci-dessous se trouve un diagramme de probabilité empirique de 100 000 échantillons de où est une permutation aléatoire de .s(P)PD

    Pour des échantillons de taille moyenne, .s(P)Gamma(α8,β18)

    Ps(P)cdf(s(P)){1,8,2,3,4,1,5,2,3,6,1,4,2,3,7,1,5,2,4,3}1191<105{8,2,3,4,1,6,5,2,3,4,1,7,1,2,3,5,4,1,2,3}140916<104{3,6,5,1,3,4,2,1,2,7,8,5,2,4,1,3,3,2,1,4}650972<10.05{3,1,3,4,8,2,2,1,1,5,3,3,2,6,4,4,2,1,7,5}12239136<10.45{4,1,1,4,5,5,1,3,3,7,1,2,2,4,3,3,8,2,2,6}16979189<10.80

La probabilité que deux permutations aléatoires soient valides (à la fois diffuses et dérangées) est d'environ .v(0.03)(0.0001)21010

Algorithmes inefficaces

Un algorithme «rapide» commun pour générer un dérangement aléatoire d'un ensemble est basé sur le rejet:

faire
     P ← permutation_aléatoire ( D )
jusqu'à is_derangement ( D , P )
retour P

ce qui prend environ itérations, car il y a à peu près dérangements possibles. Cependant, un algorithme randomisé basé sur le rejet ne serait pas efficace pour ce problème, car il prendrait l'ordre de itérations.en!/e1/v1010

Dans l'algorithme utilisé par Sage , un dérangement aléatoire d'un multiset "se forme en choisissant un élément au hasard dans la liste de tous les dérangements possibles". Pourtant, cela aussi est inefficace, car il existe des permutations valides pour énumérer, et en plus, il faudrait un algorithme juste pour le faire de toute façon.v|SD|21016

D'autres questions

Quelle est la complexité de ce problème? Peut-il être réduit à n'importe quel paradigme familier, tel que le flux réseau, la coloration des graphiques ou la programmation linéaire?

hftf
la source
Concernant votre définition de "espacé", ne voulez-vous pas pour avec comme sentinelles? C'est-à-dire qu'un seul élément doit être au milieu, deux doivent partitionner la permutation en tiers, et ainsi de suite. d(i,j)n/(ni+1)0ijn+1P0=Pn+1=i
Raphael
Que se passe-t-il si pour le mal (petit, mais assez grand); pouvons-nous même avons diffus permutations que? Nous ne supportons certainement pas un changement pour en trouver deux dérangés! Semble qu'aucun élément ne peut se produire plus de fois. S={1nk,2k}kn/2
Raphael
1
Quel est le rapport de toutes les paires de permutations dérangées parmi toutes les paires de permutations diffuses ? De même, sur toutes les paires de permutations dérangées, combien se composent de deux diffusions? (Si l'un des ratios est «élevé», nous pouvons concentrer nos efforts sur une moitié du processus, laissant l'autre au rejet.)
Raphael
1
@Raphael (# 3a) Sur 1 million de permutations aléatoires de , ces 561 diffuses avaient . des paires sont dérangées. Ds(P)306118/(5612)=6118/1570803.9%
hftf
1
@Raphael (# 3b) Sur 10 millions de paires aléatoires de permutations de , 306893 paires ont été dérangées. Seulement 29 de ces paires avaient les deux permutations avec . Voici un histogramme ( valeurs ). Ds(P)50
hftf

Réponses:

3

Une approche: vous pouvez réduire cela au problème suivant: Étant donné une formule booléenne , choisissez une affectation uniformément au hasard parmi toutes les affectations satisfaisantes de . Ce problème est difficile à NP, mais il existe des algorithmes standard pour générer un qui est approximativement uniformément distribué, empruntant des méthodes aux algorithmes #SAT. Par exemple, une technique consiste à choisir une fonction de hachage dont la plage a une taille soigneusement choisie (environ la même taille que le nombre d'assignations satisfaisantes deφ(x)xφ(x)xhφ ), de choisir uniformément au hasard une valeur dans la plage deyh, puis utilisez un solveur SAT pour trouver une affectation satisfaisante à la formule . Pour le rendre efficace, vous pouvez choisir comme une carte linéaire clairsemée.φ(x)(h(x)=y)h

Cela pourrait être de tirer sur une puce avec un canon, mais si vous n'avez pas d'autres approches qui semblent réalisables, c'est celle que vous pouvez essayer.

DW
la source
trouver cela difficile à suivre. est une valeur booléenne et est une chaîne binaire (ensemble de variables binaires)? donc l'équation finale signifie ...? φ(x)h(x)
vzn
0

une discussion / analyse approfondie de ce problème a commencé dans le chat cs avec un contexte supplémentaire qui a révélé une certaine subjectivité dans les exigences complexes du problème mais n'a trouvé aucune erreur ou omission pure et simple. 1

voici du code testé / analysé qui, par rapport à l'autre solution basée sur SAT, est relativement "rapide et sale" mais n'était pas trivial / difficile à déboguer. son concept est vaguement basé sur un schéma d'optimisation pseudo-aléatoire / gourmand local quelque peu similaire à par exemple 2-OPT pour TSP . l'idée de base est de commencer par une solution aléatoire qui correspond à une contrainte, puis de la perturber localement pour rechercher des améliorations, de rechercher avidement des améliorations et de les parcourir, et de terminer lorsque toutes les améliorations locales ont été épuisées. l'un des critères de conception était que l'algorithme devait être aussi efficace / éviter le rejet autant que possible.

il existe des recherches sur les algorithmes de dérangement [4], par exemple utilisés dans SAGE [5], mais ils ne sont pas orientés autour de multisets.

la perturbation simple n'est que des «échanges» de deux positions dans le (s) tuple (s). l'implémentation est en rubis. Voici un aperçu / notes avec des références aux numéros de ligne.

qb2.rb (gist-github)

l'approche est ici de commencer avec deux tuples dérangés (# 106) et ensuite d'améliorer localement / avidement la dispersion (# 107), combinés dans un concept appelé derangesperse(# 97), en préservant le dérangement. noter que l'échange de deux mêmes positions dans la paire de tuples préserve le dérangement et peut améliorer la dispersion, ce qui fait (partie de) la méthode / stratégie dispersée.

le derangesous - programme fonctionne de gauche à droite sur le tableau (multiset) et échange avec des éléments plus tard dans le tableau où l'échange n'est pas avec le même élément (# 10). l'algorithme réussit si, sans autre échange à la dernière position, les deux tuples sont toujours dérangés (# 16).

il existe 3 approches différentes pour déranger les tuples initiaux. le 2e tuple p2est toujours mélangé. on peut commencer par le tuple 1 ( p1) ordonné par a."les plus hautes puissances 1er ordre" (# 128), l' b.ordre mélangé (# 127) c.et les "puissances les plus basses 1er ordre" ("les plus hautes puissances dernier ordre") (# 126).

la routine de dispersion disperseest plus complexe mais conceptuellement pas si difficile. encore une fois, il utilise des swaps. plutôt que d'essayer d'optimiser la dispersion en général sur tous les éléments, il essaie simplement d'atténuer de manière itérative le pire cas actuel. l'idée est de trouver le 1 er élément le moins dispersé, de gauche à droite. la perturbation consiste à échanger les éléments gauche ou droit ( x, yindex) de la paire la moins dispersée avec d'autres éléments, mais jamais entre la paire (ce qui diminuerait toujours la dispersion), et à ignorer également toute tentative d'échange avec les mêmes éléments ( selectdans # 71) . mest l'indice médian de la paire (# 65).

cependant, la dispersion est mesurée / optimisée sur les deux tuples de la paire (# 40) en utilisant la dispersion "la plus basse / la plus à gauche" de chaque paire (# 25, # 44).

l'algorithme tente d'échanger les éléments "les plus éloignés" 1 er ( sort_by / reverse# 71).

il y a deux stratégies différentes true, falsepour décider de permuter l'élément gauche ou droit de la paire la moins dispersée (# 80), soit l'élément gauche pour la position de permutation vers l'élément gauche / droit vers le côté droit, soit l'élément le plus éloigné gauche ou droit dans la paire dispersée de l'élément d'échange.

l'algorithme se termine (# 91) quand il ne peut plus améliorer la dispersion (soit en déplaçant le pire emplacement dispersé vers la droite, soit en augmentant la dispersion maximale sur toute la paire de tuple (# 85)).

des statistiques sont produites pour les rejets supérieurs à c1000 dérangements sur les 3 approches (n ° 116) et c= 1000 dérangements (n ° 97), en examinant les 2 algorithmes dispersés pour une paire dérangée par rejet (n ° 19, n ° 106). ce dernier suit la dispersion moyenne totale (après dérangement garanti). un exemple d'exécution est le suivant

c       0.661000
b       0.824000
a       0.927000
[2.484, 2, 4]
[2.668, 2, 4]

cela montre que l' a-truealgorithme donne les meilleurs résultats avec ~ 92% de non-rejet et une pire distance de dispersion moyenne de ~ 2,6, et un minimum garanti de 2 sur 1000 essais, soit au moins 1 élément intermédiaire non égal entre toutes les paires de mêmes éléments. il a trouvé des solutions allant jusqu'à 3 éléments intermédiaires non égaux.

l'algorithme de dérangement est une pré-réjection de temps linéaire, et l'algorithme de dispersion (fonctionnant sur une entrée dérangée) semble être probablement ~ .O(nlogn)

1 le problème est de trouver des arrangements de paquets quizbowl qui satisfont ce que l'on appelle le "feng shui" [1] ou un ordre aléatoire "agréable" où "agréable" est quelque peu subjectif et pas encore "officiellement" quantifié; l'auteur du problème l'a analysé / réduit aux critères de dérange / dispersion sur la base de recherches menées par la communauté des quizbowl et des "experts du feng shui". [2] il existe différentes idées sur les «règles du feng shui». des recherches "publiées" ont été faites sur les algorithmes mais elles apparaissent à un stade précoce. [3]

[1] Paquet feng shui / QBWiki

[2] Paquets Quizbowl et feng shui / Lifshitz

[3] Placement des questions , forum du centre de ressources HSQuizbowl

[4] Génération de dérangements aléatoires / Martinez, Panholzer, Prodinger

[5] Algorithme de dérangement de Sage (python) / McAndrew

vzn
la source
Pour plus de réflexion, il y a un problème dans la routine derange et ça ne dérange pas toujours. la position de swap peut avancer sans permuter quoi que ce soit. theres une solution simple pour tester correctement le succès.
vzn