利用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面向对象编程中的类和对象学习教程
Mar 30 Python
python解析基于xml格式的日志文件
Feb 25 Python
Python中进程和线程的区别详解
Oct 29 Python
几种实用的pythonic语法实例代码
Feb 24 Python
python批量修改文件编码格式的方法
May 31 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Python字典对象实现原理详解
Jul 01 Python
kali中python版本的切换方法
Jul 11 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
详解Django配置优化方法
Nov 18 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
js查找节点的方法小结
2015/01/13 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
如何通过命令行进入python
2020/07/06 Python
巴黎一票通:The Paris Pass
2018/02/10 全球购物
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
两道JAVA笔试题
2016/09/14 面试题
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
装饰资料员岗位职责
2013/12/30 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
庆七一晚会主持词
2015/06/30 职场文书
股权投资协议书
2016/03/23 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
python实现简单的名片管理系统
2021/04/26 Python