用python语言改写《Matlab智能算法30个案例分析》第13个案例——粒子群算法的寻优算法

记录自己的python和智能算法学习之路。

class PSO:
    '''简易粒子群算法'''

    def __init__(self,c1,c2,maxgen,sizepop,popmax,popmin,Vmax,Vmin):
        '''
        遗传算法相关参数设定
        c1,c2:速度更新参数
        maxgen:迭代次数
        sizepop:种群规模
        popmax,popmin:个体大小
        Vmax,Vmin:个体速度约束
        '''
        self.c1=c1
        self.c2=c2
        self.maxgen=maxgen
        self.sizepop=sizepop
        self.popmax=popmax
        self.popmin=popmin
        self.Vmax=Vmax
        self.Vmin=Vmin
        self.result=[None]*maxgen
        self.pop=[None]*self.sizepop
        self.V=[None]*self.sizepop
        self.fitness=[None]*self.sizepop
        
    def init_pop(self):
        '''种群初始化'''
        from random import uniform
        import math

        # 随机产生一个种群
        for i in range(0,self.sizepop):

            # 初始化粒子
            self.pop[i]=[2*uniform(-1,1),2*uniform(-1,1)]
            
            # 初始化速度
            self.V[i]=[0.5*uniform(-1,1),0.5*uniform(-1,1)]
            
            # 计算粒子适应度
            self.fitness[i]=self.fun(self.pop[i])
         
    def fun(self,partical):
        '''计算种群适应度'''
        from math import sin,cos,sqrt,exp,pi
        x1=partical[0]
        x2=partical[1]
        y=sin(sqrt(x1**2+x2**2))/sqrt(x1**2+x2**2)+exp(1/2*(cos(2*pi*x1)+cos(2*pi*x2)))-2.71289
        return y

    def init_extremum(self):
        '''寻找初始极值'''
        bestfitness=max(self.fitness)
        bestindex=self.fitness.index(bestfitness)
        # 群体极值的位置
        self.zbest=self.pop[bestindex][:]
        # 个体极值的位置,用切片操作来复制一个列表
        self.gbest=self.pop[:]
        # 个体极值适应度值
        self.fitnessgbest=self.fitness[:]
        # 群体极值适应度值
        self.fitnesszbest=bestfitness

    def iteration_optimizition(self):
        '''迭代寻优'''
        import random
        for i in range(0,self.maxgen):
            # 粒子位置和速度更新
            for j in range(0,self.sizepop):

                
                r1=random.random()
                r2=random.random()
                for k in range(0,len(self.V[j])):
                    # 速度更新
                    self.V[j][k]=self.V[j][k]+self.c1*r1*(self.gbest[j][k]-self.pop[j][k])+self.c2*r2*(self.zbest[k]-self.pop[j][k])
                    if self.V[j][k]>self.Vmax:
                        self.V[j][k]=self.Vmax
                    elif self.V[j][k]<self.Vmin:
                        self.V[j][k]=self.Vmin

                    # 粒子位置更新
                    self.pop[j][k]=self.pop[j][k]+0.5*self.V[j][k]                 
                    if self.pop[j][k]>self.popmax:
                        self.pop[j][k]=self.popmax
                    elif self.pop[j][k]<self.popmin:
                        self.pop[j][k]=self.popmin

                # 新粒子适应度
                self.fitness[j]=self.fun(self.pop[j])

            # 个体极值和群体极值更新
            for j in range(0,self.sizepop):

                # 个体极值更新
                if self.fitness[j]>self.fitnessgbest[j]:
                    self.gbest[j]=self.pop[j]
                    self.fitnessgbest[j]=self.fitness[j]

                # 群体极值更新
                if self.fitness[j]>self.fitnesszbest:
                    self.zbest=self.pop[j][:]
                    self.fitnesszbest=self.fitness[j]

            # 每代最优值记录到result数组中
            self.result[i]=self.fitnesszbest


import matplotlib.pyplot as plt                
myPSO=PSO(1.49445,1.49445,300,20,2,-2,0.5,-0.5)
myPSO.init_pop()
myPSO.init_extremum()
myPSO.iteration_optimizition()
print("极值",myPSO.result[299],"极值点",myPSO.zbest)
plt.plot(myPSO.result)
plt.show()

算法并不能总是寻找到极值点附近,偶尔会陷入局部最优。

好好学习,天天向上

1 基于遗传算法的TSP算法(王辉) TSP (旅行商问题—Traveling Salesman Problem),是典型的NP完全问题,即其最坏情况下的时间复杂性随着问题规模的增大按指数方式增长,到目前为止不能找到一个多项式时间的有效算法。遗传算法是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。遗传算法的做法是把问题参数编码为染色体,再利用迭代的方式进行选择、交叉以 及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。实践证明,遗传算法对于解决TSP问题等组合优化问题具有较好的寻优性能。 2 基于遗传算法和非线性规划的函数寻优算法(史峰) 遗传算法提供了求解非线性规划的通用框架,它不依赖于问题的具体领域。遗传算法的优点是将问题参数编码成染色体后进行优化, 而不针对参数本身, 从而不受函数约束条件的限制; 搜索过程从问题解的一个集合开始, 而不是单个个体, 具有隐含并行搜索特性, 可大大减少陷入局部最小的可能性。而且优化计算时算法不依赖于梯度信息,且不要求目标函数连续及可导,使其适于求解传统搜索方法难以解决的大规模、非线性组合优化问题。 3 基于遗传算法的BP神经网络优化算法(王辉) BP模型被广泛地应用于模式分类、模式识别等方面.但BP算法收敛速度慢,且很容易陷入局部极小点,而遗传算法具有并行搜索、效率高、不存在局部收敛问题等优点而被广泛应用.遗传算法寻优过程带有一定程度的随机性和盲从性,多数情况下只能收敛到全局次优解,且有过早收敛的现象.为了克服遗传算法寻优过程的盲从性,将有监督学习的BP算法与之结合以达到优势互补、提高算法的稳定性和全局搜索能力的目的。 4 设菲尔德大学的MATLAB遗传算法工具箱(王辉) Matlab 遗传算法(Genetic Algorithm)优化工具箱是基于基本操作及终止条件、二进制和十进制相互转换等操作的综合函数库。其实现步骤包括:通过输入及输出函数求出遗传算法主函数、初始种群的生成函数,采用选择、交叉、变异操作求得基本遗传操作函数。以函数仿真为例,对该函数优化和GA 改进,只需改写函数m 文件形式即可......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值