物理背景
a为层流,b为湍流。
层流和湍流是流体流动的一种性质。流体流动时,如果流体质点的轨迹(一般说随初始空间坐标x、y、z随时间t而变)是有规则的光滑曲线(最简单的情形是直线),这种流动叫层流,没有这种性质的流动叫湍流。
算法实现
流程图
自然界中的层流和湍流给我们在优化设计中设计规则和不规则随机搜索算子提供了很好的启发。因此,可以从优化的角度对两种类型的水流进行建模。不失一般性,假设要解决的问题有要最小化的目标函数。从目标函数值大的解到目标函数值小的解,通过充分有效的迭代过程,可以找到最优解。由于自然界中水总是从高海拔的源头流向低海拔的汇,因此水流与解搜索之间存在相似性。更具体地说,如果将水粒子视为解决方案,则粒子的位置类似于解决方案的值,水粒子的势能类似于目标或适应度。因此,要最小化的问题的目标函数值或要最大化的问题的倒数被定义为水粒子的势能。 WFO算法中直接将目标函数作为水粒子势能的评价函数。
1)层流算子:在层流中,所有粒子均沿平行直线运动。由于水的粘度,粒子的速度可能不同,例如远离墙壁或障碍物的层中的粒子比靠近墙壁或障碍物的层中的粒子更快。这种规则运动可以通过以下等式建模:
其中t为迭代次数,i和m分别为所使用的水粒子的索引和数目,xi(t)为第i个粒子在第t次迭代时的位置,yi(t)表示其可能移动的位置,随机数 s ∈ U([0, 1]) 表示水粒子的移动系数,而 ?d 向量表示所有粒子的共同运动方向。共同方向由随机选择的两个不同粒子决定,如下所示:
其中 f (xh(t)) ≤ f (xk(t)) 表示第 j 个粒子的势能 f (xh(t)) 小于或等于第 k 个粒子的势能 f (xk(t))。特别地,如果粒子 h 固定在迄今为止找到的最佳解,则任何其他粒子都可以用作粒子 k。找到的最佳解决方案代表当前具有最低势能的位置。因此,在实施层流算子时,选择迄今为止找到的最佳解决方案作为引导粒子 h。
等式(1)和(2)在形式上类似于 DE [36] 中的简单变异算子。应该注意的是 (1) 中 s 的值随水粒子的不同而不同,但在同一迭代过程中每个水粒子的 ?d 值不变。因此,在搜索模式方面存在本质区别。WFO算法中的层流算子采用规则的并行单向搜索模式,而DE算法中的变异算子采用混沌多向搜索模式。在(1)中,s 的随机性确保不同的水粒子具有不相等的偏移,并且 ?d 的公共性保证并行单向搜索。
2) 湍流算子:
在湍流中,水粒子以随机方式相互推挤并在相邻层上移动。由于水粒子的不规则运动,流线被打破。当快速的水流受到障碍物的干扰时,就会发生局部振荡。一旦振荡幅度足够大,剪切力就会作为扭矩推动水粒子旋转。结果,出现了涡流。如果将待求解问题的一个维度看成一层水流,维度之间的数学变换可以模拟湍流中水粒子的不规则运动。自然地,湍流算子 yi 中水粒子的可能移动位置是通过在随机选择的维度上振荡产生的,即
其中 j1 ∈ {1, 2, . . . , n}是从n维中随机选取的分量,变异值v由下式确定:
其中 k ∈ {1, 2, . . . , m} 是随机选择的不同粒子的索引,k ?= i; j2 是随机选择的不同维度,j2 ?= j1,r 是 [0, 1] 范围内的随机数,pe ∈ (0, 1) 是称为涡流概率的控制参数。即,WFO 算法中的湍流算子以 pe 的概率实现有趣的涡流变换 ψ ,以 1 − pe 的概率实现一般的跨层移动变换 ϕ 。
由于涡流的形状类似于特殊的阿基米德螺线,因此湍流算子中的涡流函数由类似的方程构成
其中 θ 是 [−π, π] 范围内的随机数,ρ 由自适应规则动态确定
ρ 可以看作是第 k 个粒子对第 i 个粒子的剪切力。当然,由于 sin(θ ) = cos(θ − [π/2]),使用 (5) 中的基本正弦函数也是合理的。
为了模拟水粒子在层上的一般行为,采用了以下转换函数:
其中 lb 和 ub 分别代表下限和上限。线性变换可以将随机选择的粒子的比例继承到所选维度中的边界。
3) 进化规则:
水往低处流,更小的值替换现在的值。
在水力学中,如果雷诺数小于阈值,则水流为层流,否则为湍流。 WFO 算法随机模拟了两种类型的水流。更具体地说,层流以 pl 的概率模拟,湍流以 1 − pl 的概率模拟。层流概率 pl ∈ (0, 1) 作为关键控制参数,类似于雷诺数的阈值,因为pl 还确定执行哪种操作(层流或湍流)。
目标在迭代过程中不断优化。因此,水流从高地到低地的趋势在 WFO 算法中通过进化计算中的共同策略来表征。更具体地说,如果可能移动的位置具有较低的势能,则将其选为新位置;否则,水粒子保持在当前位置。即
算法流程
A.初始化
在初始化阶段,需要给算法参数赋值,包括使用的水粒子数m、层流概率pl和涡流概率pe。除了参数设置外,每个水粒子的位置和势能都在第一阶段被初始化。水粒子的初始位置在搜索空间内随机生成。使用目标函数直接计算每个粒子的势能。
B. 进化操作
WFO 算法通过层流或湍流算子生成试验解。
根据(1)-(8)这两个算子很容易实现。但是,在实现层流算子时需要注意以下几点。
1) s 的值对于不同的粒子是不同的,但对于同一水粒子位置的每个分量是相同的。
2) ?d 的值在不同的迭代中可能不同,但在同一迭代中对于每个水粒子都是相同的;为加快收敛速度,目前找到的最优解是引导粒子h的最优候选
C. 约束处理
层流或湍流算子产生的试验解的值可能超过搜索范围。
解决违反边界约束问题的方法很少[37],例如随机、吸收和反射。在这项研究中,保留方案用于处理边界约束违规。更具体地说,yj i(t) = xj i(t),如果 yj i(t) > ubj 或 yj i(t) < lbj。应该注意的是,(7)产生的试验解的值不超过任何界限。减少不必要的计算消耗;因此,在通过(1)和(5)生成试解后,执行检查边界约束的操作。
还有一些方法可以处理现实世界工程问题的约束[18]、[38],例如惩罚函数、解码器、特殊修复算子以及目标函数和约束的分离。如果在解决约束问题时采用修复算子,则应在更新阶段之前嵌入基于问题知识的特殊操作,以提高 WFO 算法的效率。
伪代码
个人理解
- m个水微粒,每个微粒代表一个个体,每个个体含有n维变量。
- 给m个例子附上初值(m应该去多少合适?)
- 判断是否到达终止条件
随机数rand1(),rand()1<pl,微粒判为层流,层流微粒通过向最优微粒靠近(远离),完成算法的收敛:
层流微粒的迭代方式:
公式(1)表示所有层流微粒在原位置的基础上,加上随机数s*距离向量,随机数属于[0,1],距离等于最优微粒减去任意非最优微粒的距离向量,同一次迭代中所有层流使用同一个距离向量。
随机数rand1(),rand1()>pl,判为湍流,湍流通过抽取微粒的一个值(维度)进行变异
,丰富微粒(解)的多样性,湍流分为两种情况:
情况1,随机数rand2(),rand2()>pe
对湍流微粒,随机再选择一个微粒,对它们的同一个维度(值)进行阿基米德螺线求解
情况2,随机数rand2(),rand2()<pe
对湍流微粒,随机再选择一个微粒,对它们的不同的维度(值)进行如下操作
为了模拟水粒子在层上的一般行为,采用了以下转换函数:
其中 lb 和 ub 分别代表下限和上限。线性变换可以将随机选择的粒子的比例继承到所选维度中的边界。
4.循环迭代
更新最佳微粒的位置与最佳适应度值
个人疑惑
这种方式迭代速度真的快吗?层流的搜索方式,目的性太弱,但丰富多样性
湍流,变异很少,而且不一定是有利变异(从局部最优的角度看)
参考文献:Water Flow Optimizer: A Nature-Inspired Evolutionary Algorithm for Global Optimization
matlab工具包与python代码:北京航空航天大学主页平台系统 罗开平--中文主页--Codes | 程序代码