粒子群算法的python代码实现

该代码所要解决的问题是求解函数z=3cos(xy)+x+y^2的最小值。代码如下所示:

import numpy as np
import math
import random
import matplotlib.pyplot as plt
class Particles:
    def __init__(self,num,d,iterMax,l1,l2,wMax,wMin,xMax,xMin,vMax,vMin,x,v):
        self.num=num  #粒子个数
        self.d=d      #粒子维数
        self.iterMax=iterMax    #最大迭代次数
        self.l1=l1     #学习因子
        self.l2=l2    #学习因子
        self.wMax=wMax    #惯性权重最大值
        self.wMin=wMin    #惯性权重最小值
        self.xMax=xMax    #位置最大值
        self.xMin=xMin    #位置最小值
        self.vMax=vMax    #速度最大值
        self.vMin=vMin    #速度最小值
        self.x=x    #位置
        self.v=v    #速度
    def init(self):
        self.x=np.random.rand(self.num,self.d)*(self.xMax-self.xMin)+self.xMin   #初始化位置
        self.v=np.random.rand(self.num,self.d)*(self.vMax-self.vMin)+self.vMin   #初始化速度

particles=Particles(100,2,1000,1.5,1.5,0.8,0.4,4,-4,1,-1,0,0)     #对象实例化
particles.init()
p=np.zeros((particles.num,particles.d))
p=particles.x
pbest=np.ones((particles.num,1))
pPosition=np.ones((particles.num,particles.d))
for i in range(particles.num):
    pbest[i]=3*math.cos(particles.x[i][0]*particles.x[i][1])+particles.x[i][0]+pow(particles.x[i][1],2)
    pPosition[i]=p[i]
gPosition=np.ones((1,particles.d))
gbest=float('inf')
for i in range(particles.num):
    if pbest[i]<gbest:
        gPosition=p[i]
        gbest=pbest[i]
gb=np.ones((1,particles.iterMax))
for i in range(particles.iterMax):
    for j in range(particles.num):
        w=particles.wMax-(particles.wMax-particles.wMin)*pow(i,2)/pow(particles.iterMax,2)
        particles.v[j]=w*particles.v[j]+random.random()*particles.l1*(pPosition[j]-particles.x[j])+random.random()*particles.l2*(gPosition-particles.x[j])
        particles.x[j]=particles.x[j]+particles.v[j]
        for ii in range(particles.d):
            if particles.v[j][ii]>particles.vMax or particles.v[j][ii]<particles.vMin:
                particles.v[j][ii]=random.random()*(particles.vMax-particles.vMin)+particles.vMin
            if particles.x[j][ii]>particles.xMax or particles.x[j][ii]<particles.xMin:
                particles.x[j][ii]=random.random()*(particles.xMax-particles.xMin)+particles.xMin
        value=3*math.cos(particles.x[j][0]*particles.x[j][1])+particles.x[j][0]+pow(particles.x[j][1],2)
        if value<pbest[j]:
            p[j]=particles.x[j]
            pbest[j]=value
            pPosition[j]=p[j]
        if pbest[j]<gbest:
            gPosition=p[j]
            gbest=pbest[j]
    gb[0][i]=gbest
print("函数最优值:"+(str)(gbest[len(gbest)-1]))
c=np.arange(0,particles.iterMax,1).tolist()
gbList=gb.tolist()
plt.plot(c,gbList[0])
plt.title("Fitness evolution curve")
plt.show()



适应度进化曲线如下所示:
粒子群算法的python代码实现_第1张图片
函数最小值如下:
粒子群算法的python代码实现_第2张图片

你可能感兴趣的:(机器学习,粒子群算法)