什么是鲸鱼优化算法(WOA)?使用鲸鱼优化算法求解C++基准约束优化问题
作者:互联网
C++中求解约束问题的鲸鱼优化算法
受自然启发的元启发式算法,这里的鲸鱼算法通过模仿生物或物理现象来解决优化问题。
开创了相当数量的算法,这些算法经常用于解决优化问题。元启发式算法通常使用相对简单的概念。有简单的同时适应特定问题,它们可以绕过局部最优,最后可以应用于跨越各种学科的广泛问题。
在本文中,我将描述鲸鱼优化算法,我用它来解决一些基准约束的优化问题。此外,我将应用所讨论的算法来解决 3D 机器人路径规划器。
本文的源代码可以在我的GitHub上找到。
鲸鱼优化算法 (WOA)
鲸鱼是优雅的动物。它们被认为是世界上最大的动物。一头成熟的鲸鱼可以长到30米长,180吨重。这种巨大的哺乳动物有七个主要物种,包括杀手、小须、塞、座头鲸、右、鳍和蓝。大多数人认为鲸鱼是捕食者。由于他们必须呼吸海洋表面空气,他们无法入睡。实际上,大脑的另一半睡着了。鲸鱼的迷人之处在于,它们被认为是非常聪明、有感觉的动物(如人类)。
最令人兴奋的事情之一,也就是本文的范围是他们
特殊的狩猎方法。该方法称为气泡网进料法。座头鲸通过沿着圆圈产生独特的气泡来捕食鱼类,见下图。
鲸鱼的动作与气泡有关,并将它们命名为“向上螺旋”和“双环”。正如你在图中所看到的,鲸鱼产生的泡泡为鱼开路。随着时间的流逝,圆圈(螺旋)变小(半径),因此最终允许在一个地方积累鱼。
这是一个YouTube图,这些非凡的动物可以激发您的灵感。
泡泡网喂食是一种独特的行为,只能在座头鲸身上观察到。
为了类似于鲸鱼的行为并解决优化问题,已经发明了以下数学模型(方程组)。
优化问题可以是多维的。在这种情况下,每只鲸鱼都被视为一个搜索代理,其中包含一个特定的变量(变量数等于问题维度空间)。
A. 包围猎物
捕猎时,座头鲸可能会发现猎物并围着猎物转圈。WOA 方法假设当前最佳候选解决方案是目标猎物或非常接近最优,因为最佳设计在搜索空间中的位置不是先验已知的。其他搜索代理将在确定最大的搜索代理后尝试将其位置调整为最佳搜索代理。以下等式说明了此行为 (Eq1):
其中 A、C 是系数向量,X 被视为位置。向量 a 初始化为 2,并在优化运行时减小。向量 r 是一个随机向量 [ 0,1]。
B. 泡网攻击方法(利用阶段)
在这个阶段,我们可以区分两种行为。一种是环绕机制,其中狩猎圈正在减小(当我们运行算法时,每次迭代都会发生递减过程)。第二个螺旋更新位置,其中位于
(X,Y)的鲸鱼和位于(X*,Y*)的猎物之间的距离被更新。
座头鲸同时以螺旋模式围绕猎物和越来越小的圆圈游泳。我们使用这样的假设:有50%的机会选择螺旋模型或收缩包围机制来更新鲸鱼在整个优化过程中的位置,以模拟这种同时行为(Eq2)。
其中(如 Eq1)和 b 是定义对数螺旋形状的常数,l 是 [ −1,1] 中的随机数
C. 寻找猎物(探索阶段)
为了寻找猎物,鲸鱼使用基于A向量(探索)的相同策略。实际上,座头鲸会根据彼此的位置随机寻找。如果 A>1 (Eq3)
其中 p 是 [0,1] 中的随机数。X_rand是从整个种群中选择的随机位置向量(随机鲸鱼)。
伪代码可以描述如下:
如上所述,我在C++中使用了部署的 WOA 来解决三种不同的优化问题。简单的一个是我用于个人调试目的的普通二次函数。
第二个问题与拉伸/压缩弹簧连接(基准优化问题),问题的目标是最小化重量。有三个设计变量:线径(d),平均线圈直径(D)和有源线圈数(N)。这是一个三维问题(每个变量都被视为一个维度)。
优化问题可以表述如下:
现有的约束已作为惩罚包含在目标函数中。我将惩罚建模为二次损失函数(见此处和此处)。
实现的方法解决了这个问题(计算弹簧的最小重量)。我收到的解决方案(几乎)与我受到启发的文章相同。
我使用的WAO的最后一个问题是机器人路径规划器案例(这个问题在我以前的文章中是已知的)。WAO 算法优化了机器人的位置,以便在起点和目标之间找到无碰撞(我使用 WOA 作为 3D 空间路径规划器)。正如我在上一篇文章中提到的,3D空间的路径规划主要适用于无人机或其他“没有”运动学的机器人。通常,对于机械手,我们正在寻找关节空间的解决方案。
机器人路径规划器的目标功能
与我上一篇文章类似,我应用了相同的目标(成本)函数。算法尝试优化的成本函数(计算最小值)可以定义如下:
哪里
距离萤火虫——障碍物,
-
用于 2D 路径规划器
-
用于 3D 路径规划器
上述公式中描述的所有常量的最优值取自我引用的文章。
下面我在运行路径规划器时绘制了一个示例。
打印需要合并头文件,该文件必须与 cpp 位于同一文件夹中(您可以从我的存储库克隆的文件)。
您的程序可以按如下方式编译,
//compile g++ my_prog.cpp -o my_prog -I/usr/include/python3.8 -lpython3.8// //run ./my_prog //folder tree ├── my_prog ├── my_prog.cpp ├── matplotlibcpp.h
感谢您的阅读。