闪电连接算法之Python实现

news2025/8/9 2:26:51

文章目录

    • 简介
    • 原理
    • Python实现

简介

LAPO,即闪电连接优化(Lightning Attachment Procedure Optimization),听名字就知道是受到了闪电的刺激,而获得灵感的一种算法。

为了走进LAPO的内心,于是上网搜了一下闪电的图片

在这里插入图片描述

呃不好意思,是下面这个

在这里插入图片描述

发现闪电连接无非是分岔而已,而且这个岔如果非常厚实,那么会继续分叉,否则就会迅速消失。

接下来可以思考,这个岔何以非常强壮?那肯定是这个位置比较适合分岔,在对的地方分岔了,闪电就会继续分岔,否则就面临着消失。

至此,闪电过程被抽象为分支的出现和消失。

原理

初始化

x i = rand ⁡ ( x L , x R ) x^i = \operatorname{rand}(x_L, x_R) xi=rand(xL,xR)

x L , x R x_L, x_R xL,xR表示随机数的生成范围。

根据目标函数,可以得到 x i x^i xi的适应度

f i = f ( x i ) f^i = f(x^i) fi=f(xi)

下一跳

对于第 i i i个闪电点,周围有很多个可以分岔的位置,其第 j j j个位置记作 x j i x^i_j xji,计算所有可能位置的平均值,及其适应度

计算所有点的平均值,及其平均值的适应度

x ˉ i = 1 N ∑ j N x j i , f ˉ i = f ( x ˉ i ) \bar x^i=\frac{1}{N}\sum_j^Nx_j^i, \bar f^i=f(\bar x^i) xˉi=N1jNxji,fˉi=f(xˉi)

如果 f j i f^i_j fji优于 f ˉ i \bar f^i fˉi,则闪电向这边移动,否则闪电向另一侧移动

