C语言-粒子群算法(PSO)

粒子群算法是一种全局随机搜索算法,收敛速度比遗传算法快但容易陷入局部最优,但是可以通过调整权重ω自适应来提升性能。 
粒子群最主要的本质是通过综合粒子历史最佳位置和全局最佳位置的影响加上惯性因子ω来生成下一代(下一个位置),计算的公式主要是: 
vi = ω×vi + c1×r1×(pBesti-xi) +c2×r2×(gBesti-xi) 
xi = xi +vi 
具体代码如下(其他都与GA差不多)

void NextLocation(void){
    for(int i = 0;ifor(int j = 0;j0,1)*(population[i].his_best[j]-population[i].location[j])+
                C2*Randvar(0,1)*(global_best[j]-population[i].location[j]);
            population[i].location[j] = population[i].location[j]+population[i].velocity[j];
            /**adjust the value if the location is illegal*/
            if(population[i].location[j] > population[i].upbound[j]) population[i].location[j] =population[i].upbound[j];
            else if(population[i].location[j] < population[i].lowbound[j]) population[i].location[j] =population[i].lowbound[j];
        }
    }
}

经过测试,PSO果真比GA快,然而解的精度无法很好体现因为测试函数多是凸函数。

四种自适应惯性的方法: 
①惯性权重线性递减法(LDW) 
ω = ωmax - (ωmax - ωmin)×T/Tmax 
ωmax为最大值,一般取0.9 
ωmin为最小值,一般取0.4 
T为当前代数 
Tmax为最大代数

②随机惯量权重法 
单峰函数,ω在[0.3,0.5] 
多峰函数,ω在[0.5,0.7]

③惯量权重凹函数递减法 
ω = -(ωmax - ωin)×t^2 + ωmax

④惯量权重凸函数递减法 
ω = (ωmax - ωmin)(t-1)^2 + ωmin

你可能感兴趣的:(算法)