经典PSO粒子群算法python实现(面向对象)

以下是笔者调试好的面向对象的PSO算法,已封装好,相关参数在主函数__main__下修改即可。

注:很多同学觉得面向对象很难,其实很简单,网上找几个实例运行看看就能懂了。其中self就是一个初始化自己的过程,相当于一个容器,你告诉机器要放入哪些参数和函数,这些参数和函数叫什么名字。

以下设置可行域为[-10,10],维度为5维,目标函数为

显然,我们最优解为[0,0,0,0,0]

以下为求解该问题的python程序

import numpy as np
def y(x):
    return np.sum(x**2)
class PSO:
    def __init__(self,y,num_iter,num_particles,num_dimensions,c1,c2,w,bound_low,bound_high,vel_low,vel_high):
        self.fitness_function=y
        self.num_iter=num_iter
        self.num_particles=num_particles
        self.num_dimensions=num_dimensions
        self.c1=c1
        self.c2=c2
        self.w=w
        self.vel_low=vel_low
        self.vel_high=vel_high
        self.bound_low=bound_low
        self.bound_high=bound_high
        # 粒子初始化
        self.pos=np.random.uniform(bound_low,bound_high,(num_particles,num_dimensions))
        self.vel=np.random.uniform(vel_high,vel_high,(num_particles,num_dimensions))
        self.pbest_pos=self.pos.copy()
        self.pnow_val=np.zeros(num_particles)
        self.pbest_val=np.full(num_particles,np.inf)
        self.gbest_pos=np.zeros((1,num_dimensions))
        self.gbest_val=np.inf

    # 边界速度限制处理
    def limit_eachiter(self):
        self.pos[self.pos>self.bound_high]=self.bound_high
        self.pos[self.pos<self.bound_low]=self.bound_low
        self.vel[self.vel>self.vel_high]=self.vel_high
        self.vel[self.vel<self.vel_low]=self.vel_low

    # 计算适应度、更新最优记录
    def fitness_eachiter(self):
        for i in range(self.num_particles):
            self.pnow_val[i]=self.fitness_function(self.pos[i])
            if self.pnow_val[i]<self.pbest_val[i]:
                self.pbest_val[i]=self.pnow_val[i].copy()
                self.pbest_pos[i]=self.pos[i].copy()
            if self.pnow_val[i]<self.gbest_val:
                self.gbest_val=self.pnow_val[i].copy()
                self.gbest_pos=self.pos[i].copy()

    # 粒子速度、位置更新,运用广播机制
    def update_eachiter(self):
        self.vel=self.w*self.vel+self.c1*np.random.rand()*(self.pbest_pos-self.pos)+\
            self.c2*np.random.rand()*(self.gbest_pos-self.pos)
        self.pos=self.pos+self.vel

    # 主程序
    def pso(self):
        for i in range(self.num_iter):
            self.limit_eachiter()
            self.fitness_eachiter()
            self.update_eachiter()
if __name__=='__main__':
    num_iter=600
    num_particles=50
    num_dimensions=5
    c1=2
    c2=2
    w=0.8
    bound_low=-10
    bound_high=10
    vel_low=-1
    vel_high=1
    PSO=PSO(y,num_iter,num_particles,num_dimensions,c1,c2,w,bound_low,bound_high,vel_low,vel_high)
    PSO.pso()
    print('Optimal solution: x = {}, f(x) = {}'.format(PSO.gbest_pos, PSO.gbest_val))

运行一下,结果为:

Optimal solution: x = [-1.17921320e-10 -6.00967243e-11  6.29614150e-11  3.05093263e-10
 -4.88228938e-11], f(x) = 1.1694676763834684e-19

完美!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PSO(粒子群优化算法)是一种通过模拟粒子群行为来解决问题的智能优化算法。它在函数优化、图像处理、大地测量等众多领域都有广泛应用。 在标准的PSO算法中,搜索空间被定义为n维,粒子群中有m个粒子。每个粒子都有自己的位置和速度。粒子根据自己的速度和位置来更新自己的位置。整个粒子群也会记录下迄今为止搜索到的最好位置。 在优化过程中,PSO算法存在着多样性和收敛速度之间的矛盾。为了解决这个问题,人们对标准PSO算法进行了改进。这些改进包括选择合适的参数、使用小生境技术、将其他技术与PSO算法结合等。这些改进的目的是在增强算法的局部搜索能力的同时,保持种群的多样性,防止算法过早陷入收敛。 如果你想在Python中使用PSO算法,你可以使用现有的PSO库,比如PySwarms。这个库提供了一种方便的方式来实现PSO算法,并且提供了丰富的功能和扩展性,使你可以根据自己的需求调整算法的参数和行为。 你可以通过安装PySwarms库并参考其文档来开始使用PSO算法。使用这个库,你可以定义你的问题的目标函数,并设置算法的参数,然后运行PSO算法来找到最优解。具体的代码示例可以在PySwarms的文档中找到。 总而言之,PSO是一种智能优化算法,可以用于解决函数优化等问题。在Python中,你可以使用现有的PSO库,如PySwarms来实现PSO算法。你可以根据自己的需求定义问题和调整算法的参数,然后运行算法来求解最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值