Effizienter Algorithmus zur Erzeugung zweier diffuser, gestörter Permutationen eines Multisets nach dem Zufallsprinzip

13

Hintergrund

Angenommen, ich habe zwei identische Stapel von Murmeln. Jeder Marmor kann eine der Farben , wobei ≤ n ist . Es sei n_i die Anzahl der Murmeln der Farbe i in jeder Charge.n nc cc n cnn ini ii

Lassen SS die multiset sein { n 1 1 , , 1 ,n 2 2 , , 2 ,,n c 1 c , , c }{1,,1n1,2,,2n2,,c,,cnc} für eine Charge. In der Frequenzdarstellung kann SS auch geschrieben werden als ( 1 n 12 n 2c n c )(1n12n2cnc) .

Die Anzahl der unterschiedlichen Permutationen von SS wird durch das Multinom angegeben : | S S | = ( nn 1 , n 2 , ... , n c )=n!n1!n2!nc!=n!ci=11ni!.

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

Frage

Gibt es einen effizienten Algorithmus, um zwei diffuse, gestörte Permutationen PP und QQ von SS zufällig zu erzeugen ? (Die Verteilung sollte gleichmäßig sein.)

  • Eine Permutation PP ist diffus, wenn für jedes einzelne Element ii von PP die Instanzen von ii ungefähr gleichmäßig in PP .

    Angenommen, S=(1424)={1,1,1,1,2,2,2,2}S=(1424)={1,1,1,1,2,2,2,2} .

    • {1,1,1,2,2,2,2,1}{1,1,1,2,2,2,2,1} ist nicht diffus
    • {1,2,1,2,1,2,1,2}{1,2,1,2,1,2,1,2} ist diffus

    Strenger:

    • Wenn ni=1ni=1 , gibt es nur eine Instanz von ii , die in P "abgesetzt" werden kann PP, also sei Δ(i)=0Δ(i)=0 .
    • Andernfalls wäre d(i,j)d(i,j) der Abstand zwischen Instanz  jj und Instanz  - j+1j+1 von ii in PP . Subtrahieren Sie den erwarteten Abstand zwischen den Instanzen von ii , indem Sie Folgendes definieren: δ(i,j)=d(i,j)nniΔ(i)=ni1j=1δ(i,j)2
      δ(i,j)=d(i,j)nniΔ(i)=j=1ni1δ(i,j)2
      Wenn ii in P gleichmäßig beabstandet ist PP, sollte Δ(i)Δ(i) Null sein, oder sehr nahe bei Null, wenn ninnin .

    Definieren Sie nun die Statistik , um zu messen, wie viel jedes in gleichmäßig verteilt ist . Wir nennen diffus, wenn nahe Null ist, oder ungefähr . (Man kann eine Schwelle wählen, die spezifisch für so dass diffus ist, wenn .)s(P)=ci=1Δ(i)s(P)=ci=1Δ(i)iiPPPPs(P)s(P)s(P)n2s(P)n2k1k1SSPPs(P)<kn2s(P)<kn2

    Diese Einschränkung erinnert an ein strengeres Echtzeit-Planungsproblem, das als Pinwheel-Problem bezeichnet wird, mit Multiset (so dass ) und Dichte . Ziel ist es, eine zyklische unendliche Folge so dass jede Teilfolge der Länge mindestens eine Instanz von . Mit anderen Worten, ein praktikabler Zeitplan erfordert alle ; wenn dicht ist ( ), dann ist und . Das Windradproblem scheint NP-vollständig zu sein.A=n/SA=n/Sai=n/niai=n/niρ=ci=1ni/n=1ρ=ci=1ni/n=1PPaiaiiid(i,j)aid(i,j)aiAAρ=1ρ=1d(i,j)=aid(i,j)=ais(P)=0s(P)=0

  • Zwei Permutationen und sind gestört, wenn eine Störung von ; das heißt, für jeden Index .PPQQPPQQPiQiPiQii[n]i[n]

    Angenommen, .S=(1222)={1,1,2,2}S=(1222)={1,1,2,2}

    • {1,2,1,2}{1,2,1,2} und sind nicht verändert{1,1,2,2}{1,1,2,2}
    • {1,2,1,2}{1,2,1,2} und sind gestört{2,1,2,1}{2,1,2,1}

Erkundungsanalyse

