python粒子群算法的实现「建议收藏」

python粒子群算法的实现「建议收藏」参考博客:http://blog.csdn.net/zuochao_2013/article/details/53431767?ref=myreadhttp://blog.csdn.net/chen_jp/article/details/7947059算法介绍粒子群算法(particleswarmoptimization,PSO)由Kennedy和Eberhart在1995年…

大家好,又见面了,我是你们的朋友全栈君。

参考博客:

http://blog.csdn.net/zuochao_2013/article/details/53431767?ref=myread

http://blog.csdn.net/chen_jp/article/details/7947059

算法介绍

 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法对于Hepper的模拟鸟群(鱼群)的模型进行修正,以使粒子能够飞向解空间,并在最好解处降落,从而得到了粒子群优化算法。同遗传算法类似,也是一种基于群体叠代的,但并没有遗传算法用的交叉以及变异,而是粒子在解空间追随最优的粒子进行搜索

 PSO的优势在于简单,容易实现,无需梯度信息,参数少,特别是其天然的实数编码特点特别适合于处理实优化问题。同时又有深刻的智能背景,既适合科学研究,又特别适合工程应用。
 设想这样一个场景:一群鸟在随机的搜索食物。在这个区域里只有一块食物,所有的鸟都不知道食物在哪。但是它们知道自己当前的位置距离食物还有多远。那么找到食物的最优策略是什么?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

算法流程

参数定义每个寻优的问题解都被想像成一只鸟,称为“粒子”。所有粒子都在一个d维空间进行搜索。所有的粒子都由一个fitness-function确定适应值以判断目前的位置好坏。每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置。每一个粒子还有一个速度以决定飞行

的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。

 

在d维空间中,有m个粒子,在某一时刻时,

粒子i的位置为:

python粒子群算法的实现「建议收藏」

粒子i的速度为:

python粒子群算法的实现「建议收藏」

粒子i经过的历史最好位置:

python粒子群算法的实现「建议收藏」

种群所经过的历史最好位置:

python粒子群算法的实现「建议收藏」

PSO的关系公式

鸟在捕食的过程中会根据自己的经验以及鸟群中的其他鸟的位置决定自己的速度,根据当前的位置和速度,可以得到下一刻的位置,这样每只鸟通过向自己和鸟群学习不断的更新自己的速度位置,最终找到食物,或者离食物足够近的点。

 

t时刻到t+1时刻的速度:

python粒子群算法的实现「建议收藏」

下一时刻位置:

python粒子群算法的实现「建议收藏」

python粒子群算法的实现「建议收藏」

 

python粒子群算法的实现「建议收藏」

 

以求解函数最小值为例:

python粒子群算法的实现「建议收藏」

种群产生:随机产生处在[-10, 10]范围内的随机点,速度初始的为[0,1]

 在本例中,适应度就是函数值,适应度越小越好。在粒子群算法中,适应度不一定要越大越好,而是确定适应度的好坏,只需要根据是适应度好坏确定最佳位置。

 在迭代过程中,会有粒子跑出范围,在这种情况下,一般不强行将粒子重新拉回到初始化解空间。因为即使粒子跑出空间,随着迭代的进行,如果在初始化空间内有更好的解存在,那么粒子也可以自行返回到初始化空间。研究表明,即使将初始化空间不设为问题的约束空间,粒子也可能找到最优解

 

import numpy as np
import matplotlib.pyplot as plt


