funzione di densità di probabilità da una carta, implementato usando C ++, non funziona come previsto
-
29-09-2019 - |
Domanda
Quindi sono l'implementazione di un algoritmo euristico, e ho incontrato questa funzione.
Ho un array di 1 a n (da 0 a n-1 su C, w / e). Voglio scegliere una serie di elementi copierò ad un altro array. Dato un parametro y, (0 Secondo l'autore, "l" è un numero casuale: 0 Così ho codificato la prima parte della funzione, per y <= 0,5
y ho impostato a 0,2, e n a 100. Ciò significa che dovevano restituire un numero compreso tra 0 e 99, con una media di 20.
E i risultati non sono compresi tra 0 e n, ma alcuni carri allegorici. E la più grande n è, più piccolo questo galleggiante è. Questo è il codice di prova C. "X" è il parametro "l". E qui ci sono alcuni risultati (5 decimali troncate): L'articolo è: http://www.scribd.com/doc/ 3097936 / CAS-The-Cunning-Ant-System pagine 6 e 7. o cercare "CAS: Cunning sistema formica". Su google Che cosa sto facendo di sbagliato? Io non credo che l'autore è sbagliato, perché ci sono più di 5 carte che descrivono questa stessa funzione. tutti i miei internet a chi mi aiuta. Questo è importante per il mio lavoro. Grazie:) //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);
}
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
Soluzione
dmckee è in realtà corretto, ma ho pensato che avrei elaborare più e cercare di spiegare alcune delle confusione qui. Ho potuto sicuramente fallire. f_s(l)
, la funzione che avete nella vostra bella formula di cui sopra, è la funzione di distribuzione di probabilità. Vi dice, per un dato l
di ingresso compreso tra 0 e n, la probabilità che l
è la lunghezza del segmento. La somma (integrale) per tutti i valori compresi tra 0 e n dovrebbe essere uguale a 1.
Il grafico nella parte superiore della pagina 7 confonde questo punto. Si trame l
contro f_s(l)
, ma si deve guardare fuori per i fattori di randagi che mette a lato. Si nota che i valori in movimento in basso da 0 a 1, ma c'è un fattore di x n
sul lato, il che significa che i valori l
effettivamente andare da 0 a n. Inoltre, sulla asse y è un x 1/n
che significa che questi valori non effettivamente arrivano fino a circa 3, vanno a 3 / n.
Allora, cosa fai adesso? Ebbene, è necessario risolvere per la funzione di ripartizione, integrando la funzione di distribuzione di probabilità su l
che si trasforma in realtà rivela essere non troppo male (l'ho fatto con la Wolfram Mathematica online Integrator utilizzando x per l
e utilizzando solo l'equazione per y <= 0,5). Che però stava usando un integrale indefinito e si sono davvero integrazione lungo x da 0 a l
. Se si imposta l'equazione risultante uguale a una variabile (z per esempio), l'obiettivo è ora quello di risolvere per l
in funzione di z. z: ecco un numero casuale compreso tra 0 e 1. Si può provare a utilizzare un risolutore simbolico per questa parte se si desidera (vorrei). Allora non avete solo raggiunto il tuo obiettivo di essere in grado di scegliere l
s casuali da questa distribuzione, si è anche raggiunto il nirvana.
Un po 'di lavoro fatto
ti aiuto un po 'di più. Ho provato a fare quanto detto in merito for y <= 0,5, ma il sistema algebra simbolica stavo usando non era in grado di fare l'inversione (qualche altro sistema potrebbe potere). Tuttavia, poi decisi di provare a utilizzare l'equazione per .5 f_s(l)
I get
y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))
L'integrazione di questo x sopra da 0 a l
ho ottenuto (utilizzando Mathematica di linea Integrator):
(l / n)^(y / (1 - y))
Non ottiene molto più bello di quello con questo genere di cose. Se ho impostato questo pari a z e risolvere per l
ottengo:
l = n * z^(1 / y - 1) for .5 < y <= 1
Un rapido controllo è per y = 1. In questo caso, si ottiene l = n
non importa ciò che z è. Fin qui tutto bene. Ora, basta generare z (un numero casuale compreso tra 0 e 1) e si ottiene un l
che viene distribuito come hai desiderato per 0,5 n-l
e y
-> 1-y
e get
n - l = n * z^(1 / (1 - y) - 1)
l = n * (1 - z^(1 / (1 - y) - 1)) for 0 < y <= .5
In ogni caso, che dovrebbe risolvere il problema a meno che non ho fatto un po 'da qualche errore. Buona fortuna.
Altri suggerimenti
E 'possibile fraintendere ciò che si aspetta da voi.
Dato un (adeguatamente normalizzato) PDF, e di voler lanciare una distribuzione casuale coerenti con essa, si forma la probabilità cumulativa di distribuzione (CDF), integrando il PDF, quindi invertito il CDF, e utilizzare un predicato casuale uniforme come argomento della funzione invertita.
Un po 'più in dettaglio.
f_s(l)
è il PDF, ed è stato normalizzato su [0,n)
.
Ora si integrano a formare il CDF
g_s(l') = \int_0^{l'} dl f_s(l)
Si noti che questo è un integrale definito a un endpoint specificato che ho chiamato l'
. Il CDF è pertanto una funzione di l'
. Supponendo che abbiamo la normalizzazione destra, g_s(N) = 1.0
. Se questo non è così applichiamo un semplice coefficiente per risolvere il problema.
Avanti invertito la CDF e chiamare il G^{-1}(x)
risultato. Per questo probabilmente si vorrà scegliere un particolare valore di gamma.
Poi gettare numero casuale uniforme [0,n)
, e usare quelli come argomento, x
, a G^{-1}
. Il risultato dovrebbe essere tra [0,1)
, e dovrebbe essere distribuiti secondo f_s
.
Come Justin ha detto, è possibile utilizzare un sistema di computer algebra per la matematica.
Dato che per ogni valore l, y, n come descritto, i termini che chiamano p1 e p2 sono entrambi in [0,1) e exp è in [1, ..) rendendo pow (p2, exp) anche in [0,1) quindi non vedo come si sarebbe mai ottenere un'uscita con la gamma [0, n)