闪电连接算法之Python实现
文章目录
- 简介
- 原理
- 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=N1j∑Nxji,fˉi=f(xˉi)
如果fjif^i_jfji优于fˉi\bar f^ifˉi,则闪电向这边移动,否则闪电向另一侧移动
xi∗={xji+(xˉi+xji⋅rand)⋅randfji<fˉixji−(xˉi+xji⋅rand)⋅randfji⩾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+xji⋅rand)⋅randfji<fˉixji−(xˉi+xji⋅rand)⋅randfji⩾fˉ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=1−tMtexp−tMt
随着迭代次数增加,SSS的值不断减小,意味着分支点的抖动逐渐降低,其作用在分支上的方式如下
xi∗=xi∗+rand⋅S⋅(xm−xM)x^{i*}=x^{i*}+\operatorname{rand}\cdot S\cdot(x_m-x_M) xi∗=xi∗+rand⋅S⋅(xm−xM)
其中,xmx_mxm和xMx_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=0∑cos(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,当新种群中没有更优情况的时候,上一代计算结果会被保存,随着迭代次数越来越多,非常容易内存爆炸,看来是要对每一代种群进行以此筛选才行。
闪电连接算法之Python实现相关推荐
- 新鲜出炉的连连看连接算法Python版
这段时间老是"不务正业"的搞一些东西玩.之前的贪吃蛇,俄罗斯方块激发了我研究游戏算法的兴趣.经过1个星期的构思,连连看的连接算法终于出炉了.再过一段时间就基于这个算法使用JavaS ...
- 基于闪电连接过程优化算法的函数寻优算法
文章目录 一.理论基础 1.闪电连接过程优化算法 (1)初始化 (2)确定闪电的下一跳 (3)闪电分支消失 (4)上迎先导的移动 (5)连接点的确定 2.LAPO算法伪代码 二.仿真实验与结果分析 三 ...
- 【智能优化算法】基于闪电连接过程优化算法求解单目标优化问题含Matlab源码
1 简介 闪电连接过程算法( Lightning Attachment Procedure Optimization,LAPO)是受自然界中闪电上迎先导与下行先导连接过程的启发,于2017年提出的一种 ...
- 连连看连接算法Javascript版
继连连看连接算法Python版后,我将该算法移植到了Javascript上,为在浏览器版连连看做准备. 功能及使用方法参照另外一篇:连连看连接算法Python版. 值得一提的是由于Javascript ...
- 数据结构与算法(Python)【PKU MOOC】
数据结构与算法(Python) 一. Python数据类型的性能 1.list 列表 列表list所包含的方法 #1 添加: list.append(a_new_element) #在列表末尾添加新的 ...
- FP-growth 算法与Python实现
FP-growth 算法与Python实现 介绍 打开你的搜索引擎,输入一个单词或一部分,例如"我",搜索引擎可能会去统计和"我"一块出现得多的词,然后返回 ...
- PageRank算法及Python实现
目录 PageRank概念 PageRank的核心思想 PageRank算法的python实现 如何提高自身网站的PageRank PageRank概念 佩奇排名(PageRank),又 ...
- pca算法python代码_三种方法实现PCA算法(Python)
主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...
- python快速排序算法没看懂_你需要知道的九大排序算法【Python实现】之快速排序...
五.快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: #coding: ...
最新文章
- PCL工程的CMakeList.txt文件书写规范
- 重磅发布: 阿里云WAF日志实时分析上线 (含视频)
- Python_note9 Matplotlib画图 Seaborn画图
- Exchange Server 2013之CAS服务器NLB负载均衡
- 北京内推 | 微软亚洲研究院MSRA STCA招聘多模态算法实习生
- C语言高级编程:利用堆栈溢出修改函数返回地址
- 老华为可以升级鸿蒙,真良心!五年前老机型都能升级华为鸿蒙
- ModBus协议寄存器
- Java 9 又要延期?甲骨文撂狠话:强推!
- vue npm run dev 报错 semver\semver.js:312 throw new TypeError('Invalid Version: ' + version)
- CentOS更改主机名
- Android修改读写速度,Android 通过adb测试机器读写速度(rk)
- STEP 7-Micro/WIN SMART 界面介绍
- tftp命令怎么传输文件,5步掌握tftp命令的使用方法
- 模电摸索日记之《集成运算放大器》
- matlab求解vrp问题遗传算法,vrp问题(遗传算法vrp问题)
- eot格式字体怎么安装教程
- LaaS,PaaS,SaaS介绍
- OpenHarmony 软总线lite 源码分析
- “ ipconfig 不是内部或者外部命令,也不是可运行的程序”问题的解决