蚁群算法求解函数极值python实现

1. 代码的主要作用

这段代码的主要作用是使用**粒子群优化算法(PSO)**来寻找一个三维目标函数的最小值。代码通过定义目标函数,使用PSO类对其进行优化,并最终输出最优解和最优值。

数学公式

在粒子群优化(PSO)算法中,粒子的速度和位置更新公式为:

  1. 速度更新公式,对于粒子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)=wvi(t)+c1r1(pixi(t))+c2r2(gxi(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 的当前代位置。

  2. 位置更新公式
    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. 按模块解释

代码分为以下几个模块:

  1. 目标函数定义模块:定义目标函数demo_func
  2. PSO算法参数初始化和运行模块:初始化PSO算法的参数并运行优化。
  3. 结果输出和可视化模块:输出最优结果并绘制适应度值的变化曲线。

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解包为三个独立的变量x1x2x3
  • 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+(x20.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.5c2=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]

在这里插入图片描述

参考

@若冰(马世拓)
– 侵删 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值