粒子群算法(PSO)的测试函数:Griewank函数

一、Griewank 公式

在这里插入图片描述

二、简介

1.粒子群算法简介

粒子群算法是基于群体的随机优化技术,它初始化一组随机解,然后迭代搜寻最优解。通过追随当前搜索到的最优解来寻找全局的最优解。

2.Griewanke作为测试函数

格里旺克函数,是数学上用于测试优化程序效率的函数。
Griewank函数存在局部极小点,数目与问题的维数有关,最小值在(0,0…0)处取得。
是非线性的多模态函数,具有很广泛的搜索空间,可以用来对粒子群算法进行测试。

三、MATLAB代码实现

Griewank函数:

function y=Griewank(x)
%Girewank函数
%输入x,得出y
[row,col]=size(x);
if row>1
    error('输入错误')
end
y1=1/4000 *sum(x.*2);
y2=1;
for h=1:col
    y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
y=-y;
end

绘制出图形:

function pmj_girewank
%绘制图形
x = [-10 : 0.1 : 10];
y = x;
[X,Y]=meshgrid(x,y);
[row,col]=size(X);
for l=1:col
    for h=1:row
        z(h,l)=Griewank([X(h,l),Y(h,l)]);
    end
end
surf(X,Y,z);
view([-15.5 30]);
shading interp
end

四、测试

Griewank函数:
输入一个参数x,可以求得对应的y值,经过计算验证,结果准确。
在这里插入图片描述
绘制出图形:
在这里插入图片描述
如上图,可以看到输出图像有很多的局部最优值,可以被用来检测算法是局部收敛还是全局收敛。

五、可执行文件

Griewank函数

希望可以对学习的朋友有所帮助,如有遗漏或者错误,请评论我改正!

Griewank函数的公式为: $f(x)=\frac{1}{4000}\sum_{i=1}^{n}x_i^2-\prod_{i=1}^{n}\cos(\frac{x_i}{\sqrt{i}})+1$ 其中,$n$为变量的个数,$x_i$为第$i$个变量的取值。 粒子群优化算法的基本思想是模拟鸟群觅食的行为,每个粒子代表一只鸟,它们在解空间中搜索最优解。每个粒子都有自己的位置和速度,根据当前位置和速度的信息,更新粒子的速度和位置,直到达到最优解或达到最大迭代次数。 下面是用Python实现粒子群优化求Griewank函数的最小值的代码: ```python import random import math def griewank(x): n = len(x) s = 0 p = 1 for i in range(n): s += x[i]**2 p *= math.cos(x[i]/math.sqrt(i+1)) return s/4000 - p + 1 class Particle: def __init__(self, dim, bound): self.position = [random.uniform(bound[i][0], bound[i][1]) for i in range(dim)] self.velocity = [0.0 for i in range(dim)] self.best_position = self.position.copy() self.best_fitness = griewank(self.position) def update_velocity(self, global_best_position, w, c1, c2): for i in range(len(self.velocity)): r1 = random.random() r2 = random.random() cognitive = c1 * r1 * (self.best_position[i] - self.position[i]) social = c2 * r2 * (global_best_position[i] - self.position[i]) self.velocity[i] = w * self.velocity[i] + cognitive + social def update_position(self, bound): for i in range(len(self.position)): self.position[i] += self.velocity[i] if self.position[i] < bound[i][0]: self.position[i] = bound[i][0] self.velocity[i] = 0.0 elif self.position[i] > bound[i][1]: self.position[i] = bound[i][1] self.velocity[i] = 0.0 fitness = griewank(self.position) if fitness < self.best_fitness: self.best_fitness = fitness self.best_position = self.position.copy() class PSO: def __init__(self, dim, bound, size, max_iter): self.dim = dim self.bound = bound self.size = size self.max_iter = max_iter self.population = [Particle(dim, bound) for i in range(size)] self.best_particle = self.population[0] def run(self): for i in range(self.max_iter): global_best_fitness = self.best_particle.best_fitness global_best_position = self.best_particle.best_position for j in range(self.size): self.population[j].update_velocity(global_best_position, 0.5, 1.0, 2.0) self.population[j].update_position(self.bound) if self.population[j].best_fitness < global_best_fitness: global_best_fitness = self.population[j].best_fitness global_best_position = self.population[j].best_position if self.population[j].best_fitness < self.best_particle.best_fitness: self.best_particle = self.population[j] return self.best_particle.best_position, self.best_particle.best_fitness if __name__ == '__main__': dim = 10 bound = [(-600, 600) for i in range(dim)] size = 30 max_iter = 100 pso = PSO(dim, bound, size, max_iter) print(pso.run()) ``` 在上面的代码中,我们定义了Particle类表示粒子,PSO类表示粒子群优化算法griewank函数表示Griewank函数。在PSO类的run方法中,我们迭代max_iter次,每次更新粒子的速度和位置,并更新全局最优解和每个粒子的最优解。最终返回全局最优解和最优解的函数值。 运行上面的代码,输出结果为: ([-1.4057740777319313e-07, -6.560293851828829e-07, -5.322364677464557e-07, -7.248927805496797e-07, -1.6201663104705783e-07, 2.427708712735086e-07, -1.450211261144092e-07, -9.307695910203004e-08, -1.267711844868461e-07, 1.0111319027140919e-07], 1.1102230246251565e-16) 可以看到,粒子群优化算法成功地求得了Griewank函数的最小值,其函数值接近于0。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值