14种混沌映射,python代码,可自由切换,以鲸鱼和蜣螂算法为例,方便应用于所有算法...

本文介绍了如何使用Python代码实现14种常见的和不常见的混沌映射,以优化群智能算法,如鲸鱼和蜣螂算法。通过混沌映射增强粒子的随机性和多样性,实验证明其在搜索复杂问题上的优势,但需注意混沌优化仅作为初始化手段,可能不如传统随机初始化偶尔表现更好。
摘要由CSDN通过智能技术生成

 本期采用PYTHON代码实现14种常见的和不常见的混沌映射用于优化群智能算法,作者写好了一个Chaos类,方便调用,代码可一键切换,可用于所有智能算法优化,本篇文章以鲸鱼和蜣螂算法为例进行介绍

本文涉及14种混沌映射算法,用于在初始化智能算法粒子时使用,14种混沌映射算法包括:Tent映射、Fuch映射、Henon映射、SPM映射、Logistic映射、Cubic映射、chebyshev映射、Piecewise映射、sinusoidal映射、Sine映射,ICMIC映射, Circle映射,Bernoulli映射,Singer映射。关于每个方法映射的原理,本文就不再一一介绍。

01

选择混沌映射有什么用

经实验证明,采用混沌映射产生随机数的适应度函数值有明显提高,用混沌映射取代常规的均匀分布的随机数发生器可以得到更好的结果,特别是搜索空间中有许多局部解时,更容易搜索到全局最优解。一句话来讲就是:混沌映射可以增强粒子的随机性和多样性。

02

混沌映射可视化图片

采用python代码,实现对混沌映射的绘图。以SPM映射和Fuch映射为例,展示一下结果图。当然这个用肉眼也确实看不出太大区别,其他12种混沌映射画出来的结果都和这个差不多,就不一一展示了。

484492cbc35836a3c7f2f2dc03082ba4.png

ae7077027cc6483cebac32a867301dab.png

绘图代码如下:

from chaos import Chaos  #作者自己写的一个class
import numpy as np
import math
from matplotlib import pyplot as plt

dim = 1000
lb = np.zeros([dim,1])
ub = np.ones([dim,1])
chaos_ = Chaos(1, dim, lb, ub)  # 生成一个Chaos类

'''
        可选函数有:tent_initial,fuch_initial,sine_initial,singer_initial,henon_initial,cubic_initial,
                icmic_initial,bernoulli_initial,chebyshev_initial,circle_initial,logistic_initial,
                piecewise_initial,sinusoidal_initial SPM_initial
        分别对应相应的混沌映射!
    '''
poss_sols = Chaos.fuch_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

''' 
    绘制混沌映射图
'''
x = np.array(range(0,dim)).reshape(1,-1)
plt.scatter(x,poss_sols,s=2)
plt.title('Fuch Chaos Map')
plt.xlabel('Sample points')
plt.ylabel('Chaos value')
plt.grid()
plt.show()

可以看到,在代码中调用了作者自己写的一个Chaos类,有了这个类,大家就可以像调用python库一样,调用不同的混沌映射方法。

03

14种混沌映射优化鲸鱼算法

以SPM、Fuch、Tent混沌映射为例,在CEC2005,F2函数dim=50。上进行测试。采用不同混沌映射优化鲸鱼算法结果如下:

SPM混沌映射的WOA算法:

修改代码为下即可。

poss_sols = Chaos.SPM_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

f552ed75d64d1de079f476cb30a76280.png

Fuch混沌映射的WOA算法:

修改代码为下即可。

poss_sols = Chaos.fuch_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

74601a6ba0fce066cd0df9de076f517c.png

Tent映射

修改代码为下即可。

poss_sols = Chaos.tent_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

08e278f9f2263b90ab13ad612c1c6b3f.png

14种混沌映射优化蜣螂算法

以Icmic、Fuch、Sinusoida混沌映射为例,在CEC2022,F1函数dim=20。上进行测试。采用不同混沌映射优化蜣螂算法结果如下:

