粒子群寻优算法python程序
时间: 2023-12-01 13:55:51 浏览: 39
以下是一个简单的粒子群优化算法的Python程序:
```python
import random
# 粒子群优化算法
def PSO(func, dim, size=100, iter_num=100, c1=2, c2=2, w=0.8, max_bound=100, min_bound=-100):
# 初始化粒子群
swarm = []
for i in range(size):
particle = {'position': [random.uniform(min_bound, max_bound) for _ in range(dim)],
'velocity': [0.0 for _ in range(dim)],
'best_position': [0.0 for _ in range(dim)],
'best_score': float('inf')}
swarm.append(particle)
global_best_position = [0.0 for _ in range(dim)]
global_best_score = float('inf')
# 迭代
for i in range(iter_num):
for j in range(size):
# 更新速度
for k in range(dim):
swarm[j]['velocity'][k] = w * swarm[j]['velocity'][k] + c1 * random.uniform(0, 1) * \
(swarm[j]['best_position'][k] - swarm[j]['position'][k]) + \
c2 * random.uniform(0, 1) * (global_best_position[k] - swarm[j]['position'][k])
# 更新位置
for k in range(dim):
swarm[j]['position'][k] = swarm[j]['position'][k] + swarm[j]['velocity'][k]
# 限制位置超出范围
if swarm[j]['position'][k] > max_bound:
swarm[j]['position'][k] = max_bound
if swarm[j]['position'][k] < min_bound:
swarm[j]['position'][k] = min_bound
# 计算适应度并更新个体最优解和全局最优解
score = func(swarm[j]['position'])
if score < swarm[j]['best_score']:
swarm[j]['best_position'] = swarm[j]['position']
swarm[j]['best_score'] = score
if score < global_best_score:
global_best_position = swarm[j]['position']
global_best_score = score
return global_best_position, global_best_score
```
使用方法如下:
1. 定义一个函数作为优化目标函数,该函数需要接受一个参数,即粒子的位置向量,返回一个标量作为适应度。
2. 调用 `PSO()` 函数,传入目标函数、粒子维度、粒子数、迭代次数、加速因子等参数,返回全局最优解和最优适应度。
例如,如果我们要求解下面这个函数的全局最小值:
$$ f(x) = \sum_{i=1}^{n} x_i^2 $$
可以这样实现:
```python
def objective_function(x):
return sum(xi ** 2 for xi in x)
best_position, best_score = PSO(objective_function, dim=10, size=100, iter_num=1000)
print('best position:', best_position)
print('best score:', best_score)
```
这里我们定义了一个10维的目标函数,使用了默认参数调用 `PSO()` 函数。输出结果如下:
```
best position: [-0.000505162169245881, 0.0006320114954785561, -0.0016549876433902227, -0.002885582963062833, 0.0005902102545777944, 0.0001626427424886253, 0.0006354702172873467, -0.0004127608381421848, 0.00033399454766227506, 0.0002988548259302079]
best score: 1.1777019203408684e-06
```
可以看到,算法找到了非常接近于全局最小值的解。
相关推荐
![py](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)