MOPSO 多目标粒子群python实现

本文介绍了基于Coello等人2004年论文实现的多目标粒子群优化算法(MOPSO)。文章详细阐述了算法流程,包括初始化、适应度评估、存档处理、速度和位置更新等步骤,并探讨了外部存档和网格的实现策略。作者通过调整参数如c1和c2,尝试优化ZDT1函数,分析了参数对结果的影响。尽管存在一些问题和待改进之处,如变异算子未实现和选择压力的调整,该文仍为理解MOPSO提供了实践参考。
摘要由CSDN通过智能技术生成

参考:
https://blog.csdn.net/m0_38097087/article/details/79818348
http://yarpiz.com/59/ypea121-mopso
Coello C A C , Pulido G T , Lechuga M S . Handling multiple objectives with particle swarm optimization[J]. IEEE Transactions on Evolutionary Computation, 2004, 8(3):256-279.。

是按照上面的第三个的那篇论文实习实现的
论文里面的速度更新公式没有用到惯性c,好像是因为他有个变异算子(还没实现)。

算法流程
  1. 初始化群体粒子群的位置和速度,计算适应值
  2. 评价粒子的适应度和Pareto支配关系
  3. 将非劣解保存到Archive中去
  4. 计算Archive集中的拥挤度,为粒子选择gbest
  5. 更新粒子的速度、位置、适应度、pbest
  6. 更新Archive
  7. 满足结束条件,则结束;否则,转到第4步继续循环。
import numpy as np
class Partical:
    #每次都是对一个粒子进行操作
    def __init__(self,x_min,x_max,max_v,min_v,fitness):
        self.dim=len(x_min) #获得变量数
        self.max_v=max_v
        self.min_v=min_v
        self.x_min=x_min
        self.x_max=x_max
        
        self.dominated=False #表示是否被支配
        
        self.pos=np.zeros(self.dim)
        self.pbest=np.zeros(self.dim)
        self.initPos(x_min,x_max)#初始化粒子坐标&pbest
        
        self._v=np.zeros(self.dim)

        self.fitness=fitness
        self.cur_fitness=fitness(self.pos)#当前的适应度
        self.bestFitness=fitness(self.pos)#初始化pbest
        
    def _updateFit(self):
        if isDominates(np.array(self.cur_fitness),np.array(self.bestFitness)):
            self.bestFitness=self.cur_fitness
            self.pbest=self.pos
        elif isDominates(np.array(self.bestFitness),np.array(self.cur_fitness)):
            pass
        else:
            #互不支配随机选择一个
            if np.random.random()<0.5:
                self.bestFitness=self.cur_fitness
                self.pbest=self.pos
    
    def _updatePos(self):
        self.pos=self.pos+self._v
        for i in range(self.dim):
            self.pos[i]=min(self.pos[i],self.x_max[i])
            self.pos[i]=max(self.pos[i],self.x_min[i])
            
    def _updateV(self,w,c1,c2,gbest):
        '''这里进行的都是数组的运算'''
        self._v=w*self._v+c1*np.random.random()*(self.pbest-self.pos)+c2*np.random.random()*(gbest-self.pos)
        for i in range(self.dim):
            self._v[i]=min(self._v[i],self.max_v[i])
            self._v[i]=max
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值