其中维数为自变量个数
此代码仅能处理二维矩阵,在处理高于二维的矩阵时需要修改
返回值为目标函数的最小值
import numpy as np
import pandas as pd
import math
import os
import random as rd
dim=1#维数
p_num=10#粒子数量
counts=100#迭代数量
amax=999999#max
#粒子速度范围与位置范围
v_max=4
v_min=-2
pos_max=2
pos_min=-1
#位置向量与速度向量
pos=[]
spe=[]
#粒子历史最优位置与全局最优位置
p_best=[]
g_best=0
#函数值矩阵与位置矩阵
f=np.ma.zeros((counts,p_num))
pos_mat=np.ma.zeros((counts,p_num))
#速度更新函数相关参数
w=0.5
c1=2
r1=0
c2=2
r2=0
#定义适应度函数
def af(x):
res=x*x+1
return res
#初始化粒子群的位置与速度
def init():
global f,pos_mat,pos_min,g_best,p_best,pos,spe
#初始化为最大值
for i in range(0,f.shape[0]):
for j in range(0,f.shape[1]):
f[i][j]=amax
for i in range(0,pos_mat.shape[0]):
for j in range(0,pos_mat.shape[1]):
pos_mat[i][j]=amax
#生成随机数
for i in range(0,p_num):
r1=rd.randint(pos_min,pos_max-1)+rd.random()
r2=rd.randint(v_min,v_max-1)+rd.random()
pos.append(r1)
spe.append(r2)
for i in range(0,p_num):
#计算适应函数值
res=af(pos[i])
#初始化函数值矩阵和位置矩阵
f[0][i]=res
pos_mat[0][i]=pos[i]
#初始化粒子历史最优位置
p_best.append(pos[i])
g_best=min(f[0])
def PSO():
global f,pos_mat,pos_min,g_best,p_best,pos,spe
r1=rd.random()
r2=rd.random()
#更新速度与位置向量
for con in range(1,counts):
for i in range(0,p_num):
spe[i]=w*spe[i]+c1*r1*(p_best[i]-pos[i])+c2*r2*(g_best-pos[i])
pos[i]=pos[i]+spe[i]
#越界时修正
if spe[i]<v_min:
spe[i]=v_min
elif spe[i]>v_max:
spe[i]=v_max
if pos[i] < pos_min:
pos[i] = pos_min
elif pos[i] > pos_max:
pos[i] = pos_max
#更新位置矩阵
pos_mat[con][i]=pos[i]
#更新函数值矩阵
for i in range(0,p_num):
x=af(pos[i])
f[con][i]=x
lo=[]
for i in range(0,p_num):
lo.clear()
for j in range(0,con):
lo.append(f[j][i])
p_best[i]=min(lo)
g_best=min(p_best)
return g_best
init()
PSO()
print(PSO())