Ich interessiere mich für die Familie der Multisets mit und für . Insbesondere sei .n=20n=20ni=4ni=4i4i4D=(1424344352617181)D=(1424344352617181)

  • Die Wahrscheinlichkeit , dass zwei zufällige Permutationen und von sind deranged beträgt etwa 3%.PPQQDD

    Dies kann wie folgt berechnet werden, wobei das te Laguerre-Polynom ist: Siehe hier für eine Erklärung.LkLkkk|DD|=0dtetci=1Lni(t)=0dtet(L4(t))3(L3(t))(L2(t))(L1(t))3=4.5×1011|SD|=n!ci=11ni!=20!(4!)3(3!)(2!)(1!)3=1.5×1013p=|DD|/|SD|0.03

    |DD||SD|p=0dteti=1cLni(t)=0dtet(L4(t))3(L3(t))(L2(t))(L1(t))3=4.5×1011=n!i=1c1ni!=20!(4!)3(3!)(2!)(1!)3=1.5×1013=|DD|/|SD|0.03
  • Die Wahrscheinlichkeit , dass eine zufällige Permutation von ist diffuse beträgt etwa 0,01%, die willkürliche Schwelle bei etwa Einstellung .PPDDs(P)<25s(P)<25

    Unten ist eine empirische Wahrscheinlichkeitsdarstellung von 100.000 Abtastwerten von wobei eine zufällige Permutation von .s(P)s(P)PPDD

    Bei mittleren Stichprobengrößen .s(P)Gamma(α8,β18)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

    P{1,8,2,3,4,1,5,2,3,6,1,4,2,3,7,1,5,2,4,3}{8,2,3,4,1,6,5,2,3,4,1,7,1,2,3,5,4,1,2,3}{3,6,5,1,3,4,2,1,2,7,8,5,2,4,1,3,3,2,1,4}{3,1,3,4,8,2,2,1,1,5,3,3,2,6,4,4,2,1,7,5}{4,1,1,4,5,5,1,3,3,7,1,2,2,4,3,3,8,2,2,6}s(P)11911409166509721223913616979189cdf(s(P))<105<1040.050.450.80

Die Wahrscheinlichkeit, dass zwei zufällige Permutationen gültig sind (sowohl diffus als auch gestört), liegt bei .v(0.03)(0.0001)21010v(0.03)(0.0001)21010

Ineffiziente Algorithmen

Ein üblicher "schneller" Algorithmus zum Erzeugen einer zufälligen Störung einer Menge basiert auf Zurückweisung:

do
     P ← zufällige_Permutation ( D )
bis is_derangement ( D , P )
return P

Das dauert ungefähr Iterationen, da es ungefähr mögliche Abweichungen gibt. Ein auf Zurückweisung basierender randomisierter Algorithmus wäre für dieses Problem jedoch nicht effizient, da er Iterationen in der Größenordnung von .een!/en!/e1/v10101/v1010

Im Algorithmus von verwendeten Sage , eine zufällige Störung eines multiset „wird durch die Wahl eines Elements nach dem Zufallsprinzip aus der Liste aller möglichen Störungen gebildet.“ Doch auch das ist ineffizient, da es gültige Permutationen, um sie , und außerdem würde man einen Algorithmus brauchen, um das trotzdem zu tun.v|SD|21016v|SD|21016

Weitere Fragen

Wie komplex ist dieses Problem? Kann es auf ein bekanntes Paradigma wie Netzwerkfluss, Grafikfärbung oder lineare Programmierung reduziert werden?

