python3实现单目标粒子群算法


Posted in Python onNovember 14, 2019

本文实例为大家分享了python3单目标粒子群算法的具体代码,供大家参考,具体内容如下

关于PSO的基本知识......就说一下算法流程

1) 初始化粒子群;

    随机设置各粒子的位置和速度,默认粒子的初始位置为粒子最优位置,并根据所有粒子最优位置,选取群体最优位置。

2) 判断是否达到迭代次数;

    若没有达到,则跳转到步骤3)。否则,直接输出结果。

3) 更新所有粒子的位置和速度;

4) 计算各粒子的适应度值。

     将粒子当前位置的适应度值与粒子最优位置的适应度值进行比较,决定是否更新粒子最优位置;将所有粒子最优位置的适应度值与群体最优位置的适应度值进行比较,决定是否更新群体最优位置。然后,跳转到步骤2)。

直接扔代码......(PS:1.参数动态调节;2.例子是二维的)

首先,是一些准备工作...

# Import libs
import numpy as np
import random as rd
import matplotlib.pyplot as plt
 
# Constant definition
MIN_POS = [-5, -5]         # Minimum position of the particle
MAX_POS = [5, 5]          # Maximum position of the particle
MIN_SPD = [-0.5, -0.5]        # Minimum speed of the particle
MAX_SPD = [1, 1]          # Maximum speed of the particle
C1_MIN = 0
C1_MAX = 1.5
C2_MIN = 0
C2_MAX = 1.5
W_MAX = 1.4
W_MIN = 0

然后是PSO类

# Class definition
class PSO():
 """
  PSO class
 """
 
 def __init__(self,iters=100,pcount=50,pdim=2,mode='min'):
  """
   PSO initialization
   ------------------
  """
 
  self.w = None         # Inertia factor
  self.c1 = None        # Learning factor
  self.c2 = None        # Learning factor
 
  self.iters = iters       # Number of iterations
  self.pcount = pcount       # Number of particles
  self.pdim = pdim        # Particle dimension
  self.gbpos = np.array([0.0]*pdim)    # Group optimal position
  
  self.mode = mode        # The mode of PSO
 
  self.cur_pos = np.zeros((pcount, pdim))  # Current position of the particle
  self.cur_spd = np.zeros((pcount, pdim))  # Current speed of the particle
  self.bpos = np.zeros((pcount, pdim))   # The optimal position of the particle
 
  self.trace = []        # Record the function value of the optimal solution
  
 
 def init_particles(self):
  """
   init_particles function
   -----------------------
  """
 
  # Generating particle swarm
  for i in range(self.pcount):
   for j in range(self.pdim):
    self.cur_pos[i,j] = rd.uniform(MIN_POS[j], MAX_POS[j])
    self.cur_spd[i,j] = rd.uniform(MIN_SPD[j], MAX_SPD[j])
    self.bpos[i,j] = self.cur_pos[i,j]
 
  # Initial group optimal position
  for i in range(self.pcount):
   if self.mode == 'min':
    if self.fitness(self.cur_pos[i]) < self.fitness(self.gbpos):
     gbpos = self.cur_pos[i]
   elif self.mode == 'max':
    if self.fitness(self.cur_pos[i]) > self.fitness(self.gbpos):
     gbpos = self.cur_pos[i]
 
 def fitness(self, x):
  """
   fitness function
   ----------------
   Parameter:
    x : 
  """
  
  # Objective function
  fitval = 5*np.cos(x[0]*x[1])+x[0]*x[1]+x[1]**3 # min
  # Retyrn value
  return fitval
 
 def adaptive(self, t, p, c1, c2, w):
  """
  """
 
  #w = 0.95 #0.9-1.2
  if t == 0:
   c1 = 0
   c2 = 0
   w = 0.95
  else:
   if self.mode == 'min':
    # c1
    if self.fitness(self.cur_pos[p]) > self.fitness(self.bpos[p]):
     c1 = C1_MIN + (t/self.iters)*C1_MAX + np.random.uniform(0,0.1)
    elif self.fitness(self.cur_pos[p]) <= self.fitness(self.bpos[p]):
     c1 = c1
    # c2 
    if self.fitness(self.bpos[p]) > self.fitness(self.gbpos):
     c2 = C2_MIN + (t/self.iters)*C2_MAX + np.random.uniform(0,0.1)
    elif self.fitness(self.bpos[p]) <= self.fitness(self.gbpos):
     c2 = c2
    # w
    #c1 = C1_MAX - (C1_MAX-C1_MIN)*(t/self.iters)
    #c2 = C2_MIN + (C2_MAX-C2_MIN)*(t/self.iters)
    w = W_MAX - (W_MAX-W_MIN)*(t/self.iters)
   elif self.mode == 'max':
    pass
 
  return c1, c2, w
 
 def update(self, t):
  """
   update function
   ---------------
    Note that :
     1. Update particle position
     2. Update particle speed
     3. Update particle optimal position
     4. Update group optimal position
  """
 
  # Part1 : Traverse the particle swarm
  for i in range(self.pcount):
   
   # Dynamic parameters
   self.c1, self.c2, self.w = self.adaptive(t,i,self.c1,self.c2,self.w)
   
   # Calculate the speed after particle iteration
   # Update particle speed
   self.cur_spd[i] = self.w*self.cur_spd[i] \
        +self.c1*rd.uniform(0,1)*(self.bpos[i]-self.cur_pos[i])\
        +self.c2*rd.uniform(0,1)*(self.gbpos - self.cur_pos[i])
   for n in range(self.pdim):
    if self.cur_spd[i,n] > MAX_SPD[n]:
     self.cur_spd[i,n] = MAX_SPD[n]
    elif self.cur_spd[i,n] < MIN_SPD[n]:
     self.cur_spd[i,n] = MIN_SPD[n]
 
   # Calculate the position after particle iteration
   # Update particle position 
   self.cur_pos[i] = self.cur_pos[i] + self.cur_spd[i]
   for n in range(self.pdim):
    if self.cur_pos[i,n] > MAX_POS[n]:
     self.cur_pos[i,n] = MAX_POS[n]
    elif self.cur_pos[i,n] < MIN_POS[n]:
     self.cur_pos[i,n] = MIN_POS[n]
    
  # Part2 : Update particle optimal position
  for k in range(self.pcount):
   if self.mode == 'min':
    if self.fitness(self.cur_pos[k]) < self.fitness(self.bpos[k]):
     self.bpos[k] = self.cur_pos[k]
   elif self.mode == 'max':
    if self.fitness(self.cur_pos[k]) > self.fitness(self.bpos[k]):
     self.bpos[k] = self.cur_pos[k]
 
  # Part3 : Update group optimal position
  for k in range(self.pcount):
   if self.mode == 'min':
    if self.fitness(self.bpos[k]) < self.fitness(self.gbpos):
     self.gbpos = self.bpos[k]
   elif self.mode == 'max':
    if self.fitness(self.bpos[k]) > self.fitness(self.gbpos):
     self.gbpos = self.bpos[k]
 
 def run(self):
  """
   run function
   -------------
  """
 
  # Initialize the particle swarm
  self.init_particles()
 
  # Iteration
  for t in range(self.iters):
   # Update all particle information
   self.update(t)
   #
   self.trace.append(self.fitness(self.gbpos))