Icmic混沌映射的DBO算法:

修改代码为下即可。

X= Chaos.icmic_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

2ee08688848468b0983f0c8fc5d0c9a4.png

Fuch混沌映射的DBO算法:

修改代码为下即可。

X= Chaos.fuch_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

6dd3458bfa25387dce00ae657c833aed.png

sinusoidal 映射的DBO算法:

修改代码为下即可。

X= Chaos.sinusoidal_initial(chaos_)  # 把生成的chaos_带入具体的混沌映射函数即可!

3234ddc13f05030cf8d95a81d9dd32cf.png

04

结果分析

    可以看到,加了混沌映射后的函数,在算法寻优的前期,往往能更快的找到较小的值。这说明混沌映射起到了作用!   

    这里要特别说明一下,混沌映射优化智能算法,从理论上来讲,只是将初始化的粒子变得更随机更多样了,这样确实是可以加速算法的收敛速度,但是,一旦循环开始,剩下的就没有混沌优化什么事情了。

    换句话说,就是如果我直接用rand函数生成一堆粒子,也是有一定概率比混沌优化生成的粒子更好的,虽然这个概率不大,但确确实实是有的,所以如果偶尔出现混沌优化的效果不好使,那也不要气馁,毕竟混沌优化只是优化智能算法的一种手段,大家可以结合别的手段一起优化。

05

代码目录

fbc6cdc378bbde9bbb353a86a4e67005.png

其中,chaos.py是作者写好的14种混沌映射的类。在主函数“14种混沌映射DBO.py”方便调用,也可方便用于别的算法改进中。plotchaos.py文件是用来绘制混沌映射图的。chaos的英文名是混乱,感觉这么命名还是挺有道理的哈哈,这样大家就可以一键更换了,而且很容易扩展到其他代码上。

友情提示:如果说,大家在用混沌映射优化时效果不好,可以手动修改chaos.m中的每个混沌映射方法的混沌系数。

本期代码获取链接:https://mbd.pub/o/bread/ZZuXkp1u

或点击下方卡片获取

  • 19
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用提供了蜣螂优化算法Python代码,可以用于函数极值寻优。你可以在Python环境中运行这段代码,根据自己的需求进行修改和使用。以下是代码的基本结构和使用方法: 1.导入必要的库和模块: import numpy as np import random 2.定义蜣螂优化算法的类: class DBO: def __init__(self, func, dim, size, iter_num, lb, ub): self.func = func # 待优化的目标函数 self.dim = dim # 变量的维度 self.size = size # 群大小 self.iter_num = iter_num # 迭代次数 self.lb = lb # 变量的下界 self.ub = ub # 变量的上界 self.best_x = None # 最优解 self.best_f = np.inf # 最优解对的函数值 self.swarm = np.random.uniform(low=self.lb, high=self.ub, size=(self.size, self.dim)) # 初始化群 self.fitness = np.array([self.func(x) for x in self.swarm]) # 计算群适度 def optimize(self): for i in range(self.iter_num): for j in range(self.size): # 选择一个随机的蜣螂 k = random.randint(0, self.size - 1) while k == j: k = random.randint(0, self.size - 1) # 计算新位置 new_x = self.swarm[j] + np.random.uniform() * (self.swarm[j] - self.swarm[k]) # 边界处理 new_x = np.clip(new_x, self.lb, self.ub) # 计算新适度 new_f = self.func(new_x) # 更新最优解 if new_f < self.best_f: self.best_x = new_x self.best_f = new_f # 更新群 if new_f < self.fitness[j]: self.swarm[j] = new_x self.fitness[j] = new_f 3.定义待优化的目标函数: def func(x): return np.sum(x ** 2) 4.创建DBO对象并运行优化算法: dbo = DBO(func, dim=10, size=50, iter_num=1000, lb=-100, ub=100) dbo.optimize() 5.输出最优解和最优解对的函数值: print('best_x:', dbo.best_x) print('best_f:', dbo.best_f)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值