摘要:广义正态分布优化算法(Generalized normal distribution optimization,GDNO)是于2020年提出的一种新型智能优化算法,该算法受到正态分布理论的启发,具有寻优能力强,收敛速度快等特点。
广义正态分布优化(Generalized normal distribution optimization, GNDO)算法受到正态分布理论的启发。正态分布又称高斯分布
Q
Q
Q ,是描述自然现象的重要工具。正态分布可以定义如下:假设一个随机变量
x
x
x 服位置参数
μ
\mu
μ 和尺度参数
δ
\delta
δ 的概率分布,其概率密度
Q
Q
Q 函数可以表 示为:
f
(
x
)
=
1
2
π
δ
exp
(
−
(
x
−
μ
)
2
2
δ
2
)
(17)
f(x)=\frac{1}{\sqrt{2 \pi \delta}} \exp \left(-\frac{(x-\mu)^{2}}{2 \delta^{2}}\right) \tag{17}
f(x)=2πδ1exp(−2δ2(x−μ)2)(17)
其中,
x
\mathrm{x}
x 被称为正态随机变量,这个分布可以称为正态分布,也就是
x
∼
N
(
μ
,
δ
2
)
\mathrm{x} \sim \mathrm{N}\left(\mu, \delta^{2}\right)
x∼N(μ,δ2) 。根据式(1),正态分布包括两个变量,即位置参数
μ
\mu
μ 和 尺度参数
δ
\delta
δ 。位置参数
μ
\mu
μ 和尺度参数
δ
\delta
δ 分别用来表示随机变量的均值和标准差。
GNDO中设计的信息共享策略包括局部开发和全局探索。局部开发基于建立的广义正态分布模型,该模型由当前平均位置和当前最优位置 引导;全局探索涉及三个随机选择的个体。这两种学习策略的详细解释如下:
局部开发是指在包含所有个体当前位置的搜索空间周围找到更好解决方案的过程。基于个体在种群中的分布与正态分布之间的关系,可以 通过以下方法建立优化的广义正态分布模型:
v
i
t
=
μ
i
+
δ
i
×
η
,
i
=
1
,
2
,
⋯
,
N
(18)
\boldsymbol{v}_{\mathrm{i}}^{\mathrm{t}}=\mu_{\mathrm{i}}+\delta_{\mathrm{i}} \times \eta, \mathrm{i}=1,2, \cdots, \mathrm{N} \tag{18}
vit=μi+δi×η,i=1,2,⋯,N(18)
其中,
v
i
t
\boldsymbol{v}_{\mathrm{i}}^{\mathrm{t}}
vit 是第
i
\mathrm{i}
i 个个体在时间
t
\mathrm{t}
t 的轨迹向量,
μ
i
\mu_{\mathrm{i}}
μi 是第
i
\mathrm{i}
i 个个体的广义平均位置,
δ
i
\delta_{\mathrm{i}}
δi 是广义标准差,
η
\eta
η 是惩罚因子。
μ
i
\mu _i
μi、
δ
i
\delta_{\mathrm{i}}
δi 和
η
\eta
η 可以定义为:
μ
i
=
1
3
(
x
i
t
+
x
Best
t
+
M
)
(19)
\mu_{\mathrm{i}}=\frac{1}{3}\left(\boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}+\boldsymbol{x}_{\text {Best }}^{\mathrm{t}}+\boldsymbol{M}\right) \tag{19}
μi=31(xit+xBest t+M)(19)
δ i = 1 3 [ ( x i t − μ ) 2 + ( x Best t − μ ) 2 + ( M − μ ) 2 ] (20) \delta_{\mathrm{i}}=\sqrt{\frac{1}{3}\left[\left(\boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}-\mu\right)^{2}+\left(\boldsymbol{x}_{\text {Best }}^{\mathrm{t}}-\mu\right)^{2}+(\boldsymbol{M}-\mu)^{2}\right]} \tag{20} δi=31[(xit−μ)2+(xBest t−μ)2+(M−μ)2](20)
η
=
{
−
log
(
λ
1
)
×
cos
(
2
π
λ
2
)
,
if a
≤
b
−
log
(
λ
1
)
×
cos
(
2
π
λ
2
+
π
)
,
otherwise
(21)
\begin{gathered} \eta= \begin{cases}\sqrt{-\log \left(\lambda_{1}\right)} \times \cos \left(2 \pi \lambda_{2}\right), & \text { if a } \leq \mathrm{b} \\ \sqrt{-\log \left(\lambda_{1}\right)} \times \cos \left(2 \pi \lambda_{2}+\pi\right), & \text { otherwise }\end{cases} \end{gathered}\tag{21}
η={−log(λ1)×cos(2πλ2),−log(λ1)×cos(2πλ2+π), if a ≤b otherwise (21)
其中, a、b、
λ
1
\lambda_{1}
λ1 和
λ
2
\lambda_{2}
λ2 是介于 0 和1之间的随机数,
x
B
e
s
t
t
\boldsymbol{x}_{\mathrm{Best}}^{\mathrm{t}}
xBestt 是当前最佳位置,
M
\boldsymbol{M}
M 是当前种群的平均位置。
M
\boldsymbol{M}
M 计算如下:
M
=
∑
i
=
1
N
x
i
t
N
(22)
\boldsymbol{M}=\frac{\sum_{\mathrm{i}=1}^{\mathrm{N}} \boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}}{\mathrm{N}} \tag{22}
M=N∑i=1Nxit(22)
广义平均位置
μ
i
\mu_{\mathrm{i}}
μi 当前最佳个体
x
Best
t
x_{\text {Best }}^{\mathrm{t}}
xBest t 包含与全局最优解相关的有用信息。因此,第
i
\mathrm{i}
i 个个体
x
i
t
x_{\mathrm{i}}^{\mathrm{t}}
xit 被拉向当前最佳个体
x
Best
t
x_{\text {Best }}^{\mathrm{t}}
xBest t 的方向,后 方向移动。平均位置
M
M
M 在迭代过程中会发生变化,这有利于找到更好的解决方案。因此,在设计的局部开发策略中引入了平均位置
M
M
M ,在一定程度上提高了避免局部最优的机会。
广义标准差 δ i \delta_{\mathrm{i}} δi 。广义标准差 δ i \delta_{\mathrm{i}} δi 用于增强所提出的GNDO的局部搜索能力。基于式(3)和(4),广义标准差 δ i \delta_{\mathrm{i}} δi 可以被视为一个随机序列,在 广义平均位置 i i \mathrm{i}_{\mathrm{i}} ii 周围进行局部搜索。此外,根据式(4),第 1 个个体 x i t x_{\mathrm{i}}^{\mathrm{t}} xit 的位置和平均位置 M M M 与最佳个体 x Best t x_{\text {Best }}^{\mathrm{t}} xBest t 的位置之间的距离越大, 动的随机序列可以帮助个体寻找更好的解。当个体 x i t x_{\mathrm{i}}^{\mathrm{t}} xit 具有良好的适应值时,个体很有可能在其周围找到更好的解决方案。因此,具 有弱波动的随机序列可以帮助个体获得更好的解。
惩罚因子 η \eta η。在GNDO算法中,惩罚因子 η \eta η用于进一步增强生成的广义标准差的随机性。惩罚因子可以增加GNDO的搜索方向,从而提高GNDO的搜索能力。
全局探索是在全局范围内搜索一个有希望的区域。GNDO的全局探索基于三个随机选择的个体,可以表示为:
v
i
t
=
x
i
t
+
β
×
(
∣
λ
3
∣
×
v
1
)
⏟
Local information sharing
+
(
1
−
β
)
×
(
∣
λ
4
∣
×
v
2
)
⏟
Global information sharing
(23)
\boldsymbol{v}_{\mathrm{i}}^{\mathrm{t}}=\boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}+\underbrace{\beta \times\left(\left|\lambda_{3}\right| \times \boldsymbol{v}_{1}\right)}_{\text {Local information sharing }}+\underbrace{(1-\beta) \times\left(\left|\lambda_{4}\right| \times \boldsymbol{v}_{2}\right)}_{\text {Global information sharing }} \tag{23}
vit=xit+Local information sharing
β×(∣λ3∣×v1)+Global information sharing
(1−β)×(∣λ4∣×v2)(23)
其中,
λ
3
\lambda_{3}
λ3 和
λ
4
\lambda_{4}
λ4 是服从标准正态分布的两个随机数,称为调整参数的
β
\beta
β 是介于 0 和 1 之间的随机数,
v
1
v_{1}
v1 和
v
2
v_{2}
v2 是两个轨迹向量。
v
1
v_{1}
v1 和
v
2
v_{2}
v2 可通过 以下公式计算:
v
1
=
{
x
i
t
−
x
p
1
t
,
if
f
(
x
i
t
)
<
f
(
x
p
1
t
)
x
p
1
t
−
x
i
t
,
otherwise
(24)
\boldsymbol{v}_{1}= \begin{cases}\boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}-\boldsymbol{x}_{\mathrm{p} 1}^{\mathrm{t}}, & \text { if } \mathrm{f}\left(\boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}\right)<\mathrm{f}\left(\boldsymbol{x}_{\mathrm{p} 1}^{\mathrm{t}}\right) \\ \boldsymbol{x}_{\mathrm{p} 1}^{\mathrm{t}}-\boldsymbol{x}_{\mathrm{i}}^{\mathrm{t}}, & \text { otherwise }\end{cases} \tag{24}
v1={xit−xp1t,xp1t−xit, if f(xit)<f(xp1t) otherwise (24)
v
2
=
{
x
p
2
t
−
x
p
3
t
,
if
f
(
x
p
2
t
)
<
f
(
x
p
3
t
)
x
p
3
t
−
x
p
2
t
,
otherwise
(25)
\begin{gathered} \boldsymbol{v}_{2}= \begin{cases}\boldsymbol{x}_{\mathrm{p} 2}^{\mathrm{t}}-\boldsymbol{x}_{\mathrm{p} 3}^{\mathrm{t}}, & \text { if } \mathrm{f}\left(\boldsymbol{x}_{\mathrm{p} 2}^{\mathrm{t}}\right)<\mathrm{f}\left(\boldsymbol{x}_{\mathrm{p} 3}^{\mathrm{t}}\right) \\ \boldsymbol{x}_{\mathrm{p} 3}^{\mathrm{t}}-\boldsymbol{x}_{\mathrm{p} 2}^{\mathrm{t}}, & \text { otherwise }\end{cases} \end{gathered} \tag{25}
v2={xp2t−xp3t,xp3t−xp2t, if f(xp2t)<f(xp3t) otherwise (25)
其中,
p
1
、
p
2
\mathrm{p} 1 、 \mathrm{p} 2
p1、p2 和
p
3
\mathrm{p} 3
p3 是从1到
N
\mathrm{N}
N 中选栔的三个随机整数,且满足
p
1
≠
p
2
≠
p
3
\mathrm{p} 1 \neq \mathrm{p} 2 \neq \mathrm{p} 3
p1=p2=p3 。给定式(8)和式(9),式(7)右侧的第二项可以称为局部学 习习项,这意味着个体p1与个体烘享信息; 式(7)右侧的第三项可以称为全局信息共享项,它表示个体p2和p3向个体提供信息。调整参数
β
\beta
β 用于平衡两种信息共享策略。此外,
λ
3
\lambda_{3}
λ3 和
λ
4
\lambda_{4}
λ4 是标准正态分布的随机数,这可以使GNDO在执行全局搜索的过程中拥有更大的搜索空间。


[1] Yiying Zhang, Zhigang Jin, Seyedali Mirjalili. Generalized normal distribution optimization and its applications in parameter extraction of photovoltaic models[J]. Energy Conversion and Management, 2020, 224: 113301.
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来