利用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 相关文章推荐
Django发送html邮件的方法
May 26 Python
django批量导入xml数据
Oct 16 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
python os.fork() 循环输出方法
Aug 08 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
pytorch中的numel函数用法说明
May 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
php获取淘宝分类id示例
2014/01/16 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
JSONP跨域请求
2017/03/02 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
Python赋值语句后逗号的作用分析
2015/06/08 Python
python抓取文件夹的所有文件
2018/02/27 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
python实现处理mysql结果输出方式
2020/04/09 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
python实现自动清理重复文件
2020/08/24 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
安全施工责任书
2014/08/25 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
银行竞聘报告范文
2014/11/06 职场文书
离婚协议书范本
2015/01/26 职场文书
蓬莱阁导游词
2015/02/04 职场文书
刘公岛导游词
2015/02/05 职场文书
重阳节活动主持词
2015/07/04 职场文书