数学建模学习-粒子群优化(Particle Swarm Optimization)教程(7) 优化Rosenbrock函数(香蕉函数)
·
数学建模学习-粒子群优化(Particle Swarm Optimization)教程(7)
优化Rosenbrock函数(也称为香蕉函数)
写在最前:注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码。很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。
系列教程计划持续更新,同时相关代码获取可以关注博主评论或私信。
目录
算法简介
粒子群优化(PSO)算法是一种群体智能优化算法,由Kennedy和Eberhart于1995年提出。该算法模拟了鸟群觅食的行为,通过群体中的个体之间相互协作来实现全局最优解的搜索。每个粒子代表解空间中的一个候选解,通过不断更新自己的位置和速度来搜索最优解。
算法特点
- 简单易实现:PSO算法的概念简单,实现起来相对容易。
- 参数较少:主要参数包括粒子数量、惯性权重和学习因子等。
- 收敛速度快:在许多优化问题中表现出较快的收敛速度。
- 适用性广:可以用于解决连续优化问题、离散优化问题等多种类型的问题。
- 并行性好:算法具有良好的并行性,易于并行实现。
环境准备
本教程需要以下Python库:
numpy==1.21.0
matplotlib==3.4.2
可以通过以下命令安装:
pip install -r requirements.txt
代码实现
PSO算法核心实现
class PSO:
def __init__(self, func, bounds, num_particles=30, max_iter=100, w=0.8, c1=2, c2=2):
"""
初始化PSO算法
:param func: 目标函数
:param bounds: 搜索空间边界
:param num_particles: 粒子数量
:param max_iter: 最大迭代次数
:param w: 惯性权重
:param c1: 个体学习因子
:param c2: 社会学习因子
"""
self.func = func
self.bounds = bounds
self.num_particles = num_particles
self.max_iter = max_iter
self.w = w
self.c1 = c1
self.c2 = c2
# 初始化粒子位置和速度
self.dim = len(bounds)
self.particles = np.random.uniform(
low=[b[0] for b in bounds],
high=[b[1] for b in bounds],
size=(num_particles, self.dim)
)
self.velocities = np.zeros((num_particles, self.dim))
# 初始化个体最优和全局最优
self.pbest = self.particles.copy()
self.pbest_fitness = np.array([func(p) for p in self.particles])
self.gbest = self.pbest[np.argmin(self.pbest_fitness)]
self.gbest_fitness = np.min(self.pbest_fitness)
# 记录收敛历史
self.history = [self.gbest_fitness]
优化过程实现
def optimize(self):
"""执行PSO优化过程"""
for _ in range(self.max_iter):
# 更新速度
r1, r2 = np.random.random(2)
self.velocities = (self.w * self.velocities +
self.c1 * r1 * (self.pbest - self.particles) +
self.c2 * r2 * (self.gbest - self.particles))
# 更新位置
self.particles += self.velocities
# 边界处理
for i, bounds in enumerate(self.bounds):
self.particles[:, i] = np.clip(self.particles[:, i], bounds[0], bounds[1])
# 更新适应度
fitness = np.array([self.func(p) for p in self.particles])
# 更新个体最优
improve_idx = fitness < self.pbest_fitness
self.pbest[improve_idx] = self.particles[improve_idx]
self.pbest_fitness[improve_idx] = fitness[improve_idx]
# 更新全局最优
min_idx = np.argmin(fitness)
if fitness[min_idx] < self.gbest_fitness:
self.gbest = self.particles[min_idx].copy()
self.gbest_fitness = fitness[min_idx]
self.history.append(self.gbest_fitness)
return self.gbest, self.gbest_fitness, self.history
运行示例
本教程以优化Rosenbrock函数(也称为香蕉函数)为例。Rosenbrock函数是一个常用的优化测试函数,其全局最优点为(1,1)。
def rosenbrock(x):
"""Rosenbrock函数,也称为香蕉函数,全局最优点为(1,1)"""
return (1 - x[0])**2 + 100 * (x[1] - x[0]**2)**2
# 定义搜索空间
bounds = [(-2, 2), (-2, 2)]
# 创建PSO优化器并执行优化
pso = PSO(rosenbrock, bounds)
best_position, best_fitness, history = pso.optimize()
print(f"最优位置: {best_position}")
print(f"最优值: {best_fitness}")
结果分析
运行示例代码后,我们可以得到以下结果:
-
收敛曲线:

-
优化结果可视化:

结果为:
最优位置: [0.98195364 0.96109081]
最优值: 0.0013129764142760427
接近(1,1)
从结果可以看出:
- PSO算法成功找到了接近全局最优解的位置
- 收敛曲线显示算法在前期快速收敛,后期逐渐趋于稳定
- 等高线图显示了算法找到的最优解位置(红星标记)
总结与建议
- PSO算法是一个强大而灵活的优化工具,适用于多种优化问题。
- 在实际应用中,需要根据具体问题调整参数(粒子数量、迭代次数、学习因子等)。
- 建议在使用时进行多次独立运行,以避免陷入局部最优。
- 对于高维问题,可能需要增加粒子数量和迭代次数。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)