闪电连接算法之Python实现

news/2024/4/29 14:00:30/文章来源:https://blog.csdn.net/m0_37816922/article/details/128014419

文章目录

    • 简介
    • 原理
    • Python实现

简介

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

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

在这里插入图片描述

呃不好意思,是下面这个

在这里插入图片描述

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

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

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

原理

初始化

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

xL,xRx_L, x_RxL,xR表示随机数的生成范围。

根据目标函数,可以得到xix^ixi的适应度

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

下一跳

对于第iii个闪电点,周围有很多个可以分岔的位置,其第jjj个位置记作xjix^i_jxji,计算所有可能位置的平均值,及其适应度

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

xˉi=1N∑jNxji,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)

如果fjif^i_jfji优于fˉi\bar f^ifˉi,则闪电向这边移动,否则闪电向另一侧移动

xi∗={xji+(xˉi+xji⋅rand⁡)⋅rand⁡fji<fˉixji−(xˉi+xji⋅rand⁡)⋅rand⁡fji⩾fˉix^{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

分支消失

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

地面接收

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

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

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

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

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

其中,xmx_mxmxMx_MxM为最优和最差情况下的位置。

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 -1xs.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=0cos⁡(ixi5)∗(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.0for i in range(len(xs)):_sum = _sum + np.cos((xs[i]*i)/5)*(i+1)return _sumif __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.luyixian.cn/news_show_225372.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eigen Segmentation fault (core dumped)

不会GDB吃大亏问题描述&#xff1a;解法&#xff1a;写在前面的话&#xff1a;我是PCL新手。也是Cmake新手。Eigen有点折腾人。 问题描述&#xff1a; 在调用PCL库实现一些有趣的功能&#xff0c;考虑到考虑到兼容不同平台&#xff0c;现状如下&#xff1a; VS2015&#xff1…

【新知实验室】腾讯云TRTC初体验

一、前言 今年腾讯云音视频发布了“三合一”的RT-ONE™网络。该网络整合了腾讯云实时通信网络&#xff08;TRTC&#xff09;、即时通信网络&#xff08;IM&#xff09;以及流媒体分发网络&#xff08;CDN&#xff09;三张网络&#xff0c;为业界最完整的音视频通信PaaS平台构建…

Pr 时间重映射卡点

哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何通过用Pr时间重映射做出卡点的效果~ 卡点音乐 一首适合卡点&#xff08;群青为例&#xff09;的音乐可以帮助我们更好的掌握视频的节奏&#xff0c;卡点可以采用手动卡点&#xff0c;方法可以通过在峰值最高处标…

使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)

经过几位下载同学的反应、大部分运行未成功的原因有以下几点、特此记录以下。代码是完全没有问题的 项目地址&#xff1a;https://download.csdn.net/download/weixin_43304253/85811914 代码运行环境&#xff1a; tomcat&#xff1a;8 IDEA&#xff1a;2020 JDK&#xff1a;1…

Handler 原理

线程的应用场景 Android是单线程模型&#xff0c;Activity、Service、Broadcast等组件的创建&#xff0c;都是在主线程完成的&#xff0c;即UI线程。但如果需要执行一些耗时的操作时&#xff0c;比如&#xff1a;I/O的读写、大文件的读写、数据库操作以及网络上传和下载等操作都…

关于数据治理工具的选型,你了解多少?

数据治理的本质是盘点数据资产、治理数据质量&#xff0c;实施数据全生命周期的管理&#xff0c;这里面包括了建组织、立制度或者使用一款数据治理的软件帮助企业开展数据治理的相关工作等等。根据不同的数据治理项目特点&#xff0c;会用到不同的技术或工具。拥有一套趁手好用…

pdf生成:puppeteer

一、Puppeteer Puppeteer是Google Chrome团队出品的一款无界面Chrome工具&#xff0c;它提供了丰富的API&#xff0c;让开发者像鼠标一样控制浏览器的各种行为。Puppeteer是一个Node库&#xff0c;提供发了一个高级API来通过DevTools协议控制Chromium或Chrome。Puppeteer默认以…

LVGL学习笔记

芯片启动到LVGL初始化完成大体流程如下: 界面增加打印后代码如下: static void drag_event_handler(lv_event_t * e) {lv_obj_t * obj lv_event_get_target(e);lv_indev_t * indev lv_indev_get_act();if(indev NULL) return;lv_point_t vect;lv_indev_get_vect(indev, …

scala语法(一)(有java基础速学)

在拥有java基础上学习scala&#xff0c;注意以下几点 1. 变量声明 var | val 变量名 [: 变量类型] 变量值 val name: String "nico" 声明变量时&#xff0c;类型可以省略&#xff08;就是叫 类型推断&#xff09; val name "nico"类型确定后&#xff…

【面试题】JS基础-异步

1. 异步 1.1 为什么要异步&#xff1f; JS是单线程语言&#xff0c;只能同时做一件事。JS和DOM渲染共用同一个线程&#xff0c;因为JS可修改DOM结构。当遇到等待的情况时&#xff0c;例如网络请求、定时任务&#xff0c;程序不能卡住。所以需要异步来解决JS单线程等待的问题&…

Git -- submoudule子模块使用

文章目录子模块的作用添加子模块拉取带子模块的项目修改子模块代码子模块的作用 通常情况下&#xff0c;我们做项目时会有几个业务功能区分比较明确的模块&#xff0c;比如简单来说&#xff0c;一个项目我们可以分为认证授权模块、工具类模块、常规业务模块。 而像认证…

【Redis技术探索】「高可用架构模式」哨兵(sentinel)模式实现主从故障互切换模式详解

哨兵&#xff08;sentinel&#xff09;模式实现主从故障互切换模式详解Redis的多种模式Redis单机模式Redis单机模式的优点Redis单机模式的缺点Redis主从复制旧版本配置新版本配置查看主节点信息主从模式的优点主从复制的弊端Redis哨兵模式分析哨兵结构组成哨兵模式的主从切换Re…

重点,一文掌握ReentrantLock加解锁原理!|原创

本文详细讲解了 ReentrantLock 加锁和释放锁的原理&#xff0c;以及和 Synchronized 的对比。本文较长&#xff0c;建议收藏&#xff01;点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达简要总结 ReentrantLock实现原理&#xff1a;volati…

Android入门第33天-Android里的弹出式对话框

简介 Android Studio里在4.0前有一种ProgressDialog&#xff0c;这个已经淘汰了。我们完全可以使用ProgressBar来取代。但是还有一种Dialog叫PopWindow&#xff0c;它是一种“可阻塞式Dialog”。即弹出后除非你给它一个“动作”否则就一直显示在那。 今天我们就来看看这种Dia…

【Linux】基础IO —— 动静态库的制作与使用

&#x1f308;欢迎来到Linux专栏~~动静态库的制作与使用 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自…

Spring Boot 检索定时任务

概述 应用经常需要添加检索功能&#xff0c;开源的 ElasticSearch 是目前全文搜索引擎的首选。他可以快速的存储、搜索和分析海量数据。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持。 Elasticsearch是一个分布式搜索服务&#xff0c;提…

Unity3D占用内存太大怎么解决呢? -下

什么时候才是UnusedAssets?看一个例子&#xff1a; Object obj Resources.Load("MyPrefab"); GameObject instance Instantiate(obj) as GameObject; ......... Destroy(instance); 创建随后销毁了一个Prefab实例&#xff0c;这时候 MyPrefab已经没有被实际的物体…

5.XMLHttpRequest对象

XMLHttpRequest简称xhr&#xff0c;是浏览器提供的Javascript对象。之前我们使用的都是jQuery中的Ajax&#xff0c;现在我们使用原生JS的Ajax 目录 1 GET请求 1.1 不带参数请求 1.2 带参数请求 2 URL的编码与解码 2.1 编码 encodeURI() 2.2 解码 decodeURI() 3 …

【通用设计方法】之接收异常保护

目录 前言 一、接收异常保护 二、超短包、背靠背的支持 后记 前言 为了系统的鲁棒性&#xff0c;我们常常会做一系列的异常保护功能&#xff0c;避免系统挂死。 这里仅仅介绍接收保护的某些设计思路&#xff0c;抛砖引玉。 一、接收异常保护 设计思路&#xff1a;通过可配…

数据可视化大屏设计

在数据业务展示场景中&#xff0c;数据可视化大屏已经变得十分常见。那么在设计思路上&#xff0c;数据可视化大屏应当遵循什么样的设计逻辑&#xff1f;本篇文章里做了介绍&#xff0c;一起来看一下。 一、数据大屏的应用场景 1、大型会议 2、业务展示 二、数据大屏分类 1、展…