Ich möchte einen Monte-Carlo-Prozess generieren, um eine Urne mit N Kugeln der Farbe I, C [i], zu füllen. Jede Farbe C [i] hat eine minimale und maximale Anzahl von Kugeln, die in die Urne gelegt werden sollten.
Zum Beispiel versuche ich, 100 Kugeln in die Urne zu legen und kann sie mit vier Farben füllen:
- Rot - Minimum 0, Maximum 100 # NB, das tatsächliche Maximum kann nicht realisiert werden.
- Blau - Minimum 50, Maximum 100
- Gelb - Minimum 0, Maximum 50
- Grün - Minimum 25, Maximum 75
Wie kann ich N Stichproben generieren, die eine gleichmäßige Verteilung auf mögliche Ergebnisse gewährleisten?
Ich habe Lösungen für dieses Problem gesehen, bei denen die Kugeln kein Minimum oder Maximum haben oder alternativ die gleichen impliziten Minima und Maxima haben. Siehe zum Beispiel diese Diskussion zu einem etwas anderen Thema:
Gleichmäßig verteilte Gewichte erzeugen, die sich zu einer Einheit summieren?
Aber ich habe Probleme, diese Lösung zu verallgemeinern.
Antworten:
Lassen die Anzahl der Kugeln der Farbe bezeichnen . Außerdem bezeichnen und die minimale bzw. maximale Anzahl von Kugeln der Farbe . Wir wollen gleichmäßig zufällig folgende Einschränkungen gelten:C i m i M i C i ( n 1 , … , n I )ni Ci mi Mi Ci (n1,…,nI)
Zunächst können Sie die Einschränkungen der unteren Grenze (dh ) entfernen, indem Sie zunächst Kugeln der Farbe . Dadurch werden die beiden Einschränkungen wie folgt geändert:m i C imi≤ni mi Ci
Lassen bezeichnen die einheitliche Verteilung , dass wir interessiert sind , können wir Kettenregel und dynamische Programmierung Probe verwenden. effizient. Zuerst verwenden wir die Kettenregel , um wie folgt zu schreiben : wobei ist die Randverteilung von . Man beachte, dassP P P ( n 1 , … , n I ∣ B , b 1 : I )P(n1,…,nI∣B,b1:I) P P P(nI|B,b1:I)=∑ n 1 ,…, n I - 1 P(n1,…,nI|B,b1:I)nIP(nI|B,b1:I)nIB-
Das Folgende ist eine Matlab-Implementierung der Idee. Die Komplexität des Algorithmus ist wobei . Der Code verwendet zufällig generierte s in jedem Lauf. Infolgedessen haben einige der generierten Testfälle möglicherweise keine gültige Lösung. In diesem Fall druckt der Code eine Warnmeldung aus.O(I×B×K) K=maxIi=1bi mi
wo die Funktion print_constraints ist
und die Funktion dpfunc führt die dynamische Programmierberechnung wie folgt durch:
und schließlich zieht die Funktion diskrete Stichprobe (p, 1) eine Zufallsstichprobe aus der diskreten Verteilung . Eine Implementierung dieser Funktion finden Sie hier .p
quelle
Betrachten wir eine Verallgemeinerung dieses Problems. Es gibt Farbdosen mit verschiedenen Farben und Kugeln. Kann bis zu Bälle halten? Sie möchten Konfigurationen von Kugeln in den Dosen mit mindestens Kugeln in der Dose für jedes erzeugen , wobei jede Konfiguration mit gleicher Wahrscheinlichkeit erfolgt.m=4 m=4 n(0)=100 i a(0)i=(100,100,50,75) bi=(0,50,0,25) i i
Solche Konfigurationen stimmen eins zu eins mit den Konfigurationen die nach dem Entfernen von Kugeln aus der Dose , wodurch verbleibende Bälle zu höchstens pro Dose. Ich werde diese daher einfach generieren und Sie sie anschließend anpassen lassen (indem Sie Bälle für jedes wieder in can legen ). i n = n ( 0 ) - ∑ i b i = 100 - ( 0 + 50 + 0 + 25 ) = 25 a i = a ( 0 ) i - b i = ( 100 , 50 , 50 , 50 ) b i i ibi i n=n(0)−∑ibi=100−(0+50+0+25)=25 ai=a(0)i−bi=(100,50,50,50) bi i i
Um diese Konfigurationen hochzuzählen, korrigieren Sie alle bis auf zwei Indizes, z. B. und . Angenommen, es gibt bereits Bälle in Dose für jedes sich von und . Das lässt Bälle. Abhängig davon, wo sich die anderen Kugeln befinden, sind diese gleichmäßig in den Dosen und . Die möglichen Konfigurationen sind in der Anzahl (siehe die Kommentare) und reichen von der Platzierung so vieler Bälle in Dosei j sk k k i j si+sj n−(si+sj) i j 1+min(ai+aj−si−sj,si+sj) i wie möglich den ganzen Weg so viele Bälle in Dose durch Platzieren wie möglich.j
Wenn Sie möchten, können Sie die Gesamtzahl der Konfigurationen zählen, indem Sie dieses Argument rekursiv auf die verbleibenden Dosen anwenden . Um Proben zu erhalten, müssen wir diese Anzahl jedoch nicht einmal kennen. Alles, was wir tun müssen, ist, wiederholt alle möglichen ungeordneten Paare von Dosen zu besuchen und die Verteilung der Kugeln innerhalb dieser beiden Dosen zufällig (und gleichmäßig) zu ändern. Dies ist eine Markov-Kette mit einer begrenzten Wahrscheinlichkeitsverteilung, die über alle möglichen Zustände gleichmäßig ist (wie mit Standardmethoden leicht gezeigt werden kann). Daher reicht es aus, in einem zu beginnenm−2 {i,j} Führen Sie die Kette so lange aus, bis die Grenzverteilung erreicht ist, und verfolgen Sie dann die von diesem Verfahren besuchten Zustände. Wie üblich sollte diese Folge von Zuständen "verdünnt" werden, um eine serielle Korrelation zu vermeiden, indem sie übersprungen (oder zufällig wiederholt werden). Das Ausdünnen um den Faktor etwa der Hälfte der Anzahl der Dosen funktioniert in der Regel gut, da nach durchschnittlich vielen Schritten jede Dose betroffen ist und eine wirklich neue Konfiguration entsteht.
Dieser Algorithmus kostet Aufwand, um durchschnittlich jede zufällige Konfiguration zu generieren. Obwohl andere -Algorithmen existieren, hat dieser den Vorteil, dass die kombinatorischen Berechnungen nicht vorher durchgeführt werden müssen.O(m) O(m)
Lassen Sie uns als Beispiel eine kleinere Situation manuell herausarbeiten. Sei zum Beispiel und . Es gibt 15 gültige Konfigurationen, die als Zeichenfolgen von Belegungsnummern geschrieben werden können. Zum Beispiel werden zwei Kugeln in die zweite Dose und eine Kugel in der vierten Dose. Betrachten wir das Argument und betrachten wir die Gesamtbelegung der ersten beiden Dosen. Wenn das Bälle ist, bleiben für die letzten beiden Dosen keine Bälle übrig. Das gibt die Staatena=(4,3,2,1) n=3 s1+s2=3
0201
wobeis1+s2=2
**
alle möglichen Belegungsnummern für die letzten beiden Dosen darstellt: nämlich00
. Wenn , sind die Zuständewo3×2=6 s1+s2=1
**
kann jetzt entweder10
oder sein01
. Das ergibt weitere Zustände. Wenn , sind die Zuständewo jetzt2×2=4 s1+s2=0 2 1 4+6+4+1=15
**
sein kann20
,11
aber nicht02
(wegen der Grenze von einer Kugel in der letzten Dose). Das ergibt weitere Zustände. Wenn schließlich , befinden sich alle Kugeln in den letzten beiden Dosen, die bis zu ihren Grenzen von und voll sein müssen . Die gleich wahrscheinlichen Zustände sind daherUnter Verwendung des folgenden Codes wurde eine Folge von solcher Konfigurationen erzeugt und auf jede dritte verdünnt, wodurch Konfigurationen der Zustände erzeugt wurden. Ihre Frequenzen waren die folgenden:10,009 3337 15
Ein Test der Gleichmäßigkeit ergibt einen Wert von , ( Freiheitsgrade): Das ist eine schöne Übereinstimmung mit der Hypothese, dass dieses Verfahren gleich wahrscheinliche Zustände erzeugt.χ2 χ2 11.2 p=0.67 14
Dieser
R
Code ist so eingerichtet, dass er die jeweilige Situation behandelt. Ändern Sie sicha
undn
arbeiten Sie mit anderen Situationen. StellenN
Sie den Wert so ein, dass die Anzahl der nach dem Ausdünnen erforderlichen Realisierungen generiert wird .Dieser Code betrügt ein wenig, indem er systematisch alle Paare durchläuft . Wenn Sie über das Ausführen der Markow - Kette zu streng sein wollen, erzeugen , und zufällig, in dem kommentierten Code als gegeben.(i,j)
i
j
ij
quelle
g
g