2744557306 发表于 2025-1-1 17:37

智能优化之粒子群模型Python代码

实现了粒子群优化(Particle Swarm Optimization, PSO)算法,主要用来优化一些特定的函数。具体而言,这里优化的是一个名为“香蕉函数”(通常指的是罗森布鲁克函数,其数学表达式为 \(f(x) = \sum_{i=1}^{n-1} \left(100(x_{i+1} - x_i^2)^2 + (1 - x_i)^2\right)\))。下面将对代码进行详细解读。

### 1. 适应度函数 `fit_fun(x)`

```python
def fit_fun(x):
    return sum(100.0 * (x - x[:-1] ** 2.0) ** 2.0 + (1 - x[:-1]) ** 2.0)
```
- 这是一个用来计算适应度的函数,用于评估给定输入 `x` 的“好坏”程度。对于粒子群优化,通常这个函数的值应该尽可能小。
- 输入 `x` 是一个一维数组,函数计算了罗森布鲁克函数的值。

### 2. 粒子类 `Particle`

```python
class Particle:
    def __init__(self, x_max, max_vel, dim):
        self.__pos = np.random.uniform(-x_max, x_max, (1, dim))
        self.__vel = np.random.uniform(-max_vel, max_vel, (1, dim))
        self.__bestPos = np.zeros((1, dim))
        self.__fitnessValue = fit_fun(self.__pos)
```
- 粒子类用于表示粒子的位置、速度和最优位置等信息。
- 在初始化方法中:
  - `self.__pos`:为粒子初始化一个随机位置。
  - `self.__vel`:为粒子初始化一个随机的速度。
  - `self.__bestPos`:初始化粒子的个体最优位置为全零。
  - `self.__fitnessValue`:计算当前粒子位置的适应度值。

#### 粒子方法

- **访问和修改粒子属性**:包括位置、速度和适应度值的 getter 和 setter 函数(如 `get_pos()`, `set_pos(value)` 等)。

### 3. 粒子群优化类 `PSO`

```python
class PSO:
    def __init__(self, dim, size, iter_num, x_max, max_vel, tol, best_fitness_value=float('Inf'), C1=2, C2=2, W=1):
        self.C1 = C1
        self.C2 = C2
        self.W = W
        self.dim = dim
        self.size = size
        self.iter_num = iter_num
        self.x_max = x_max
        self.max_vel = max_vel
        self.tol = tol
        self.best_fitness_value = best_fitness_value
        self.best_position = np.zeros((1, dim))
        self.fitness_val_list = []

        # 粒子群初始化
        self.Particle_list =
```
- PSO类负责实现粒子群算法。
- 在初始化方法中,定义了以下参数:
  - `dim`:粒子的维度。
  - `size`:粒子的数量。
  - `iter_num`:最大迭代次数。
  - `x_max`:粒子位置的最大值。
  - `max_vel`:粒子的最大速度。
  - `tol`:收敛条件。
  - `C1`, `C2`, `W`:权重因子,控制粒子的个体和社会学习。

#### 方法

1. **更新速度 `update_vel(self, part)`**
   - 根据当前粒子的位置、最优位置和全局最优位置更新粒子的速度:
   ```python
   vel_value = self.W * part.get_vel() + self.C1 * np.random.rand() * (part.get_best_pos() - part.get_pos()) + self.C2 * np.random.rand() * (self.get_bestPosition() - part.get_pos())
   ```

2. **更新位置 `update_pos(self, part)`**
   - 更新粒子的位置并计算新的适应度值。如果新的适应度值比当前粒子的最优适应度值更好,就更新最优适应度值和最优位置:
   ```python
   pos_value = part.get_pos() + part.get_vel()
   ```

3. **主迭代方法 `update_ndim(self)`**
   - 进行多个迭代,更新每个粒子的速度和位置,同时记录每次迭代的最佳适应度值。
   - 判断是否满足收敛条件,如果发现适应度小于设定的容差 `tol`,则提前终止迭代。

### 4. 主程序

```python
if __name__ == '__main__':
    pso = PSO(4, 5, 10000, 30, 60, 1e-4, C1=2, C2=2, W=1)
    fit_var_list, best_pos = pso.update_ndim()
    print("最优位置:" + str(best_pos))
    print("最优解:" + str(fit_var_list[-1]))
    plt.plot(range(len(fit_var_list)), fit_var_list, alpha=0.5)
```
- 创建一个 PSO 对象并设置其参数,例如维度、粒子数量、迭代次数、位置范围等。
- 调用 `update_ndim()` 方法运行 PSO 算法,返回每次迭代的适应度值列表和最优位置。
- 打印出最优位置并绘制适应度值随迭代的变化图。

### 总结

整体代码实现了一个简单的粒子群优化(PSO)算法,用户可以通过调整参数(如粒子数量、速度限制等)来优化特定函数。这个实现涵盖了算法的各个方面,包括粒子的位置和速度的初始化、更新机制、适应度函数的计算等。你可以根据需要更改适应度函数,以便于对其他优化问题进行求解。



页: [1]
查看完整版本: 智能优化之粒子群模型Python代码