当前位置: 首页 > article >正文

路径规划之启发式算法之三:鲸鱼优化算法(Whale Optimization Algorithm)

        鲸鱼优化算法(Whale Optimization Algorithm,WOA)是一种基于自然启发的优化算法,由S. Mirjalili及其同事在2016年提出。

一、算法背景与灵感

        鲸鱼优化算法是模拟自然界中座头鲸群体的狩猎行为,特别是座头鲸通过“气泡网捕食”策略来捕捉猎物的过程。其核心思想是通过模拟鲸鱼群的自组织和自适应性来寻找最优解。鲸鱼在寻找食物和避免敌人时会进行探索和互动行为,这些行为会影响鲸鱼群的动态过程,而鲸鱼群的适应性则通过评价函数来衡量,目标是找到使评价函数值最小的解。

二、算法原理与步骤

        1. 鲸鱼优化算法的原理

        WOA模拟了座头鲸特有的搜索方法和围捕机制,主要包括三个重要阶段:围捕猎物、气泡网捕食、搜索猎物。在WOA中,每个座头鲸的位置代表一个潜在解,通过在解空间中不断更新鲸鱼的位置,最终获得全局最优解。

        2.鲸鱼优化算法的主要步骤

        (1)初始化:随机生成一组鲸鱼的位置和速度作为算法的初始状态,这些解被称为鲸鱼个体,即这些鲸鱼个体代表了解空间中的潜在最优解。同时,设置算法的相关参数,如鲸鱼数量、最大迭代次数等。

        (2)适应度评估:计算每个鲸鱼个体的适应度值,根据优化问题的目标函数来评估解的质量。适应度值越高的个体表示其解越优秀。

        (3)包围猎物(Encircling Prey):假设当前种群的最优个体是猎物(即当前最优解),种群中其他鲸鱼个体均向最优鲸鱼位置(或随机选择的鲸鱼)包围来更新其自身位置。这一过程通过特定的数学公式实现,使鲸鱼个体逐步逼近最优解。位置更新公式如下:

        其中,X(t+1)表示鲸鱼在t+1时刻的位置,X^{*}(t)表示时刻猎物的位置(即当前最优解),A为收缩包围系数,D为鲸鱼与猎物之间的距离。

        收缩包围系数A的计算公式为:

        其中,a为线性递减权重,其值随着迭代次数的增加而减小,rand为0到1之间的随机数。

        距离D的计算公式为:

        其中,C为随机系数,X(t)为鲸鱼在t时刻的位置。

        (4)气泡网捕食(Bubble-net Attacking):模拟鲸鱼围绕猎物进行的螺旋形游动,将这一过程用于局部搜索。鲸鱼个体通过螺旋上升的方式逐步逼近猎物(当前最优解)。这一步骤同样通过特定的数学公式实现,包括收缩包围和螺旋更新两个子步骤。位置更新公式为:

        其中,D^{*}为鲸鱼与猎物之间的距离的绝对值,bl为螺旋形状控制参数,e为自然对数的底数。

        (5)随机搜索(Search for Prey):在某些情况下,鲸鱼个体会进行随机搜索以增强探索能力,避免陷入局部最优。当满足特定条件时(如A的绝对值大于等于1),鲸鱼会根据其位置随机搜索和捕食。采用包围猎物的位置更新公式进行。

        (6)更新全局最佳解:根据适应度信息更新全局最佳解,以指导鲸鱼个体的下一步搜索。

        (7)迭代:重复上述步骤,直到满足停止条件(如达到最大迭代次数或找到满意的解)。

        以下是算法的流程图:

        3.参数计算公式

        (1)线性递减权重a

        a的值随着迭代次数的增加而线性递减,计算公式为:

        其中,t为当前迭代次数,Maxlter为最大迭代次数。

        (2)随机系数C

        C为0到2之间的随机数,用于增加搜索的多样性。

        (3)螺旋形状控制参数l

        l为-1到1之间的随机数,用于控制螺旋形状的变化。

        (4)其他公式

        在鲸鱼优化算法中,还涉及到一些其他公式,如鲸鱼位置的初始化公式、适应度计算公式等,但这些公式通常与具体问题和应用场景相关。

三、算法特点与优势

        鲸鱼优化算法具有以下特点和优势:

  1. 全局搜索能力强:通过模拟鲸鱼的捕食行为,算法能够在搜索空间中进行全局搜索,避免陷入局部最优解。
  2. 收敛速度快:算法具有快速收敛的特点,能够在较短的时间内找到全局最优解或近似最优解。
  3. 算法结构简单:鲸鱼优化算法的实现过程相对简单,易于理解和实现。同时,算法需要设置的参数较少,降低了调参的难度。
  4. 广泛适用性:鲸鱼优化算法适用于各种连续和离散优化问题,已在工程设计优化、机器学习参数优化、图像处理等多个领域得到了广泛应用。

