赞
踩
粒子群优化算法(Particle Swarm Optimization,PSO)的灵感来源于鸟群或鱼群的觅食行为。想象一下,你在公园里看到一群鸟,它们在空中飞翔,寻找食物。每只鸟都不知道食物在哪里,但它们会根据周围其他鸟的位置和过去自己找到食物的经验来调整自己的飞行方向。如果一只鸟发现了食物,其他鸟很快也会朝着这个方向飞去。在这个过程中,整个鸟群像一个搜索系统,通过个体间的信息共享,找到最佳的觅食地点。
这个觅食的过程非常像一个优化问题:每只鸟(粒子)都在寻找食物(最优解),它们根据自己和同伴的经验(位置信息),在整个空间(搜索空间)中移动,最终找到食物的位置(最优解的位置)。
有读者可以感觉粒子群算法与麻雀算法有些相似。粒子群算法(PSO)和麻雀搜索算法(SSA)都是受自然界中群体行为启发的优化算法,它们都模仿了生物群体的社会行为来寻找最优解。然而,PSO是基于鸟群的觅食行为,而SSA则是模仿了麻雀的觅食和警戒行为,两者在模拟策略和行为细节上有所不同。
粒子群优化算法(PSO)是一种非常灵活和多用途的优化算法,它在许多领域都有广泛的应用。以下是一些主要的应用场景:
粒子群优化算法 (PSO) 的计算流程可以详细分为以下几个步骤:
1. 初始化粒子群:
– 随机生成一组粒子 (解的候选者),每个粒子代表搜索空间中的一个潜在解。
– 为每个粒子指定一个随机的位置 (即解的值) 和速度。
2. 评估粒子的适应度:
– 对每个粒子的当前位置进行评估,根据优化问题的目标函数计算其适应度(如何接近最优解)。
3. 更新速度和位置:
– 对于每个粒子,根据下面的公式更新其速度:
标准的粒子群速度更新公式如下:
其中:
– 是粒子 i 在新的迭代中的速度。
– 是惯性权重,用于控制前一速度对当前速度的影响。
– 是粒子 i 在前一迭代中的速度。
– 和 是加速常数,用于调整个体和社会学习行为的相对影响。
– 和 是两个介于 0 和 1 之间的随机数。
– 是粒子 i 到目前为止找到的最优位置。
– gbest 是整个群体到目前为止找到的最优位置。
– 是粒子 i 在前一迭代中的位置。
– 更新粒子的位置:
4. 更新个体和全局最优解:
– 对于每个粒子,如果当前位置比之前遇到的最佳位置更优,则更新其个体最优解 (pbest)。
– 同时,从所有粒子中找出具有最佳适应度的位置,更新为全局最优解 (gbest)。
5. 迭代和终止条件:
– 重复步骤2-4,直到满足终止条件(如达到最大迭代次数或解的质量达到预定阈值) 。
6. 输出结果:
– 算法结束时,全局最优解 gbest 即为找到的最优解。
注意,粒子群优化算法 (PSO) 中的速度更新公式设计得非常巧妙,它反映了算法的核心思想: 通过模拟鸟群的社会行为来指导搜索过程。公式的设计考虑了以下几个关键因素:
1. 惯性权重 w :
– 这部分表示粒子的当前速度对其未来速度的影响,即粒子的惯性。较大的惯性权重有助于粒子探索更远的区域,促进全局搜索;较小的权重有利于粒子在局部区域进行详细搜索,促进局部优化。
2. 个体经验 :
– 这部分反映了粒子自身的历史最佳位置 (个体经验) 对其速度的影响。粒子会考虑自己之前找到的最优位置(pbest),并朝这个方向调整速度。这里的随机数 rand 1 保证了搜索的随机性和多样性。
3. 社会经验 :
– 这部分考虑了群体中其他粒子的信息。每个粒子也会朝着当前群体中已知的最优位置 (gbest) 移动。这里的随机数 rand 2 同样增加了搜索的随机性和多样性。
4. 学习因子 c1 和 c2 :
– 这两个学习因子分别表示个体经验和社会经验对速度更新的影响程度。这些因子的值决定了算法是倾向于利用个体的过去经验还是群体的共同经验。
总的来说,速度更新公式通过结合个体历史信息和群体共享信息,以及通过引入随机因素来增加搜索的多样性,从而有效地指导粒子群体在解空间中的搜索行为,这既保证了全局搜索能力,又保留了局部搜索的细致性。通过调整公式中的参数,可以控制算法的探索和开发能力,使其适应不同类型的优化问题。
上述函数求解的python代码实现如下:
- import numpy as np
- import matplotlib.pyplot as plt
- # 粒子群优化算法(PSO)求解 f(x, y) = x^2 + y^2
- # 目标函数
- def objective_function(position):
- x, y = position
- return x**2 + y**2
- # 参数设置
- n_particles = 50
- n_iterations = 10
- dim = 2 # 搜索空间的维度,这里是二维空间
- w = 0.5 # 惯性权重
- c1 = 0.8 # 个体学习因子
- c2 = 0.9 # 社会学习因子
- # 初始化粒子群
- particle_position = np.random.rand(n_particles, dim) * 10 - 5 # 初始位置
- particle_velocity = np.random.rand(n_particles, dim) * 2 - 1 # 初始速度
- pbest_position = particle_position.copy() # 个体最优位置
- pbest_value = np.full(n_particles, float('inf')) # 个体最优值
- gbest_value = float('inf') # 全局最优值
- gbest_position = np.array([float('inf'), float('inf')]) # 全局最优位置
- # 迭代过程
- for i in range(n_iterations):
- for j in range(n_particles):
- # 计算每个粒子的适应度值
- fitness = objective_function(particle_position[j])
- # 更新个体最优
- if fitness < pbest_value[j]:
- pbest_value[j] = fitness
- pbest_position[j] = particle_position[j].copy()
- # 更新全局最优
- if fitness < gbest_value:
- gbest_value = fitness
- gbest_position = particle_position[j].copy()
- for j in range(n_particles):
- # 更新速度
- particle_velocity[j] = (w * particle_velocity[j] +
- c1 * np.random.rand() * (pbest_position[j] - particle_position[j]) +
- c2 * np.random.rand() * (gbest_position - particle_position[j]))
- # 更新位置
- particle_position[j] += particle_velocity[j]
- # 输出结果
- print(f"全局最优位置:{gbest_position}")
- print(f"全局最优值:{gbest_value}")
- # 重新执行粒子群优化算法,进行5次迭代
- # 重新初始化粒子位置和速度
- particle_position = initial_particle_position.copy() # 粒子位置
- particle_velocity = np.random.rand(n_particles, dim) * 2 - 1 # 初始速度
- pbest_position = particle_position.copy() # 个体最优位置
- pbest_value = np.full(n_particles, float('inf')) # 个体最优值
- gbest_value = float('inf') # 全局最优值
- gbest_position = np.array([float('inf'), float('inf')]) # 全局最优位置
- # 执行5次迭代的过程
- for _ in range(5):
- for j in range(n_particles):
- fitness = objective_function(particle_position[j][0], particle_position[j][1])
- if fitness < pbest_value[j]:
- pbest_value[j] = fitness
- pbest_position[j] = particle_position[j].copy()
- if fitness < gbest_value:
- gbest_value = fitness
- gbest_position = particle_position[j].copy()
- for j in range(n_particles):
- particle_velocity[j] = (w * particle_velocity[j] +
- c1 * np.random.rand() * (pbest_position[j] - particle_position[j]) +
- c2 * np.random.rand() * (gbest_position - particle_position[j]))
- particle_position[j] += particle_velocity[j]
- # 创建3D图形
- fig = plt.figure(figsize=(12, 6))
- # 初始状态
- ax1 = fig.add_subplot(1, 2, 1, projection='3d')
- ax1.plot_surface(x, y, z, cmap='viridis', alpha=0.6)
- ax1.scatter(initial_particle_position[:, 0], initial_particle_position[:, 1],
- objective_function(initial_particle_position[:, 0], initial_particle_position[:, 1]),
- color='r', s=10)
- ax1.set_title('初始状态')
- ax1.set_xlabel('X axis')
- ax1.set_ylabel('Y axis')
- ax1.set_zlabel('Z axis')
- # 优化后的状态(5次迭代后)
- ax2 = fig.add_subplot(1, 2, 2, projection='3d')
- ax2.plot_surface(x, y, z, cmap='viridis', alpha=0.6)
- ax2.scatter(particle_position[:, 0], particle_position[:, 1],
- objective_function(particle_position[:, 0], particle_position[:, 1]),
- color='r', s=10)
- ax2.set_title('优化后的状态(5次迭代)')
- ax2.set_xlabel('X axis')
- ax2.set_ylabel('Y axis')
- ax2.set_zlabel('Z axis')
- plt.show()
最后,我分别可视化了粒子群优化算法初始状态和优化5轮后的状态,对比表明粒子群优化算法的效果。
这两幅图形象地说明了粒子群优化算法的工作原理:从随机搜索开始,经过多次迭代,粒子逐渐聚焦于搜索空间中的优化区域。虽然只进行了5次迭代,但我们已经可以看到粒子群朝着问题的最优解方向的逐渐聚集。随着更多迭代的进行,粒子群将更加集中地趋向于全局最优解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。