然后是main...

def main():
 """
  main function
 """
 
 for i in range(1):
  
  pso = PSO(iters=100,pcount=50,pdim=2, mode='min')
  pso.run()
   
  #
  print('='*40)
  print('= Optimal solution:')
  print('= x=', pso.gbpos[0])
  print('= y=', pso.gbpos[1])
  print('= Function value:')
  print('= f(x,y)=', pso.fitness(pso.gbpos))
  #print(pso.w)
  print('='*40)
  
  #
  plt.plot(pso.trace, 'r')
  title = 'MIN: ' + str(pso.fitness(pso.gbpos))
  plt.title(title)
  plt.xlabel("Number of iterations")
  plt.ylabel("Function values")
  plt.show()
 #
 input('= Press any key to exit...')
 print('='*40)
 exit() 
 
 
if __name__ == "__main__":
 
 main()

最后是计算结果,完美结束!!!

python3实现单目标粒子群算法

python3实现单目标粒子群算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
PyCharm安装第三方库如Requests的图文教程
May 18 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
Python 共享变量加锁、释放详解
Aug 28 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
重写django的model下的objects模型管理器方式
May 15 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
Python操作Word批量生成合同的实现示例
Aug 28 Python
Python道路车道线检测的实现
Jun 27 Python
python socket 聊天室实例代码详解
Nov 14 #Python
python中dict()的高级用法实现
Nov 13 #Python
python实现的多任务版udp聊天器功能案例
Nov 13 #Python
利用python实现PSO算法优化二元函数
Nov 13 #Python
使用python制作一个解压缩软件
Nov 13 #Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 #Python
基于python实现把图片转换成素描
Nov 13 #Python
You might like
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python标准库之sqlite3使用实例
2014/11/25 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Django中的ajax请求
2018/10/19 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
Wallis官网:英国女装零售商
2020/01/21 全球购物
专业毕业生个性的自我评价
2013/10/03 职场文书
经理管理专业自荐信范文
2013/12/31 职场文书
创意广告词
2014/03/17 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
会议简报格式范文
2015/07/20 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
React forwardRef的使用方法及注意点
2021/06/13 Javascript