帮助将数学函数转换为代码:线性卡尔曼粒子群优化

Help Converting Math function into Code : Linear Kalman Particle Swarm Optimization

本文关键字:线性 粒子 优化 代码 函数 转换 帮助      更新时间:2023-10-16

我正在尝试转换这篇论文中的数学:

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

在第3页左右转到工作代码中。给出了算法本身大概在第六页,但我不会说希腊语或数学;所以我暂时被困住了。

如果我理解了这段代码,它应该是这样运行的:

    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

我想你可能错过了对"norm(…)"的调用。归一化向量就是将向量的每个分量除以长度。在等式9中,他们计算vt和vbest的长度的加权和,并将平均长度乘以范数(vbar)。你只是把它直接乘以vbar

这个方程背后的意图似乎是创建一个新的向量v_{t+1},其长度是vt和vbest的平均长度。然而,vhat可以是任意长度,所以方程9中的乘法大多数情况下不会给你正确的答案,除非你强迫vhat向量的长度恰好是1。这就是向量范数的作用

范数就是向量的分量除以长度。因此,将等式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中的范数操作。我没有读过这篇论文,但这里可能没有必要,因为权重和为1,而且向量已经归一化了。我必须花更多的时间来说服自己,但它肯定不会伤害继续并标准化计算出的v'向量。