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


相关推荐

  • 关于offsetParent

    关于offsetParent元素的 offsetParent 可能值 null body 元素 该元素的某个父级定位元素 为 null 的情况 1 body 元素 2 元素的 display 为 none 3 元素尚未添加到 DOM 4 元素的 position 为 fixed 为 body 元素的情况 该元素不是任何一个定位元素的后代 也不是 null 为某个父级定位元素的情况 如果此元素

    2026年3月17日
    3
  • redis和couchbase的比较

    redis和couchbase的比较

    2022年2月19日
    41
  • 视觉SLAM十四讲习题答案

    视觉SLAM十四讲习题答案阅读 视觉 SLAM 十四讲 中遇到的问题及习题资源整理 或为原创 或来自网络 如有问题请与我联系 会在第一时间加以修正 后来自己写完看到另一位写的博客 相形见绌 大家可以互相结合的看 第一讲 1 线性方程的解 转载自宋洋鹏 youngpan1101 了解线性代数可关注 B 站 3Blue1Brown 以及线性代数 知乎上有其精细笔记 2 高斯分布参考这位博主 Johnny Cuii 的文章 具体

    2026年3月19日
    2
  • 源码分析ElasticJob分片机制(带分片机制流程图)

    源码分析ElasticJob分片机制(带分片机制流程图)本文将重点分析ElasticJob的分片机制:ElasticJob分片工作机制:1、ElasticJob在启动时,首先会启动是否需要重新分片的监听器。代码见:ListenerManager#startAllListeners{…;shardingListenerManager.start();…}。2、任务执行之前需要获取分片信息,如果需要重新分片,主服务器执行分片算法,其他从…

    2025年7月3日
    5
  • Linux lamp_lamp搭建和配置

    Linux lamp_lamp搭建和配置LAMP架构LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(或Perl、Python)网页编码。在构建LAMP平台时,各组件的安装顺序依次为Linux、Apache、MySQL、PHP。其中…

    2022年10月17日
    4
  • Apifox(1)比postman更优秀的接口自动化测试平台[通俗易懂]

    Apifox(1)比postman更优秀的接口自动化测试平台[通俗易懂]Apifox介绍Apifox是API文档、API调试、APIMock、API自动化测试一体化协作平台,定位Postman+Swagger+Mock+JMeter。通过一套系

    2022年8月7日
    6

发表回复

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

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