簡易PSO粒子群演算法(python)

2021-09-23 18:23:33 字數 3810 閱讀 4510

參考csdn上的一些大佬的程式 依葫蘆畫瓢自己編了個玩

# coding: utf-8

import numpy as np

import random

import matplotlib.pyplot as plt

import math

from numpy import *

#----------------------pso引數設定---------------------------------

class pso():

def __init__(self,pn,dim,max_iter):

self.w=0.729

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.v = np.zeros((self.pn,self.dim))

self.pbest = np.zeros((self.pn,self.dim)) #個體經歷的最佳位置和全域性最佳位置

self.gbest = np.zeros((1,self.dim))

self.p_fit = np.zeros(self.pn) #每個個體的歷史最佳適應值

self.fit =10000 #全域性最佳適應值

def function(self,x):

'''f=0

for i in range(self.dim-1):

f=f+100*(x[i+1]-x[i]**2)**2+(x[i+1]-1)**2'''

f=sin(x[0])+cos(x[1])

#=-fabs(sin(x[0])*cos(x[1])*exp(fabs(1-sqrt(x[0]**2+x[1]**2)/pi)))

#f=sin(x[0]+x[1])+(x[0]-x[1])**2-1.5*x[0]+2.5*x[1]+1

#f=-0.0001*(fabs(sin(x[0])*sin(x[1])*exp(fabs(100-sqrt(x[0]**2+x[1]**2)/pi))+1))**0.1

#f=-(fabs(sin(x[0])*cos(x[1])*exp(fabs(1-sqrt(x[0]**2+x[1]**2)/pi))))

#f=0.5+(cos(sin(fabs(x[0]**2-x[1]**2)))-0.5)/(1+0.001*(x[0]**2+x[1]**2))**2

#最後乙個函式有問題?。

return f

#---------------------初始化種群----------------------------------

def init_population(self):

for i in range(self.pn):

for j in range(self.dim):

self.x[i][j]= random.uniform(-2,2)

self.v[i][j] = random.uniform(-0.5,0.5)

self.pbest[i] = self.x[i]

#print(self.x)

tmp = self.function(self.x[i])

self.p_fit[i] = tmp

if tmp < self.fit:

self.fit = tmp

self.gbest = self.x[i]

#----------------------更新粒子位置----------------------------------

def iterator(self):

fitness =

gbest=

v=wmax=0.9

wmin=0.4

for t in range(self.max_iter):

self.w=-1.4*t/self.max_iter+1.5 #w的動態變化 權重線性遞減 wmax起碼大於1.1 wmax-min起碼大於

#self.w=wmax-t*(wmax-wmin)/self.max_iter #wmax=0.9 wmin=0.4效果不佳 取wmax=1.2 wmin=0

for i in range(self.pn): #更新gbest\pbest

temp = self.function(self.x[i])

if(temp10:

self.x[i][j]=10/self.x[i][j]*10

#print('我把它變小了:',i,j)

if self.x[i][j]<-10:

self.x[i][j]=-10/self.x[i][j]*(-10)

#print('我把它變大了:',i,j)

if self.x[i][j]<1e-5 and self.x[i][j]>-1e-5:

self.x[i][j]=random.uniform(-10,10)'''

'''self.x[i]= np.minimum(self.x[i], 10)

self.x[i]= np.maximum(self.x[i],-10)'''

'''if np.any(self.x[i]==10):

self.x[i]=self.x[i]-ones((20,5))

print('jianle')

if np.any(self.x[i]==1):

self.x[i]=self.x[i]+ones((20,5))

print('jianle')'''

best=self.gbest

fbest=self.fit

#print('全域性最優解:',self.gbest)

#print('輸出最優值:',self.fit)#輸出最優值

return fitness,best,fbest

#----------------------程式執行-----------------------

my_pso = pso(pn=30,dim=5,max_iter=200)

my_pso.init_population()

fitness,best,fbest= 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,my_pso.max_iter)])

fitness = np.array(fitness)

plt.plot(t,fitness, color='b',linewidth=3)

print('最終的粒子群的全域性最佳位置為:',best)

print('最終得到的適應度函式的最優值為:',fbest)

plt.show()

粒子群(pso)演算法

一 粒子群演算法的概念 粒子群優化演算法 pso particle swarm optimization 是一種進化計算技術 evolutionary computation 源於對鳥群捕食的行為研究。粒子群優化演算法的基本思想 是通過群體中個體之間的協作和資訊共享來尋找最優解 pso的優勢 在於簡...

粒子群演算法 PSO

1995年美國社會心理學家kennedy和電氣工程師eberhart共同提出粒子群優化演算法 particle swarm optimization,pso pso演算法的基本思想利用生物學家heppner的生物群體模型,模擬鳥類覓食過程。鳥類飛行過程相互交流,當乙個鳥飛向棲息地時,其他鳥兒也會跟著...

粒子群優化演算法 PSO

粒子群優化演算法 pso particle swarm optimization 是一種進化計算技術 evolutionary computation 源於對鳥群捕食的行為研究。粒子群優化演算法的基本思想 是通過群體中個體之間的協作和資訊共享來尋找最優解 pso的優勢 在於簡單容易實現並且沒有許多引...