利用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实现strcmp函数功能示例
Mar 25 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
python操作excel让工作自动化
Aug 09 Python
使用Python的turtle模块画国旗
Sep 24 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
Pytest如何使用skip跳过执行测试
Aug 13 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的php类
2006/10/09 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
微信支付扫码支付php版
2016/07/22 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python在指定目录下查找gif文件的方法
2015/05/04 Python
详解Python多线程
2016/11/14 Python
安装Python的教程-Windows
2017/07/22 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
运动会广播稿200字
2014/01/15 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
使用JS实现简易计算器
2021/06/14 Javascript