Hilfe bei der Umwandlung der Mathematikfunktion in Code: Lineare Kalman Partikelschwarmoptimierung
-
27-10-2019 - |
Frage
Ich versuche, die in diesem Artikel präsentierte Mathematik umzuwandeln:
http://www.bouncingchairs.net/pskalman-lategecco.pdf
Rund um Seite 3 in den Arbeitscode weiterleiten. Der Algorithmus selbst wird um Seite 6 gegeben, aber ich spreche weder griechisches noch Mathematik. Also stecke ich vorerst fest.
Wenn ich den Code verstehe, sollte er so runtergehen:
vt = particle velocity, 1d array
vbest = best particle velocity 1d array
v_prime = 1d storage array
v_hat = 1d storage array
alpha = 0.45
sigma = 0.60
denom = float
denom_best = float
Vorbereitung:
for(int i = 0; i < vt.length; i++)
{
denom += vt[i] ^ 2
denom_best += vbest[i] ^ 2
}
denom = denom ^ (1/2)
denom_best = denom_best ^ (1/2)
Gleichung 7:
for(int i = 0; i < vt.length; i++)
{
v_prime[i] = alpha * (vt[i]/denom) + (1 - alpha) * (vbest[i]/denom_best)
}
Gleichung 8:
for(int i = 0; i < vt.length; i++)
{
v_hat[i] = Rand_Gauss(v_prime[i], sigma) //gaussian random number with
//v_prime[i] average, and sigma StDev
}
Gleichung 9:
for(int i = 0; i < vt.length; i++)
{
vt[i] = (alpha * denom + (1 - alpha) * denom_best) * v_hat[i]
}
Ist das überhaupt nahe an das, was die Mathematik sagt?
Danke im Voraus, -jw
Lösung
Ich denke, Sie könnten die Anrufe an "Norm (...)" vermissen. Die Normalisierung eines Vektors teilt nur jede Komponente des Vektors durch die Länge. In Gleichung 9 berechnen sie die gewichtete Summe der Längen von VT und VBEST und multiplizieren Sie diese durchschnittliche Länge mit Norm(VBAR). Sie multiplizieren es nur mit VBAR direkt.
Die Absicht hinter dieser Gleichung scheint darin zu sein, einen neuen Vektor v_ {t+1} zu erstellen, dessen Länge die durchschnittliche Länge von VT und VBEST ist. VHAT könnte jedoch überhaupt eine Länge sein, sodass die Multiplikation in Gleichung 9 die meiste Zeit nicht die richtige Antwort gibt, es sei denn, Sie zwingen die Länge des VHAT -Vektors zu genau einem. Das macht die Vektornorm.
Die Norm ist nur die Komponenten des Vektors geteilt durch die Länge. Ersetzen Sie also Ihren Code für Gleichung 9 durch so etwas:
vtlen=0
for(int i=0; i<vt.length; i++)
{
vtlen+=vt[i]*vt[i];
}
vtlen=sqrt(vtlen);
for(int i=0; i<vt.length; i++)
{
vt[i] = (alpha * denom + (1 - alpha) * denom_best) * (v_hat[i] / vtlen);
}
Sie haben auch den Normvorgang in Gleichung 7 ignoriert. Ich habe das Papier nicht gelesen, aber es ist hier möglicherweise nicht unbedingt erforderlich, da die Gewichte zu einem und die Vektoren bereits normalisiert sind. Ich müsste etwas mehr Zeit verbringen, um mich auf die eine oder andere Weise zu überzeugen, aber es würde sicherlich nicht schaden, diesen berechneten V 'Vector zu normalisieren.