• Python优化算法03——粒子群算法


    参考文档链接:scikit-opt


    本章继续Python的优化算法系列。

    优化算法,尤其是启发式的仿生智能算法在最近很火,它适用于解决管理学,运筹学,统计学里面的一些优化问题。比如线性规划,整数规划,动态规划,非线性约束规划,甚至是超参数搜索等等方向的问题。

    但是一般的优化算法还是matlab里面用的多,Python相关代码较少。博主在参考了很多文章的代码和模块之后,决定学习 scikit-opt   这个模块。这个优化算法模块对新手很友好,代码简洁,上手简单。而且代码和官方文档是中国人写的,还有很多案例,学起来就没什么压力...

    缺点是包装的算法种类目前还不算多,只有七种:(差分进化算法、遗传算法、粒子群算法、模拟退火算法、蚁群算法、鱼群算法、免疫优化算法)      /(其实已经够用了)

    本次带来的是 数学建模里面经常使用的粒子群算法的使用演示。数学原理就不多说了


    首先安装模块,在cmd里面或者anaconda prompt里面输入:

    pip install scikit-opt

    这个包很小,很快就能装好。

    粒子群算法

    首先定义我们要求解的问题

    1. def demo_func(x):
    2. x1, x2, x3 = x
    3. return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2

     调用PSO求解

    1. from sko.PSO import PSO
    2. pso = PSO(func=demo_func, n_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)
    3. pso.run()
    4. print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)

     画出y随着迭代次数的变化图

    1. import matplotlib.pyplot as plt
    2. plt.figure(figsize=(6,3))
    3. plt.plot(pso.gbest_y_hist)
    4. plt.show()

     

     


    带非线性约束的粒子群算法

    假如你的非线性约束是个圆内的面积 (x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2<=0
    这样写

    1. def demo_func(x):
    2. x1, x2,x3 = x
    3. return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
    1. constraint_ueq = (lambda x: (x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2 ,)
    2. pso = PSO(func=demo_func, n_dim=3, pop=40, max_iter=5000, lb=[-2, -2,-2], ub=[2, 2,2]
    3. , constraint_ueq=constraint_ueq)
    4. pso.run()
    5. print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)

     (粒子群算法没有等式约束,都是不等式)


    参数详解 

    输入参数

    输出参数

     


    粒子群算法画动图 

    求解问题

    1. import numpy as np
    2. from sko.PSO import PSO
    3. def demo_func(x):
    4. x1, x2 = x
    5. return -20 * np.exp(-0.2 * np.sqrt(0.5 * (x1 ** 2 + x2 ** 2))) - np.exp(
    6. 0.5 * (np.cos(2 * np.pi * x1) + np.cos(2 * np.pi * x2))) + 20 + np.e
    7. constraint_ueq = (
    8. lambda x: (x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2
    9. ,
    10. )
    11. max_iter = 50
    12. pso = PSO(func=demo_func, n_dim=2, pop=40, max_iter=max_iter, lb=[-2, -2], ub=[2, 2]
    13. , constraint_ueq=constraint_ueq)
    14. pso.record_mode = True
    15. pso.run()
    16. print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)

    画图

    1. import matplotlib.pyplot as plt
    2. from matplotlib.animation import FuncAnimation
    3. record_value = pso.record_value
    4. X_list, V_list = record_value['X'], record_value['V']
    5. fig, ax = plt.subplots(1, 1)
    6. ax.set_title('title', loc='center')
    7. line = ax.plot([], [], 'b.')
    8. X_grid, Y_grid = np.meshgrid(np.linspace(-2.0, 2.0, 40), np.linspace(-2.0, 2.0, 40))
    9. Z_grid = demo_func((X_grid, Y_grid))
    10. ax.contour(X_grid, Y_grid, Z_grid, 30)
    11. ax.set_xlim(-2, 2)
    12. ax.set_ylim(-2, 2)
    13. t = np.linspace(0, 2 * np.pi, 40)
    14. ax.plot(0.5 * np.cos(t) + 1, 0.5 * np.sin(t), color='r')
    15. plt.ion()
    16. p = plt.show()
    17. def update_scatter(frame):
    18. i, j = frame // 10, frame % 10
    19. ax.set_title('iter = ' + str(i))
    20. X_tmp = X_list[i] + V_list[i] * j / 10.0
    21. plt.setp(line, 'xdata', X_tmp[:, 0], 'ydata', X_tmp[:, 1])
    22. return line
    23. ani = FuncAnimation(fig, update_scatter, blit=True, interval=25, frames=max_iter * 10)
    24. plt.show()
    25. ani.save('pso.gif', writer='pillow')

    效果 

  • 相关阅读:
    不能显式拦截ajax请求的302响应?
    JAVA计算机毕业设计医保局综合办公系统Mybatis+源码+数据库+lw文档+系统+调试部署
    【高效办公_PDF】如何快速批量整合多个PDF???---Python方法
    带自动采集小说网站源码 小说听书网站源码 小说网站源码 带教程
    关于Android的自动化测试,你需要了解的5个测试框架
    Dolphinscheduler3.0源码分析之XxlJob优化之路
    【SA8295P 源码分析】103 - QNX DDR RAM 内存布局分析
    Glide - Android的图像加载和缓存库,专注于平滑滚动
    NNLM、RNNLM等语言模型 实现 下一单词预测(next-word prediction)
    AWS AD Connector 的网络配置
  • 原文地址:https://blog.csdn.net/weixin_46277779/article/details/126812870