x i ∗ = { x j i + ( x ˉ i + x j i ⋅ rand ⁡ ) ⋅ rand ⁡ f j i < f ˉ i x j i − ( x ˉ i + x j i ⋅ rand ⁡ ) ⋅ rand ⁡ f j i ⩾ f ˉ i x^{i*}=\left\{\begin{aligned} x^i_j+(\bar x^i + x^i_j\cdot\operatorname{rand})\cdot\operatorname{rand}\quad f^i_j<\bar f^i\\ x^i_j-(\bar x^i + x^i_j\cdot\operatorname{rand})\cdot\operatorname{rand}\quad f^i_j\geqslant\bar f^i\\ \end{aligned}\right. xi={xji+(xˉi+xjirand)randfji<fˉixji(xˉi+xjirand)randfjifˉi

分支消失

如果 x i ∗ x^{i*} xi的适应度比 x i x^{i} xi要好,那么就这个新点就保留,否则就任其消失。

地面接收

一般来说闪电肯定是要打在避雷针上的,最优解就相当于是避雷针。随着迭代的不断加深,即闪电不断第分岔,也就更加接近避雷针所在的位置。

在LAPO里,通过迭代次数来创建一个概率因子S,其表达式为

S = 1 − t t M exp ⁡ − t t M S=1-\frac{t}{t_M}\exp-\frac{t}{t_M} S=1tMtexptMt

随着迭代次数增加, S S S的值不断减小,意味着分支点的抖动逐渐降低,其作用在分支上的方式如下

x i ∗ = x i ∗ + rand ⁡ ⋅ S ⋅ ( x m − x M ) x^{i*}=x^{i*}+\operatorname{rand}\cdot S\cdot(x_m-x_M) xi=xi+randS(xmxM)

其中, x m x_m xm x M x_M xM为最优和最差情况下的位置。

Python实现

由于LAPO算法不需要保留上一代闪电点,而且闪电点之间也没有什么关联,所以实现起来比较简单。

首先实现闪电的分支迭代过程

import numpy as np
rand = np.random.rand
# x为当前迭代点;func为迭代函数;N为预选分支点数目
# S为尖端放电系数
def branch(x, func, N, S):
    fit = func(x)   #x的适应度
    # 预选点
    stars = [x+rand(*x.shape) for _ in range(N)]
    # 所有预选点的适应度
    starFits = [func(star) for star in stars]
    xBar = np.mean(stars, axis=0)
    fBar = np.mean(starFits)
    xs = []
    for i in range(N):
        sign = 1 if starFits[i] < fBar else -1
        xs.append(x+sign*(xBar+stars[i]*rand())*rand())
    # 上面已经给出了所有可能的分支
    xs = np.array(xs)
    fits = np.array([func(xi) for xi in xs])
    ind = np.where(fits<fit)[0]
    if len(ind)==0:
        return [x]
    xs,fits = xs[ind], fits[ind]
    # 如果没有更好的结果,就保留现有结果
    S = S*(xs[np.argmin(fits)] - xs[np.argmax(fits)])
    return [x+rand()*S for x in xs]

然后实现主函数

from itertools import chain
# nInit为初始化点个数,nDim为数据维度,nBranch为分支点个数
# nIter为迭代次数
def lapo(nInit, nDim, nBranch, nIter, func):
    # xs为点集
    xs = [rand(nDim) for _ in range(nInit)]
    for i in range(nIter):
        # 尖端放电系数
        S = 1 - (i/nIter)*np.exp(-i/nIter)
        xs = [branch(x, func, nBranch, S) for x in xs]
        xs = list(chain(*xs))
    fits = [func(x) for x in xs]
    msg = f"得到{len(xs)}组结果,其中最佳适应度为{np.min(fits)},"
    msg += "xs=" + ", ".join([f"{xi}" for xi in xs[np.argmin(fits)]])
    print(msg) 

最后,找个函数测试一下,测试函数为

f ( x ⃗ ) = ∑ i = 0 cos ⁡ ( i x i 5 ) ∗ ( i + 1 ) f(\vec x)=\sum_{i=0}\cos(\frac{ix_i}{5})*(i+1) f(x )=i=0cos(5ixi)(i+1)

def test(xs):
    _sum = 0.0
    for i in range(len(xs)):
        _sum = _sum + np.cos((xs[i]*i)/5)*(i+1)
    return _sum

if __name__ == "__main__":
    lapo(10, 5, 3, 20, test)

效果为

>python lapo.py
得到1093组结果,其中最佳适应度为-12.570095759883985,xs=-11.260084641709877, -13.431104443084656, -7.471806128776576, -16.196185355184905, -11.894803311699398

当然,这个程序有一个bug,当新种群中没有更优情况的时候,上一代计算结果会被保存,随着迭代次数越来越多,非常容易内存爆炸,看来是要对每一代种群进行以此筛选才行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页设计期末作业,基于HTML+CSS+JavaScript超酷超炫的汽车类企业网站(6页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

商用短链平台_第8章_ 账号微服务注册模块+短信验证码+阿里云OSS开发实战

商用短链平台_第8章_ 账号微服务注册模块短信验证码阿里云OSS开发实战 文章目录商用短链平台_第8章_ 账号微服务注册模块短信验证码阿里云OSS开发实战第八章 账号微服务注册模块短信验证码阿里云OSS开发实战第1集 账号微服务注册功能和流程介绍第2集 第三方短信验证码平台接入申…

1802907-97-6|Alkyne PEG5 甲基四嗪|炔基点击试剂

【中文名称】甲基四嗪-五聚乙二醇-炔&#xff0c;甲氨基-五聚乙二醇-炔基 【英文名称】 Methyltetrazine-PEG5-alkyne&#xff0c;Alkyne PEG5 Methyltetrazine 【结 构 式】 【CAS号】1802907-97-6 【分子式】C20H26N4O5 【分子量】402.45 【基团】炔基基团 【纯度】95% 【规…

数据分析案例-大数据相关招聘岗位可视化分析

数据集介绍 本次数据集来源于xx招聘网共计4223条招聘信息&#xff0c;每条招聘信息字段包括岗位名称、公司名称、工作经验要求、学历要求、工作地点、薪酬、公司规模、发布时间、公司福利共9条字段信息。 数据预处理 首先导入本次数据集&#xff0c; import pandas as pd da…

使用Cent Browser+Aria2+Bilibili Envolved下载b站视频--保姆级安装步骤

1 使用前准备 Cent Browser百分浏览器下载&#xff1a;https://www.centbrowser.cn/加强版谷歌浏览器&#xff0c;chrome内核。 Tempermonkey&#xff1a;https://chrome.zzzmh.cn/info/dhdgffkkebhmkfjojejmpbldmpobfkfo Aria2&#xff1a;https://github.com/aria2/aria2/re…

外汇天眼:多位支持加息放缓!美元走弱黄金上涨

黄金小时图 黄金方面&#xff1a; 周三&#xff08;11月23日&#xff09;晚间&#xff0c;黄金短线下挫至1728美元之后快速收回。 美联储11月的会议纪要显示&#xff0c;尽管通胀前景风险上行&#xff0c;但大多数的与会者认为尽早放缓加息是合适的&#xff0c;利率正在接近足…

哪些岗位需要考CDMP/CDGA/CDGP证书?

大数据时代&#xff0c;数据成为社会和组织的宝贵资产&#xff0c;像工业时代的石油和电力一样驱动万物。假如数据的真实性、可用性大打折扣&#xff0c;那么数据的价值将会大大折扣&#xff0c;甚至根本不可用&#xff0c;不敢用。因此&#xff0c;数据治理是大数据时代我们用…

把报文再扔回内核,DPDK这样做

在DPDK中经常看到一个词&#xff0c;exception path&#xff0c;它是什么&#xff1f; 在DPDK使用环境中&#xff0c;物理网卡收到的报文不再进入内核协议栈&#xff0c;而是直接到达DPDK应用。但是在有些场景中&#xff0c;用户希望把报文&#xff08;如控制报文&#xff09;…

iTOP3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板

主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错&#xff08;配置可选&#xff09; 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm CPU: 龙芯四核3A5000处理器 主频: 2.3GHz-2.5GHz 桥片…

101个CV模型集体开源,魔搭社区视觉AI深度解析

作者&#xff1a;谢宣松 达摩院开放视觉智能团队 11月3日&#xff0c;在2022云栖大会上&#xff0c;阿里达摩院联手 CCF 开源发展委员会共同推出了 AI 模型社区“魔搭”ModelScope&#xff0c;旨在降低 AI 的应用门槛。 AI 模型较为复杂&#xff0c;尤其是要应用于行业场景&…

前后端分离项目,vue+uni-app+php+mysql在线考试系统设计与实现(H5移动项目)

功能介绍 用户首次登陆系统需要注册一个用户或直接使用微信作为账号&#xff0c;用户在登录平台后&#xff0c;可以进行平台的操作。主要模块包括以下几点&#xff1a; 注册登录功能&#xff1a;注册普通账号登录&#xff1b;也可以直接使用微信登录&#xff1b;登录后可以修改…

python学习——numpy库的使用[超详细的学习笔记]

目录 前言 1 导入及查看版本信息 2 数组的创建 2.1 基础数据类型转换为数组 2.2 数组内置方法 2.2.1 np.arange() 线性序列数组 2.2.2 np.linspace() 等差数组 2.2.3 np.logspace() 等比数组 2.2.4 np.zeros() 全零的数组 2.2.5 np.ons() 全一的数组 float型 2.2.6 np.zeros_…

浅谈数商云供应链协同系统物流管理功能在医疗器械行业的作用

近年来&#xff0c;我国医疗器械行业发展快速&#xff0c;但医疗器械物流作为医疗器械供应链中承上启下的重要环节&#xff0c;目前仍处于相对传统和粗放的发展阶段。随着国家经济的发展及人民对医疗健康需求的不断增加&#xff0c;医疗器械供应链与物流的升级已是大势所趋。 …

程序员在平台兼职接单,月入30K,方法我全写出来了!(附接单渠道和注意事项)

本月兼职的收入又到账了&#xff0c;程序员副业实在是太香了&#xff01; 虽然这点小钱还远远达不到财富自由&#xff0c;也比不上那些真正的大佬&#xff0c;但在这个行业寒冬里&#xff0c;能有一笔相对稳定的收入&#xff0c;作为全职之外的补充&#xff0c;还是让人倍感踏实…

海棉结构sponge construction

海棉结构&#xff0c;或称海绵哈希&#xff0c;是当前密码学中一种重要构造结构&#xff0c;如当前sha-3采用的即是海绵结构。 海绵结构是一类具有有限内部状态的算法&#xff0c;可以将任意有限长的输入消息变成任意长度输出的消息摘要&#xff0c;其结构如下&#xff0c;其中…

docker-network网络

docker network网桥 作用&#xff1a;实现主机和容器之间可以通过网桥相互通信。 定义 正常不指定网络的情况下。所有的应用都跑在一个网桥上,影响其他应用的交互、网络传输。一般都是一个应用使用一个网桥&#xff0c;容器之间互通&#xff0c;则进行容器间通信的配置&…

粉丝提问:26想转行做Python开发,是不是已经晚了?

前言 26岁基本上是一个硕士研究生刚毕业的年纪&#xff0c;相当于本科毕业工作了2年&#xff0c;总体来说时间耽误的并不算太多&#xff0c;想转行做Python开发&#xff0c;不算太晚&#xff01; &#xff08;文末送读者福利&#xff09; 1、转行前先想清楚这5点&#xff01…

【vue.js】使用高德地图选择省市区后,再点击确认当前选择的位置

成品展示 前期准备 先去高德开放平台申请一个web端的key。 2022年后申请的key&#xff0c;必须和它生成的secret一起使用。 可使用服务选择web端 在vue项目中&#xff0c;可以通过直接引入js文件&#xff0c;也可以安装vue-amap等插件使用。 使用 安装官方的js API 插件 …

数据治理系列:数仓建模之数仓主题与主题域

背景&#xff1a; 数据仓库之父 Bill Inmon 将数据仓库描述为一个面向主题的、集成的、稳定的、反应历史变化的数据集合&#xff0c;用于支持管理者的决策过程。 从上面的引言里面&#xff0c;我们其实可以知道主题在数仓建设里面绝对是很重要的一环&#xff0c;这的确是的。…

警惕,11月这6本期刊已被剔除SCI/SSCI

2022年11月22日晚&#xff0c;科睿唯安更新了Web of Science核心期刊目录&#xff0c;SCIE/SSCI期刊数据库剔除(Dropped)或停止检索(Ceased)了6本期刊&#xff0c;被剔除的6本期刊中&#xff0c;有4本期刊是信息更改&#xff0c;其中1本期刊更改了名称和ISSN号&#xff0c;2本期…