Wahrscheinlichkeitsdichtefunktion aus einem Papier, implementiert unter Verwendung von C ++, nicht wie beabsichtigt arbeiten

StackOverflow https://stackoverflow.com/questions/4103477

Frage

Also ich bin ein heuristischer Algorithmus Implementierung und ich habe über diese Funktion kommen.

Ich habe eine Reihe von 1 bis n (0 bis n-1 auf C, w / e). Ich möchte eine Reihe von Elementen wählen, i zu einem anderen Array kopieren werden. Bei einem Parameter y, (0

Nach Ansicht des Autors, "l" ist eine Zufallszahl: 0

So i, den ersten Teil der Funktion codiert, für y <= 0,5   I EINSTy bis 0,2 und n bis 100. Das heißt, es eine Zahl zwischen 0 und 99, mit durchschnittlich 20 zurückkehren mußte.   Und die Ergebnisse sind nicht zwischen 0 und n, aber einige Schwimmer. Und je größer n ist, kleiner dieser Schwimmer ist.

Dies ist der C-Test-Code. "X" ist die "l" Parameter.

//hate how code tag works, it's not even working now  
int n = 100;  
float y = 0.2;  
float n_copy;  

for(int i = 0 ; i < 20 ; i++)  
{  
    float x = (float) (rand()/(float)RAND_MAX);  // 0 <= x <= 1  
    x = x * n;                                // 0 <= x <= n  
    float p1 = (1 - y) / (n*y);  
    float p2 = (1 - ( x / n ));  
    float exp = (1 - (2*y)) / y;  
    p2 = pow(p2, exp);  
    n_copy = p1 * p2;  
    printf("%.5f\n", n_copy);  
}  

Und hier sind einige Ergebnisse (5 Dezimalstellen gekürzt):

0.03354  
0.00484  
0.00003  
0.00029  
0.00020  
0.00028  
0.00263  
0.01619  
0.00032  
0.00000  
0.03598  
0.03975    
0.00704  
0.00176  
0.00001  
0.01333  
0.03396   
0.02795  
0.00005  
0.00860 

Der Artikel lautet:

http://www.scribd.com/doc/ 3097936 / cas-The-Cunning-Ant-System-

Seite 6 und 7.

oder suchen "cas: gerissen ant-System". Auf Google

Also, was mache ich falsch? Ich glaube nicht, der Autor falsch ist, weil es mehr als 5 Papiere beschreiben diese gleiche Funktion.

Alle meine internets wem auch immer mir hilft. Dies ist wichtig für meine Arbeit.

Danke:)

War es hilfreich?

Lösung

Dmckee ist eigentlich richtig, aber ich dachte, dass ich mehr hätte erarbeiten und versuchen, hier einige der Verwirrung weg zu erklären. Ich könnte auf jeden Fall fehlschlagen. f_s(l), die Funktion, die Sie oben in Ihrer hübschen Formel haben, ist die Wahrscheinlichkeitsverteilungsfunktion. Es sagt Ihnen, für einen gegebenen Eingang l zwischen 0 und n, die Wahrscheinlichkeit, dass l ist die Segmentlänge. Die Summe (Integral) für alle Werte zwischen 0 und n soll bis 1.

gleich

Die Grafik an der Spitze der Seite 7 verwechselt diesen Punkt. Es zeichnet l vs. f_s(l), aber Sie haben es auf der Seite stellt für die Streufaktoren zu achten. Man merkt, dass die Werte auf dem Boden geht von 0 bis 1, aber es ist ein Faktor von x n auf der Seite, die bedeutet, dass die l Werte tatsächlich von 0 bis n gehen. Auch auf der y-Achse ein x 1/n ist, was bedeutet, diese Werte tatsächlich steigen nicht bis etwa 3, sie gehen bis 3 / n.