四、算法应用实例

        鲸鱼优化算法已应用于多个领域,如特征规划、光伏发电短期预测、云计算任务调度、路径规划等。在这些应用中,鲸鱼优化算法展现出了良好的性能,能够有效地解决各种复杂优化问题。

五、算法改进与发展趋势

        尽管鲸鱼优化算法具有诸多优势,但仍存在一些不足之处,如参数设置较为敏感、对初始解的依赖较强等。因此,研究者们不断探索和改进算法,以提高其性能和适用范围。未来的发展趋势可能包括与其他算法的结合、在更多领域的应用以及算法本身的进一步优化和改进。

六、鲸鱼优化算法(WOA)Python代码示例

        以下是一个简单的鲸鱼优化算法(WOA)的Python代码实现,用于优化一个简单的目标函数(例如Rosenbrock函数):

        

import numpy as np

# 目标函数:Rosenbrock函数def rosenbrock(x):

    return 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2

# 初始化种群def initialize_population(pop_size, dim, lb, ub):

    return np.random.uniform(lb, ub, (pop_size, dim))

# 鲸鱼优化算法def whale_optimization_algorithm(fitness_func, lb, ub, dim, pop_size=30, max_iter=1000):

    # 初始化种群

    pop = initialize_population(pop_size, dim, lb, ub)

    # 计算适应度

    fitness = np.apply_along_axis(fitness_func, 1, pop)

    # 找到最优解

    best_idx = np.argmin(fitness)

    best_whale = pop[best_idx]

    best_fitness = fitness[best_idx]

    

    # 迭代过程

    for t in range(max_iter):

        a = 2 - t * (2 / max_iter)  # 线性减少a

        for i in range(pop_size):

            r1, r2 = np.random.rand(2)

            A = 2 * a * r1 - a

            C = 2 * r2

            p = np.random.rand()

            

            if p < 0.5:

                if abs(A) >= 1:

                    # 随机选择一个鲸鱼个体

                    random_idx = np.random.randint(0, pop_size)

                    X_rand = pop[random_idx]

                    D_X_rand = abs(C * X_rand - pop[i])

                    pop[i] = X_rand - A * D_X_rand

                else:

                    D_best = abs(C * best_whale - pop[i])

                    pop[i] = best_whale - A * D_best

            else:

                # 螺旋更新位置

                l = (a - 1) * np.exp(-1 * t / max_iter) + 1

                b = 1

                pop[i] = best_whale + (abs(pop[i] - best_whale) * np.exp(b * l) * np.cos(2 * np.pi * l))

            

            # 边界检查

            pop[i] = np.clip(pop[i], lb, ub)

            

            # 计算新的适应度

            new_fitness = fitness_func(pop[i])

            # 更新最优解

            if new_fitness < best_fitness:

                best_fitness = new_fitness

                best_whale = pop[i]

    

    return best_whale, best_fitness

# 参数设置

pop_size = 30

dim = 2

lb = -5

ub = 5

max_iter = 100

# 运行WOA

best_solution, best_solution_fitness = whale_optimization_algorithm(rosenbrock, lb, ub, dim, pop_size, max_iter)print("Best solution: ", best_solution)print("Best solution fitness: ", best_solution_fitness)

        请注意,这个代码是一个基本的实现,可能需要根据具体问题进行调整和优化。代码中使用了Rosenbrock函数作为目标函数,这是一个常用的测试函数,用于评估优化算法的性能。


http://www.kler.cn/a/420044.html

相关文章:

  • linux磁盘管理
  • 2024前端框架年度总结报告(二):新生qwik+solid和次新生svelte+Astro对比 -各自盯着前端的哪些个痛点 - 前端的区域发展差异
  • Redis设计与实现读书笔记
  • 【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?
  • 有趣的Docker
  • PLC协议
  • Anaconda3安装及使用
  • (数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?
  • Vue3学习宝典
  • 计算机毕业设计Spark+SpringBoot旅游推荐系统 旅游景点推荐 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
  • 四、初识C语言(4)
  • Python 时间和日期
  • STM32 ADC --- 知识点总结
  • 什么语言适合做 Serverless 开发?
  • Elasticsearch 集成
  • JavaEE-线程池专题
  • 斯坦福李飞飞《AI Agent:多模态交互前沿调查》论文
  • 推进汽车互联:全面物联网基础设施框架的提案
  • 牛客网刷题 | BC122 有序序列判断
  • docker部署xxl-job(含镜像打包)
  • 一键解析RAW文件,GPS定位展示,摄影师专用照片管理软件
  • 单台服务器上创建多个端口MySQL服务
  • 【Leetcode 每日一题】52. N 皇后 II
  • windows执行多个jar包脚本,若依微服务批量执行脚本
  • 安装 RabbitMQ 服务
  • Github中PAT和SSHKeys区别