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".

//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);  
}  

E qui ci sono alcuni risultati (5 decimali troncate):

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 

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:)

È stato utile?

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 ls 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 l a x in 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 l -> 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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top