PSO算法算是寻优算法中比较简单的一种,其大概思想是:

现在我们计算:

的极大值,每一个变量的取值范围都是(1,25)。
Python代码为:

# -*- coding: utf-8 -*-
"""
@Time : 2020/9/13 10:08
@Author :KI
@File :pso.py
@Motto:Hungry And Humble"""
import math
import random
import numpy as np
import matplotlib.pyplot as plt
import pylab as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']class PSO:def __init__(self, dimension, time, size, low, up, v_low, v_high):# 初始化self.dimension = dimension  # 变量个数self.time = time  # 迭代的代数self.size = size  # 种群大小self.bound = []  # 变量的约束范围self.bound.append(low)self.bound.append(up)self.v_low = v_lowself.v_high = v_highself.x = np.zeros((self.size, self.dimension))  # 所有粒子的位置self.v = np.zeros((self.size, self.dimension))  # 所有粒子的速度self.p_best = np.zeros((self.size, self.dimension))  # 每个粒子最优的位置self.g_best = np.zeros((1, self.dimension))[0]  # 全局最优的位置# 初始化第0代初始全局最优解temp = -1000000for i in range(self.size):for j in range(self.dimension):self.x[i][j] = random.uniform(self.bound[0][j], self.bound[1][j])self.v[i][j] = random.uniform(self.v_low, self.v_high)self.p_best[i] = self.x[i]  # 储存最优的个体fit = self.fitness(self.p_best[i])# 做出修改if fit > temp:self.g_best = self.p_best[i]temp = fitdef fitness(self, x):"""个体适应值计算"""x1 = x[0]x2 = x[1]x3 = x[2]x4 = x[3]x5 = x[4]y = math.floor((x2 * np.exp(x1) + x3 * np.sin(x2) + x4 + x5) * 100) / 100# print(y)return ydef update(self, size):c1 = 2.0  # 学习因子c2 = 2.0w = 0.8  # 自身权重因子for i in range(size):# 更新速度(核心公式)self.v[i] = w * self.v[i] + c1 * random.uniform(0, 1) * (self.p_best[i] - self.x[i]) + c2 * random.uniform(0, 1) * (self.g_best - self.x[i])# 速度限制for j in range(self.dimension):if self.v[i][j] < self.v_low:self.v[i][j] = self.v_lowif self.v[i][j] > self.v_high:self.v[i][j] = self.v_high# 更新位置self.x[i] = self.x[i] + self.v[i]# 位置限制for j in range(self.dimension):if self.x[i][j] < self.bound[0][j]:self.x[i][j] = self.bound[0][j]if self.x[i][j] > self.bound[1][j]:self.x[i][j] = self.bound[1][j]# 更新p_best和g_bestif self.fitness(self.x[i]) > self.fitness(self.p_best[i]):self.p_best[i] = self.x[i]if self.fitness(self.x[i]) > self.fitness(self.g_best):self.g_best = self.x[i]def pso(self):best = []self.final_best = np.array([1, 2, 3, 4, 5])for gen in range(self.time):self.update(self.size)if self.fitness(self.g_best) > self.fitness(self.final_best):self.final_best = self.g_best.copy()print('当前最佳位置:{}'.format(self.final_best))temp = self.fitness(self.final_best)print('当前的最佳适应度:{}'.format(temp))best.append(temp)t = [i for i in range(self.time)]plt.figure()plt.plot(t, best, color='red', marker='.', ms=15)plt.rcParams['axes.unicode_minus'] = Falseplt.margins(0)plt.xlabel(u"迭代次数")  # X轴标签plt.ylabel(u"适应度")  # Y轴标签plt.title(u"迭代过程")  # 标题plt.show()if __name__ == '__main__':time = 50size = 100dimension = 5v_low = -1v_high = 1low = [1, 1, 1, 1, 1]up = [25, 25, 25, 25, 25]pso = PSO(dimension, time, size, low, up, v_low, v_high)pso.pso()

运行结果:

收敛过程:

可以看出,不到10次就收敛了。

matlab代码:

z=@(x)-(x(2)*exp(x(1))+x(3)*sin(x(2))+x(4)*x(5));
x0=[1;1;1;1;1];
[x,feval]=fmincon(z,x0,[],[],[],[],[1;1;1;1;1],[25;25;25;25;25])

