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爬取淘宝商品详情页数据
Feb 23 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python实现Linux监控的方法
May 16 Python
Python 3.8 新功能全解
Jul 25 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
如何通过python实现全排列
Feb 11 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
python matplotlib库的基本使用
Sep 23 Python
Django前后端分离csrf token获取方式
Dec 25 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
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
Python中生成Epoch的方法
2017/04/26 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
python3爬取各类天气信息
2018/02/24 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
python hook监听事件详解
2018/10/25 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python科学计算之narray对象用法
2019/11/25 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python 伯努利分布详解
2020/02/25 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
祖国在我心中演讲稿
2014/01/15 职场文书
金融管理应届生求职信
2014/02/20 职场文书
党员个人整改措施
2014/10/24 职场文书
离婚协议书格式
2015/01/26 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers
PHP RabbitMQ消息列队
2022/05/11 PHP