利用python实现PSO算法优化二元函数


Posted in Python onNovember 13, 2019

python实现PSO算法优化二元函数,具体代码如下所示:

import numpy as np 
import random 
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#----------------------PSO参数设置--------------------------------- 
class PSO(): 
 def __init__(self,pN,dim,max_iter): #初始化类 设置粒子数量 位置信息维度 最大迭代次数 
  #self.w = 0.8 
  self.ws = 0.9
  self.we = 0.4
  self.c1 = 1.49445  
  self.c2 = 1.49445  
  self.r1= 0.6 
  self.r2= 0.3 
  self.pN = pN    #粒子数量 
  self.dim = dim    #搜索维度 
  self.max_iter = max_iter #迭代次数 
  self.X = np.zeros((self.pN,self.dim))  #所有粒子的位置(还要确定取值范围) 
  self.Xmax = 5 
  self.Xmin = -5
  self.V = np.zeros((self.pN,self.dim))  #所有粒子的速度(还要确定取值范围)
  self.Vmax = 1 
  self.Vmin = -1
  self.pbest = np.zeros((self.pN,self.dim)) #个体经历的最佳位置 
  self.gbest = np.zeros((1,self.dim))   #全局最佳位置
  self.p_fit = np.zeros(self.pN)    #每个个体的历史最佳适应值 
  self.fit = 0    #全局最佳适应值 
#---------------------目标函数Sphere函数----------------------------- 
 def function(self,x): 
  y = np.sin(10*np.pi*x)/x
  return y
 def Holder_table(self,x,y):  
  z = -np.abs(np.sin(x) * np.cos(y) * np.exp(np.abs(1 - np.sqrt(x**2 + y**2)/np.pi)))
  return z
 def fuck(self,x,y):
  z = x**2 + y**2 - 10*np.cos(2*np.pi*x) - 10*np.cos(2*np.pi*y) + 20
  return z
#---------------------初始化种群---------------------------------- 
 def init_Population(self):
  for i in range(self.pN):        #遍历所有粒子
   for j in range(self.dim):       #每一个粒子的纬度
    self.X[i][j] = random.uniform(-5,5)    #给每一个粒子的位置赋一个初始随机值(在一定范围内)
    self.V[i][j] = random.uniform(-1,1)    #给每一个粒子的速度给一个初始随机值(在一定范围内)
   self.pbest[i] = self.X[i]       #把当前粒子位置作为这个粒子的最优位置
   tmp = self.fuck(self.X[i][0],self.X[i][1])   #计算这个粒子的适应度值
   self.p_fit[i] = tmp         #当前粒子的适应度值作为个体最优值
   if(tmp > self.fit):         #与当前全局最优值做比较并选取更佳的全局最优值
    self.fit = tmp 
    self.gbest = self.X[i] 
#---------------------更新粒子位置---------------------------------- 
 def iterator(self): 
  fitness = [] 
  for t in range(self.max_iter):
   w = self.ws - (self.ws - self.we) * (t / self.max_iter)
   for i in range(self.pN): 
    #更新速度
    self.V[i] = w*self.V[i] + self.c1*self.r1*(self.pbest[i] - self.X[i]) + self.c2*self.r2*(self.gbest - self.X[i])
    if self.V[i][0] > self.Vmax:
     self.V[i][0] = self.Vmax
    elif self.V[i][0] < self.Vmin:
     self.V[i][0] = self.Vmin
    if self.V[i][1] > self.Vmax:
     self.V[i][1] = self.Vmax
    elif self.V[i][1] < self.Vmin:
     self.V[i][1] = self.Vmin
    #更新位置
    self.X[i] = self.X[i] + self.V[i]
    if self.X[i][0] > self.Xmax:
     self.X[i][0] = self.Xmax
    elif self.X[i][0] < self.Xmin:
     self.X[i][0] = self.Xmin
    if self.X[i][1] > self.Xmax:
     self.X[i][1] = self.Xmax
    elif self.X[i][1] < self.Xmin:
     self.X[i][1] = self.Xmin
   for i in range(self.pN):   #更新gbest\pbest 
    temp = self.fuck(self.X[i][0],self.X[i][1]) 
    if(temp > self.p_fit[i]):  #更新个体最优 
     self.pbest[i] = self.X[i]
     self.p_fit[i] = temp 
    if(temp > self.fit):   #更新全局最优 
     self.gbest = self.X[i] 
     self.fit = temp 
   fitness.append(self.fit) 
   print('最优值为:',self.fit)#输出最优值 
   z1 = self.fit
   print('最优位置为:',self.X[i][0],self.X[i][1])
   x1 = self.X[i][0]
   y1 = self.X[i][1]
  return fitness, z1, x1,y1
#----------------------程序执行----------------------- 
my_pso = PSO(pN=100,dim=2,max_iter=200) 
my_pso.init_Population() 
fitness,z1,x1,y1 = my_pso.iterator()
plt.figure(1) 
plt.title("Figure1") 
plt.xlabel("iterators", size=14) 
plt.ylabel("fitness", size=14) 
t = np.array([t for t in range(0,200)]) 
fitness = np.array(fitness) 
plt.plot(t,fitness, color='b',linewidth=3) 
plt.show() 
fig = plt.figure(figsize=(15,10))
ax = Axes3D(fig)
X = np.arange(-5,5,0.1)
Y = np.arange(-5,5,0.1)
X,Y = np.meshgrid(X,Y)
def f(x,y):
 return (x**2 + y**2 - 10*np.cos(2*np.pi*x) - 10*np.cos(2*np.pi*y) + 20)
ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1,cmap= plt.get_cmap('rainbow'))
ax.scatter(x1, y1, z1,s=400,c='k',marker = '*')
plt.show()

效果图如下

利用python实现PSO算法优化二元函数

总结

以上所述是小编给大家介绍的利用python实现PSO算法优化二元函数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python控制台英汉汉英电子词典
Apr 23 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
Python中常见的异常总结
Feb 20 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
Sanic框架应用部署方法详解
Jul 18 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
django框架ModelForm组件用法详解
Dec 11 Python
python实现井字棋小游戏
Mar 04 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 Python
使用python制作一个解压缩软件
Nov 13 #Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 #Python
基于python实现把图片转换成素描
Nov 13 #Python
Django连接数据库并实现读写分离过程解析
Nov 13 #Python
Pandas操作CSV文件的读写实现方法
Nov 13 #Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 #Python
Series和DataFrame使用简单入门
Nov 13 #Python
You might like
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
模仿OSO的论坛(四)
2006/10/09 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
php实现简单爬虫的开发
2016/03/28 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
基本DOM节点操作
2017/01/17 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python Django Cookie 简单用法解析
2019/08/13 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
类如何去实现接口
2013/12/19 面试题
秋季红领巾广播稿
2014/01/27 职场文书
个人主要事迹材料
2014/08/26 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
家长高考寄语
2015/02/27 职场文书
思品教学工作总结
2015/08/10 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL