我是小白
本程序结束条件设定为迭代次数
vscode代码如下:小白写的比较繁琐QAQ
#粒子群算法
import random
#粒子群
N=3#种群数量
step=5#迭代次数
#step1 初始化
fout=[]#目标函数输出值
xout=[]#储存坐标值
pbest=[]
v=[]
gbest=[]
for i in range(N):
v1=random.randint(-10,10)
v2=random.randint(-10,10)
x1=random.randint(-10,10)
x2=random.randint(-10,10)
f=x1**2+x2**2
fout.append(f)
pbest.append([x1,x2])
xout.append([x1,x2])
v.append([v1,v2])
index=(fout.index(min(fout)))
gbest.append(pbest[index])
print(f'初始化后的gbest为{gbest}')
#根据自身的历史最优位置和全局的最优位置,更新每个粒子的速度和位置
w=0.5#权重
c=2#学习系数
r=random.randint(0,1)
count=0#迭代计数
while count < step:
count=count+1
#更新所有变量
for i in range(N):
v[i][0]=w*v[i][0]+c*r*(pbest[i][0]-xout[i][0])+c*r*(gbest[0][0]-xout[i][0])
v[i][1]=w*v[i][1]+c*r*(pbest[i][1]-xout[i][1])+c*r*(gbest[0][1]-xout[i][1])
xout[i][0]=xout[i][0]+v[i][0]
xout[i][1]=xout[i][1]+v[i][1]
print(f'第{count}次迭代时候的v为{v},xout为{xout}')
#评估粒子的适应度函数值
for i in range(N):
if xout[i][0]**2+xout[i][1]**2<fout[i]:
fout[i]=xout[i][0]**2+xout[i][1]**2
pbest[i][0]=xout[i][0]
pbest[i][1]=xout[i][1]
else:
fout[i]=fout[i]
pbest[i][0]=pbest[i][0]
pbest[i][1]=pbest[i][1]
index=(fout.index(min(fout)))
gbest.clear()
gbest.append(pbest[index])
print(f'第{count}次的迭代的gbest值为{gbest},此时最优值为{min(fout)}')
运行结果: