利用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 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
python生成器的使用方法
Nov 21 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
python利用OpenCV2实现人脸检测
Apr 16 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
详解python单元测试框架unittest
Jul 02 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
python的等深分箱实例
Nov 22 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
Django REST Swagger实现指定api参数
Jul 07 Python
python实现测试工具(一)——命令行发送get请求
Oct 19 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
如何过滤高亮显示非法字符
2006/10/09 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
php 多文件上传的实现实例
2016/10/23 PHP
php桥接模式应用案例分析
2019/10/23 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
python使用turtle库绘制时钟
2020/03/25 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
python中update的基本使用方法详解
2019/07/17 Python
pandas分组聚合详解
2020/04/10 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
工程造价自荐信
2013/10/09 职场文书
英语文学专业学生的自我评价
2013/10/31 职场文书
学校标语大全
2014/06/19 职场文书
商铺消防安全责任书
2014/07/29 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
安全生产会议制度
2015/08/06 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
利用js实现简单开关灯代码
2021/11/23 Javascript