參考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的優勢 在於簡單容易實現並且沒有許多引...