赞
踩
该代码所要解决的问题是求解函数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()
适应度进化曲线如下所示:
函数最小值如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。