class PSO(object):
    def __init__(self, population_size, max_steps):
        self.w = 0.6  # 惯性权重
        self.c1 = self.c2 = 2
        self.population_size = population_size  # 粒子群数量
        self.dim = 2  # 搜索空间的维度
        self.max_steps = max_steps  # 迭代次数
        self.x_bound = [-10, 10]  # 解空间范围
        self.x = np.random.uniform(self.x_bound[0], self.x_bound[1],
                                   (self.population_size, self.dim))  # 初始化粒子群位置
        self.v = np.random.rand(self.population_size, self.dim)  # 初始化粒子群速度
        fitness = self.calculate_fitness(self.x)
        self.p = self.x  # 个体的最佳位置
        self.pg = self.x[np.argmin(fitness)]  # 全局最佳位置
        self.individual_best_fitness = fitness  # 个体的最优适应度
        self.global_best_fitness = np.min(fitness)  # 全局最佳适应度

    def calculate_fitness(self, x):
        return np.sum(np.square(x), axis=1)

    def evolve(self):
        fig = plt.figure()
        for step in range(self.max_steps):
            r1 = np.random.rand(self.population_size, self.dim)
            r2 = np.random.rand(self.population_size, self.dim)
            # 更新速度和权重
            self.v = self.w*self.v+self.c1*r1*(self.p-self.x)+self.c2*r2*(self.pg-self.x)
            self.x = self.v + self.x
            plt.clf()
            plt.scatter(self.x[:, 0], self.x[:, 1], s=30, color='k')
            plt.xlim(self.x_bound[0], self.x_bound[1])
            plt.ylim(self.x_bound[0], self.x_bound[1])
            plt.pause(0.01)
            fitness = self.calculate_fitness(self.x)
            # 需要更新的个体
            update_id = np.greater(self.individual_best_fitness, fitness)
            self.p[update_id] = self.x[update_id]
            self.individual_best_fitness[update_id] = fitness[update_id]
            # 新一代出现了更小的fitness,所以更新全局最优fitness和位置
            if np.min(fitness) < self.global_best_fitness:
                self.pg = self.x[np.argmin(fitness)]
                self.global_best_fitness = np.min(fitness)
            print('best fitness: %.5f, mean fitness: %.5f' % (self.global_best_fitness, np.mean(fitness)))


pso = PSO(100, 100)
pso.evolve()
plt.show()

python粒子群算法的实现「建议收藏」

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140989.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月8日 下午11:00
下一篇 2022年5月8日 下午11:20


相关推荐

  • Java中violate关键字详解(2)?真正了解violate

    Java中violate关键字详解(2)?真正了解violate一、Java内存模型想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的。Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内

    2022年7月8日
    39
  • FastJSON解析Json字符串(反序列化为List、Map)

    FastJSON解析Json字符串(反序列化为List、Map)文章目录配置 maven 依赖数据准备 JSON 格式字符串转 Java 对象 DO amp DTOSelfJSONU 测试 amp 调用注意的点 FastjsonAPI 在日常开发与数据库打交道的时候 常有以 Json 格式的字符串存储到数据库的情况 当在 Java 程序中获取到对应的 Json 格式的 String 字符串后 如何才能转换为我们想要的数据格式 比如转换成 Java 中的自定义类等 就需要做出对 Json 数据解析的 而我最近写的接口就遇到了这样的需求 我借助阿里的 Fastjsonapi 实现 json 转化为 JavaP

    2026年3月16日
    2
  • MATLAB求解线性规划(含整数规划和0-1规划)问题[通俗易懂]

    MATLAB求解线性规划(含整数规划和0-1规划)问题[通俗易懂]线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如:对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题。最著名,同时也是最强大的数学最优化软件是LINGO/LINDO软件包,它能够求解多种的数学规划问题,同时还提供了多

    2022年7月27日
    16
  • jar和war的区别

    jar和war的区别Jar、war在文件结构上,二者并没有什么不同,它们都采用zip或jar档案文件压缩格式。但是它们的使用目的有所区别:jar1.Jar文件(扩展名为.Jar,JavaApplicationArchive)包含Java类的普通库、资源(resources)、辅助文件(auxiliaryfiles)等。2.jar包是java打的包,一般只是包括一些编译后class文件和一些部署文件,在声…

    2022年5月24日
    44
  • CAN总线传输协议[通俗易懂]

    CAN总线传输协议[通俗易懂]一、控制器局域网总线(CAN,ControllerAreaNetwork)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线、同轴电缆或光纤来传输信号,因其高性能、高可靠性和高实时性等特点,已经成为了世界上应用最广泛的现场总线之一。公元1991年,CAN总线技术规范(CANVersion2.0)制定并发布,该技术规范共包括A和B两部分,称为CAN2.0A和CAN2.0B。其中CAN2.0…

    2022年6月28日
    39
  • RISC-V架构

    RISC-V架构RISC V 发音为 risk five 是一个基于精简指令集 RISC 原则的开源指令集架构 ISA

    2026年3月7日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号