求函数最小值的粒子群优化算法实验,函数是y=∑(Xi的平方)i=1,i到30,Xi大于等于-100,小于等于100,用Python回答
时间: 2024-11-13 20:22:27 浏览: 9
粒子群优化(Particle Swarm Optimization, PSO)算法是一种模拟鸟群或鱼群觅食行为的搜索算法,常用于寻找复杂函数的全局最优解。在您的情况下,我们需要找的是函数 \( y = \sum_{i=1}^{30}(x_i)^2 \) 的最小值,其中 \( x_i \) 的范围在 -100 到 100 之间。
以下是一个简单的Python实现步骤:
1. **导入必要的库**:首先,你需要`numpy`来处理数组计算,以及可能的`random`库来生成随机数。
```python
import numpy as np
```
2. **定义函数**:创建一个计算函数的函数,接受一个长度为30的一维数组作为参数。
```python
def objective_function(x):
return sum(xi**2 for xi in x)
```
3. **初始化粒子群**:设置粒子的数量、每个粒子的位置和速度。位置通常在给定范围内随机生成,速度也一样。
```python
num_particles = 50
lower_bound = -100
upper_bound = 100
particle_positions = np.random.uniform(lower_bound, upper_bound, (num_particles, 30))
particle_velocities = np.zeros_like(particle_positions)
```
4. **初始化其他参数**:比如学习因子、个人最佳位置、群体最佳位置等。
```python
c1, c2 = 2, 2 # 学习因子
w = 0.7 # 加权因子
iteration_limit = 1000 # 迭代次数
```
5. **PSO 主循环**:在指定的迭代次数内执行算法,更新粒子的位置和速度。
```python
for _ in range(iteration_limit):
r1, r2 = np.random.rand(), np.random.rand() # 随机数
personal_best = objective_function(particle_positions)
# 更新个人最佳位置
particle_positions[personal_best < objective_function(particle_positions)] = particle_positions[personal_best < objective_function(particle_positions)].copy()
# 更新群体最佳位置
global_best = min(personal_best)
if global_best < objective_function(particle_positions.mean(axis=0)):
particle_positions[:, :] = np.copy(particle_positions.mean(axis=0))
# 更新粒子的速度和位置
particle_velocities = w * particle_velocities + c1 * r1 * (particle_positions[np.argmin(global_best), :] - particle_positions) + c2 * r2 * (particle_positions[np.argmin(personal_best), :] - particle_positions)
# 确保粒子保持在边界范围内
particle_positions = np.clip(particle_positions, lower_bound, upper_bound)
```
6. **输出结果**:算法结束后,`particle_positions[np.argmin(global_best), :]`就是找到的最低点。
```python
best_position = particle_positions[np.argmin(global_best)]
best_fitness = best_position.min()
print(f"Best position: {best_position}, Best fitness: {best_fitness}")
```
阅读全文