Also, was tun Sie jetzt? Nun, müssen Sie für die kumulative Verteilungsfunktion zu lösen, indem die Wahrscheinlichkeitsverteilungsfunktion über l Integration, die nicht allzu schlecht sein tatsächlich stellt sich heraus (ich habe es mit dem Wolfram Mathematica Online Integrator von x für l und unter Verwendung nur die Gleichung für y <= 0,5). Das aber wurde mit einem unbestimmten Integral und Sie sind wirklich Integration entlang x von 0 bis l. Wenn wir die resultierende Gleichung gleich irgendeine Variable (z zum Beispiel) gesetzt, jetzt das Ziel ist, für l als eine Funktion von z zu lösen. z hier ist eine Zufallszahl zwischen 0 und 1. Sie können versuchen, für diesen Teil eines symbolischen Solver verwenden, wenn Sie möchten, dass (ich werde). Dann haben Sie nicht nur erreichen Ihr Ziel von zufälligen ls aus dieser Verteilung holen zu können, haben Sie auch erreicht Nirwana.

Ein wenig mehr Arbeit getan

Ich werde ein wenig mehr helfen. Ich habe versucht zu tun, was ich sagte, etwa für y <= 0,5, aber das symbolische Algebra-System war ich wurde mit nicht in der Lage die Inversion zu tun (ein anderes System könnte in der Lage sein). Doch dann entschied ich mich für 0,5 l zu x in f_s(l) I get

y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))

Die Integration dieses über x von 0 bis l Ich habe (mit Mathematica Online Integrator):

(l / n)^(y / (1 - y))

Es wird nicht viel schöner als die mit dieser Art der Sache. Wenn ich dies gleich z gesetzt und lösen für l erhalte ich:

l = n * z^(1 / y - 1)      for .5 < y <= 1

Eine schnelle Überprüfung ist für y 1. In diesem Fall = bekommen wir l = n egal, was z. So weit, ist es gut. Nun, die Sie gerade erzeugen z (eine Zufallszahl zwischen 0 und 1) und Sie erhalten eine l erhalten, die verteilt wird, wie Sie für 0,5 l -> n-l und y -> 1-y und get

n - l = n * z^(1 / (1 - y) - 1)

l = n * (1 - z^(1 / (1 - y) - 1))      for 0 < y <= .5

Wie auch immer, das sollte Ihr Problem lösen, wenn ich einige Fehler irgendwo gemacht. Viel Glück.

Andere Tipps

Sie können falsch verstehen, was von Ihnen erwartet wird.

a (richtig normalisierte) PDF, und eine zufällige Verteilung im Einklang mit ihr werfen will, bilden Sie die kumulative Wahrscheinlichkeitsverteilung (CDF) durch die PDF-Integration, dann invertieren die CDF und verwenden ein einheitliches Zufall Prädikat als Argument die invertierten Funktion.


Ein wenig mehr Details.

f_s(l) ist das PDF, und hat auf [0,n) normalisiert.

Jetzt integrieren Sie es das CDF

zu bilden
g_s(l') = \int_0^{l'} dl f_s(l)

Beachten Sie, dass dies ein bestimmtes Integral zu einem nicht näher Endpunkt ist, die ich l' genannt habe. Die CDF ist demnach eine Funktion der l'. Unter der Annahme, wir die Normalisierung haben das Recht, g_s(N) = 1.0. Wenn dies nicht so ist, wenden wir einen einfachen Koeffizienten, es zu beheben.

Als nächstes Invertzucker der CDF und rufen Sie das Ergebnis G^{-1}(x). Dazu werden Sie wahrscheinlich wollen einen bestimmten Wert von Gamma wählen.

Dann werfen einheitliche Zufallszahl auf [0,n), und verwenden Sie diese als Argument, x, zu G^{-1}. Das Ergebnis sollte zwischen [0,1), und sollte entsprechend f_s verteilt werden.

Wie Justin sagte, können Sie ein Computer-Algebra-System für die Mathematik verwenden.

Da für jeden Wert l, y, n, wie beschrieben, die Begriffe rufen Sie P1 und P2 sind beide in [0,1) und exp ist in [1, ..) macht pow (p2, exp) auch in [0,1) so sehe ich nicht, wie Sie jemals einen Ausgang mit dem Bereich bekommen [0, n)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top