运行结果:

x =25.000025.000013.14001.00021.0002feval =-1.8001e+12

如果想要利用上述代码求极小值,可以有以下两种办法:

  1. 将fitness函数中的返回值改为-y,此时如果求出的值为z,那么函数的极小值就为-z。
  2. 将第34行代码处的temp改为一个很大的值;将第42、83、85以及93行代码处的">“改为”<"。

粒子群算法(PSO)的Python实现(求解多元函数的极值)相关推荐

  1. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  2. 粒子群算法(PSO)Matlab实现(两种解法)

    粒子群算法(PSO) 用途:可以用于寻求最优解问题 生物机理:鸟群寻找湖泊 在函数中,有很多是无法求出最优解的 在这时,我们会采用软计算方法,而PSO算法,在软计算算法中有重要的地位: 好吧,这个仁者 ...

  3. 粒子群算法(PSO)以及Matlab实现

    粒子群算法(PSO)以及Matlab实现 算法背景 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy ...

  4. 粒子群算法(PSO)的C++实现

    粒子群算法(PSO)的C++实现 粒子群算法(PSO----Particle Swarm Optimization)是常用的智能算法之一,它模拟了 鸟群觅食 行为,是一种具有随机性的 仿生算法 .PS ...

  5. C语言实现粒子群算法(PSO)一

    C语言实现粒子群算法(PSO)一 最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等. ...

  6. 【老生谈算法】标准粒子群算法(PSO)及其Matlab程序和常见改进算法——粒子群算法

    1.算法详解: 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]标准粒子群算法(PSO)及其Matlab程序和常见改进算法.docx 2 ...

  7. 粒子群算法(PSO)初识

    粒子群算法PSO是模拟群体智能所建立起来的一种优化算法,用于解决各种优化问题. 抽象问题实例化: 假设一群 鸟在觅食,只有一个地方有 食物,所有鸟儿都看不见食物(不知道食物的具体位置,知道了就不无需觅 ...

  8. Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  9. 粒子群算法PSO求解最大值和最小值案例(超详细注释)

    目录 前言 1.粒子群算法简介和难点理解 1.1概念理解 ①非劣解集和支配 ②个体极值和群体极值 ③个体适应度值和群体适应度值 1.2 算法流程和理解 1.3 速度和位置更新公式 1.4 rand.r ...

最新文章

  1. windows 连Linux,Windows下访问Linux资源
  2. 根据当前时间获取本周,下周,上周日期
  3. 关于产品的一点点想法
  4. android- 9patch
  5. Docker中操作镜像和容器的常用命令
  6. 前端读者 | 由setTimeout引发的JS引擎运行机制的研究
  7. jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器
  8. yii mysql in,在Yii中从MySQL获取最后插入的ID
  9. static and const
  10. asp.net c# 常见面试试题总结汇总(含答案)
  11. [GCN] Modification of Graph Convolutional Networks in PyTorch
  12. 父子类中静态方法和属性实现
  13. 25.构造ICMP数据包
  14. 三调 图斑地类面积_国土三调APP-GIS,地理信息,综合管网,地下空间,给水排水,通信管网,燃气管网,智慧旅游,...
  15. java判断闰年中闰月_2019年农历闰几月 关于闰年闰月的认识
  16. 利用传输矩阵法求解布拉格光栅的透射谱
  17. 计算机桌面的理解,电脑桌面的基础知识教程,教你认识电脑桌面
  18. 思成五笔的通俗易懂讲解
  19. 循环结构习题:公式求π值
  20. Python-小游戏-乌龟吃鱼

热门文章

  1. java 麦克风_JAVA麦克风录音示例源码
  2. 【微信支付】Java实现微信APP支付流程
  3. (Python)正则表达式(二)
  4. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast
  5. 三阶交调(三阶互调) IP3
  6. 研华板卡cvi例程_研华amp;NI LabVIEW编程对比与驱动互换视频
  7. Selenium小技巧 修改ip+ua 改变窗口大小 手机模式 加载本地缓存
  8. go work 工作区
  9. Linux内核编程接口函数
  10. 深入浅出搞懂网络的五层协议