数学建模学习-粒子群优化(Particle Swarm Optimization)教程(7)

优化Rosenbrock函数(也称为香蕉函数)

写在最前:注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码。很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。

系列教程计划持续更新,同时相关代码获取可以关注博主评论或私信。

目录

  1. 算法简介
  2. 算法特点
  3. 环境准备
  4. 代码实现
  5. 运行示例
  6. 结果分析

算法简介

粒子群优化(PSO)算法是一种群体智能优化算法,由Kennedy和Eberhart于1995年提出。该算法模拟了鸟群觅食的行为,通过群体中的个体之间相互协作来实现全局最优解的搜索。每个粒子代表解空间中的一个候选解,通过不断更新自己的位置和速度来搜索最优解。

算法特点

  1. 简单易实现:PSO算法的概念简单,实现起来相对容易。
  2. 参数较少:主要参数包括粒子数量、惯性权重和学习因子等。
  3. 收敛速度快:在许多优化问题中表现出较快的收敛速度。
  4. 适用性广:可以用于解决连续优化问题、离散优化问题等多种类型的问题。
  5. 并行性好:算法具有良好的并行性,易于并行实现。

环境准备

本教程需要以下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}")

结果分析

运行示例代码后,我们可以得到以下结果:

  1. 收敛曲线
    请添加图片描述

  2. 优化结果可视化
    请添加图片描述
    结果为:
    最优位置: [0.98195364 0.96109081]
    最优值: 0.0013129764142760427
    接近(1,1)

从结果可以看出:

  1. PSO算法成功找到了接近全局最优解的位置
  2. 收敛曲线显示算法在前期快速收敛,后期逐渐趋于稳定
  3. 等高线图显示了算法找到的最优解位置(红星标记)

总结与建议

  1. PSO算法是一个强大而灵活的优化工具,适用于多种优化问题。
  2. 在实际应用中,需要根据具体问题调整参数(粒子数量、迭代次数、学习因子等)。
  3. 建议在使用时进行多次独立运行,以避免陷入局部最优。
  4. 对于高维问题,可能需要增加粒子数量和迭代次数。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