Помощь в преобразовании математической функции в код: линейная оптимизация роя частиц Кальмана - PullRequest
0 голосов
/ 01 мая 2011

Я пытаюсь преобразовать математику, представленную на этом документе:

http://www.bouncingchairs.net/pskalman-lategecco.pdf

Вокруг страницы 3 вперед в рабочий код. Сам алгоритм приведен на странице 6, но я не говорю по-гречески или по математике; так что пока я застрял.

Если я понимаю код, он должен работать так:

    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

Подготовка:

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)

Уравнение 7:

for(int i = 0; i < vt.length; i++)
{
v_prime[i] = alpha * (vt[i]/denom) + (1 - alpha) * (vbest[i]/denom_best)
}

Уравнение 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
}

Уравнение 9:

for(int i = 0; i < vt.length; i++)
{
vt[i] = (alpha * denom + (1 - alpha) * denom_best) * v_hat[i]
}

Это даже близко к тому, что говорит математика?

Заранее спасибо, -JW

1 Ответ

0 голосов
/ 01 мая 2011

Я думаю, что вы можете пропустить призывы к "norm (...)". Нормализация вектора - это просто деление каждого компонента вектора на длину. В уравнении 9 они вычисляют взвешенную сумму длин vt и vbest и умножают эту среднюю длину на norm (vbar). Вы просто умножаете это на vbar напрямую.

Кажется, цель этого уравнения - создать новый вектор v_ {t + 1}, длина которого равна средней длине vt и vbest. Однако vhat может быть любой длины вообще, поэтому умножение в уравнении 9 большую часть времени не даст вам правильного ответа, если вы не укажете, что длина вектора vhat равна точно одной. Вот что делает векторная норма.

Норма - это просто составляющие вектора, деленные на длину. Поэтому замените код для уравнения 9 на что-то вроде этого:

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

Вы также проигнорировали операцию нормы в уравнении 7. Я не читал статью, но здесь это может быть не обязательно, поскольку веса суммируются с единицей, а векторы уже нормализованы. Мне бы пришлось потратить немного больше времени, чтобы убедить себя в том или ином случае, но, конечно, не помешало бы пойти дальше и нормализовать этот вычисленный вектор v '.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...