hftf
quelle
Möchtest du in Bezug auf deine Definition von "Spaced Out" nicht, dass für mit als Wächter? Das heißt, ein einzelnes Element sollte sich in der Mitte befinden, zwei sollten die Permutation in Drittel unterteilen und so weiter. d(i,j)n/(ni+1)d(i,j)n/(ni+1)0ijn+10ijn+1P0=Pn+1=iP0=Pn+1=i
Raphael
Was passiert, wenn für das Böse (klein, aber groß genug); Haben wir überhaupt diffuse Permutationen als? Wir halten es mit Sicherheit nicht aus, zwei verrückte zu finden! Es scheint, dass kein Element mehr als Mal vorkommen kann. S={1nk,2k}S={1nk,2k}kkn/2n/2
Raphael
1
Wie ist das Verhältnis aller Paare gestörter Permutationen unter allen Paaren diffuser Permutationen? Wie viele von allen Paaren gestörter Permutationen bestehen aus zwei diffusen? (Wenn eines der beiden Verhältnisse "hoch" ist, können wir uns auf die eine Hälfte des Prozesses konzentrieren und die andere ablehnen.)
Raphael
1
@Raphael (# 3a) von 1 Million zufälligen Permutationen von , diese 561 diffus diejenigen hatten . der Paare sind gestört. DDs(P)30s(P)306118/(5612)=6118/1570803.9%6118/(5612)=6118/1570803.9%
hftf
1
@Raphael (# 3b) Von 10 Millionen zufälligen Permutationspaaren von wurden 306893 Paare gestört. Nur 29 dieser Paare hatten beide Permutationen mit . Hier ist ein Histogramm ( Werte ). DDs(P)50s(P)50
hftf

Antworten:

3

Ein Ansatz: Sie können dies auf das folgende Problem reduzieren: Wählen Sie bei einer gegebenen Booleschen Formel eine Zuweisung gleichmäßig zufällig aus allen befriedigenden Zuweisungen von . Dieses Problem ist NP-schwer, aber es gibt Standardalgorithmen zum Erzeugen eines , das ungefähr gleichmäßig verteilt ist, und Entlehnungsmethoden aus #SAT-Algorithmen. Zum Beispiel besteht eine Technik darin, eine Hash-Funktion auszuwählen, deren Bereich eine sorgfältig ausgewählte Größe hat (ungefähr dieselbe Größe wie die Anzahl der erfüllenden Zuweisungen von ), und einen Wert innerhalb des Bereichs von gleichmäßig nach dem Zufallsprinzip auszuwählenφ(x)xφ(x)xhφyhVerwenden Sie dann einen SAT-Löser, um eine zufriedenstellende Zuordnung zu der Formel . Um es effizienter zu gestalten, können Sie als dünne lineare Karte auswählen .φ(x)(h(x)=y)h

Das mag sein, dass Sie einen Floh mit einer Kanone abschießen, aber wenn Sie keine anderen Ansätze haben, die praktikabel erscheinen, können Sie dies versuchen.

DW
quelle
Es fällt mir schwer, dem zu folgen. ist ein Boolescher Wert und ist eine Binärzeichenfolge (eine Menge von Binärvariablen)? Also bedeutet die endgültige Gleichung ...? φ(x)h(x)
vzn
0

Eine ausführliche Diskussion / Analyse dieses Problems begann im cs-Chat mit weiteren Hintergrundinformationen, die eine gewisse Subjektivität in den komplexen Anforderungen des Problems aufdeckten, jedoch keine offensichtlichen Fehler oder Versehen fanden. 1

Hier ist ein getesteter / analysierter Code, der im Vergleich zu der anderen auf SAT basierenden Lösung relativ "schnell und schmutzig" ist, aber nicht trivial / schwierig zu debuggen war. Es basiert konzeptionell lose auf einem lokalen Pseudozufalls- / Gier-Optimierungsschema, das z. B. 2-OPT für TSP ähnelt . Die Grundidee ist, mit einer zufälligen Lösung zu beginnen, die einer bestimmten Einschränkung entspricht, und sie dann lokal zu stören, um nach Verbesserungen zu suchen, gierig nach Verbesserungen zu suchen und diese zu durchlaufen und zu beenden, wenn alle lokalen Verbesserungen erschöpft sind. Ein Entwurfskriterium war, dass der Algorithmus so effizient wie möglich sein und eine Zurückweisung so weit wie möglich vermeiden sollte.

Es gibt einige Untersuchungen zu Entstellungsalgorithmen [4], die z. B. in SAGE [5] verwendet werden, die sich jedoch nicht an Multisets orientieren.

die einfache Störung ist nur "Vertauschen" von zwei Positionen in dem Tupel (den Tupeln). Die Implementierung ist in Ruby. Es folgen einige Übersichten / Hinweise mit Verweisen auf Zeilennummern.

qb2.rb (gist-github)

Der Ansatz hier ist, mit zwei gestörten Tupeln (# 106) zu beginnen und dann die Dispersion (# 107) lokal / gierig zu verbessern, kombiniert in einem Konzept namens derangesperse(# 97), wobei die Störung erhalten bleibt. Beachten Sie, dass das Vertauschen von zwei gleichen Positionen im Tupelpaar die Störung bewahrt und die Streuung verbessern kann. Dies ist (ein Teil) der Streumethode / -strategie.

Die derangeUnterroutine arbeitet im Array von links nach rechts (Multiset) und tauscht Elemente später im Array aus, wobei der Austausch nicht mit demselben Element erfolgt (# 10). Der Algorithmus ist erfolgreich, wenn die beiden Tupel ohne weitere Auslagerungen an der letzten Position immer noch gestört sind (# 16).

Es gibt drei verschiedene Ansätze, um die anfänglichen Tupel zu verändern. Das 2. Tupel p2wird immer gemischt. man kann mit Tupel 1 ( p1) beginnen, das nach a."höchster Potenz 1. Ordnung" (# 128), b.gemischter Ordnung (# 127) c.und "niedrigster Potenz 1. Ordnung" ("höchster Potenz letzter Ordnung") (# 126) geordnet ist.

Die Dispergierroutine disperseist komplizierter, aber konzeptionell nicht so schwierig. Auch hier werden Swaps verwendet. Anstatt zu versuchen, die Streuung im Allgemeinen über alle Elemente zu optimieren, wird einfach versucht, den aktuell schlimmsten Fall iterativ zu mildern. die Idee ist , die 1 zu finden st mindestens disperse Elemente von links nach rechts. Die Störung besteht darin, entweder das linke oder das rechte Element ( x, yIndex) des am wenigsten verteilten Paars mit anderen Elementen zu tauschen, jedoch niemals mit einem anderen zwischen den Paaren (was die Streuung immer verringern würde), und den Versuch zu überspringen, mit denselben Elementen zu tauschen ( selectin # 71). . mist der Mittelpunktindex des Paares (# 65).

Die Streuung wird jedoch über beide Tupel im Paar (Nr. 40) unter Verwendung der "kleinsten / am weitesten links liegenden" Streuung in jedem Paar (Nr. 25, Nr. 44) gemessen / optimiert.

der Algorithmus versucht, swap "hintersten" Elemente 1 st ( sort_by / reverse# 71).

Es gibt zwei verschiedene Strategien, true, falseum zu entscheiden, ob das linke oder rechte Element des am wenigsten verteilten Paars (# 80) ausgetauscht werden soll, entweder das linke Element für den Positionswechsel zum linken / rechten Element zur rechten Seite oder das am weitesten links oder rechts gelegene Element im dispersen Paar vom Tauschelement.

Der Algorithmus wird beendet (Nr. 91), wenn die Streuung nicht mehr verbessert werden kann (entweder Verschieben der schlechtesten Streuungsposition nach rechts oder Erhöhen der maximalen Streuung über das gesamte Tupelpaar (Nr. 85)).

Statistiken werden für Ausschuss über c= 1000 Störungen über die 3 Ansätze (# 116) und c= 1000 Störungen (# 97) ausgegeben, wobei die 2 Dispersionsalgorithmen für ein gestörtes Paar von Ausschuss (# 19, # 106) betrachtet werden. Letzteres zeichnet die durchschnittliche Gesamtstreuung (nach garantierter Störung) auf. Ein Beispiellauf ist wie folgt

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

Dies zeigt, dass der a-trueAlgorithmus die besten Ergebnisse mit ~ 92% Nicht-Zurückweisung und einem durchschnittlichen Abstand der schlechtesten Dispersion von ~ 2,6 und einem garantierten Minimum von 2 über 1000 Versuchen liefert, dh mindestens 1 ungleiches intervenierendes Element zwischen allen Paaren gleicher Elemente. es wurden Lösungen mit bis zu 3 ungleichen intervenierenden Elementen gefunden.

Der Abweichungsalgorithmus ist eine lineare Zeitvorab-Unterdrückung, und der Dispersionsalgorithmus (der bei einer gestörten Eingabe ausgeführt wird) scheint möglicherweise ~ O ( n log n ) zu sein .

1 Das Problem besteht darin, Quizbowl-Paketanordnungen zu finden, die der sogenannten "Feng-Shui" [1] oder einer "netten" zufälligen Reihenfolge entsprechen, in der "nett" etwas subjektiv und noch nicht "offiziell" quantifiziert ist. Der Autor des Problems hat es auf der Grundlage von Untersuchungen der Quizbowl-Community und "Feng-Shui-Experten" analysiert / auf die Streuungskriterien reduziert. [2] Es gibt verschiedene Ideen zu "Feng-Shui-Regeln". Einige "veröffentlichte" Forschungen wurden zu Algorithmen durchgeführt, sie erscheinen jedoch in einem frühen Stadium. [3]

[1] Packet Feng Shui / QBWiki

[2] Quizbowl-Pakete und Feng Shui / Lifshitz

[3] Frage Placement , HSQuizbowl Resource Center Forum

[4] Random Derangements generieren / Martinez, Panholzer, Prodinger

[5] Sage-Derangement-Algorithmus (Python) / McAndrew

vzn
quelle
Wenn ich weiter darüber nachdenke, gibt es einen Fehler in der derange Routine und es ist nicht immer derange. Die Swap-Position kann vorrücken, ohne etwas zu tauschen. Es gibt eine einfache Lösung, um den Erfolg richtig zu testen.
vzn