1. 代码的主要作用
这段代码的主要作用是使用**粒子群优化算法(PSO)**来寻找一个三维目标函数的最小值。代码通过定义目标函数,使用PSO
类对其进行优化,并最终输出最优解和最优值。
数学公式
在粒子群优化(PSO)算法中,粒子的速度和位置更新公式为:
-
速度更新公式,对于粒子i:
v i ( t + 1 ) = w ⋅ v i ( t ) + c 1 ⋅ r 1 ⋅ ( p i − x i ( t ) ) + c 2 ⋅ r 2 ⋅ ( g − x i ( t ) ) v_i^{(t+1)} = w \cdot v_i^{(t)} + c_1 \cdot r_1 \cdot (p_i - x_i^{(t)}) + c_2 \cdot r_2 \cdot (g - x_i^{(t)}) vi(t+1)=w⋅vi(t)+c1⋅r1⋅(pi−xi(t))+c2⋅r2⋅(g−xi(t))
其中, v i ( t + 1 ) v_i^{(t+1)} vi(t+1) 是粒子 i i i 在下一代的速度, w w w 是惯性权重, c 1 c_1 c1 和 c 2 c_2 c2 是学习因子, r 1 r_1 r1 和 r 2 r_2 r2 是随机数, p i p_i pi 是粒子 i i i 的个体最优位置, g g g 是全局最优位置, x i ( t ) x_i^{(t)} xi(t) 是粒子 i i i 的当前代位置。 -
位置更新公式:
x i ( t + 1 ) = x i ( t ) + v i ( t + 1 ) x_i^{(t+1)} = x_i^{(t)} + v_i^{(t+1)} xi(t+1)=xi(t)+vi(t+1)
其中, x i ( t + 1 ) x_i^{(t+1)} xi(t+1) 是粒子 i i i 在下一代的位置。
2. 按模块解释
代码分为以下几个模块:
- 目标函数定义模块:定义目标函数
demo_func
。 - PSO算法参数初始化和运行模块:初始化PSO算法的参数并运行优化。
- 结果输出和可视化模块:输出最优结果并绘制适应度值的变化曲线。
3. 每行代码解释
模块1:目标函数定义模块
def demo_func(x):
x1, x2, x3 = x
return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
def demo_func(x):
:定义目标函数demo_func
,它接收一个三维向量x
作为输入。x1, x2, x3 = x
:将输入向量x
解包为三个独立的变量x1
、x2
和x3
。return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
:计算目标函数值,该函数形式为 f ( x 1 , x 2 , x 3 ) = x 1 2 + ( x 2 − 0.05 ) 2 + x 3 2 f(x_1, x_2, x_3) = x_1^2 + (x_2 - 0.05)^2 + x_3^2 f(x1,x2,x3)=x12+(x2−0.05)2+x32,这是一个简单的二次函数,用于模拟一个优化问题。
模块2:PSO算法参数初始化和运行模块
pso = PSO(func=demo_func, dim=3, pop=40, max_iter=150, lb=[0, -1, 0.5], ub=[1, 1, 1], w=0.8, c1=0.5, c2=0.5)
PSO
:调用sko.PSO
库中的PSO类进行粒子群优化算法的初始化。func=demo_func
:将定义的目标函数demo_func
传递给PSO算法。dim=3
:设置问题的维度为3,即优化问题在三维空间中进行。pop=40
:设置种群数量为40,表示同时有40个粒子参与搜索最优解。max_iter=150
:设置最大迭代次数为150,即算法最多迭代150次。lb=[0, -1, 0.5]
和ub=[1, 1, 1]
:设置粒子在每个维度的上下边界。lb
表示下边界,ub
表示上边界。具体来说, x 1 ∈ [ 0 , 1 ] x_1 \in [0, 1] x1∈[0,1], x 2 ∈ [ − 1 , 1 ] x_2 \in [-1, 1] x2∈[−1,1], x 3 ∈ [ 0.5 , 1 ] x_3 \in [0.5, 1] x3∈[0.5,1]。w=0.8
:设置惯性权重为0.8,用于控制粒子速度的惯性。c1=0.5
和c2=0.5
:分别设置个体学习因子和群体学习因子为0.5,控制粒子向个体历史最优位置和全局最优位置移动的趋势。
pso.run()
pso.run()
:运行PSO算法,开始迭代搜索目标函数的最优解。
模块3:结果输出和可视化模块
print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)
print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)
:输出PSO算法找到的最优解位置pso.gbest_x
和对应的最优目标函数值pso.gbest_y
。
plt.plot(pso.gbest_y_hist)
plt.plot(pso.gbest_y_hist)
:绘制目标函数值随迭代次数的变化曲线,pso.gbest_y_hist
记录了每次迭代的全局最优值。
plt.show()
plt.show()
:显示绘制的适应度值变化曲线。
结果解释
最终,代码输出了最优解best_x
和最优值best_y
,并绘制了优化过程中目标函数值的变化曲线。
best_x is [0. 0.05 0.5 ] best_y is [0.25]
参考
@若冰(马世拓)
– 侵删 –