数据结构之鲸鱼算法

简介: 鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。


1 鲸鱼算法

在当代科学技术领域,解决实际问题往往需要寻找最优解或最小值。为此,研究人员设计了各种优化算法,其中一种备受关注的算法是鲸鱼算法(Whale Optimization Algorithm,WOA)。这一算法的灵感来源于鲸鱼群体在捕食过程中的集体协作和个体行为,为解决复杂问题提供了一种独特而高效的优化方法。

鲸鱼算法的起源与发展

鲸鱼算法最早由伊朗研究员Seyedali Mirjalili于2016年提出,是一种基于群体智能的全局优化算法。Mirjalili博士在设计这一算法时受到了鲸鱼捕食行为的启发,这使得算法具有与自然界相似的协同和集体智能特征。

在过去的几十年里,启发式算法和进化算法在解决复杂问题方面取得了显著的进展。鲸鱼算法的提出是对这一领域的有益补充,它结合了群体智能、生物启发和数学优化的思想,为复杂问题的求解提供了一种全新的角度。

2.鲸鱼群体行为的启示

鲸鱼作为群居的哺乳动物,在捕食时展现出高度的智能和协同性。它们通过相互合作,使用多种捕食策略,如包围猎物和喷出气泡的汽包网。这种群体智能行为引发了研究人员对于将这一思想转化为解决优化问题的方法的兴趣。

鲸鱼算法的核心思想是通过模拟鲸鱼的两种捕食行为来寻找问题的最优解。包围猎物的行为类似于全局搜索,而汽包网的行为则相当于局部搜索。这种综合运用全局和局部搜索的策略使得鲸鱼算法在不同类型的问题上表现出色。

3.鲸鱼算法的应用领域

鲸鱼算法在短时间内吸引了广泛的关注,并在多个领域得到了应用。其适用范围涵盖了函数优化、机器学习、图像处理、电力系统优化等多个领域。鲸鱼算法的优势在于其简单而直观的思想,以及对问题解空间的全局搜索和局部搜索能力。

2 算法分析

鲸鱼算法的复杂和基本步骤:

初始化种群: 随机生成一群鲸鱼,每个鲸鱼代表问题的一个潜在解。

计算适应度: 计算每只鲸鱼的适应度,即其对问题的解的质量评估。

确定领导鲸鱼: 选择适应度最好的鲸鱼作为领导者。

更新位置: 所有鲸鱼根据一定的规则更新其位置。

这包括模拟鲸鱼围捕猎物的两种行为:包围猎物和汽包网。

包围猎物: 鲸鱼群体向着其他鲸鱼的方向移动,以达到包围猎物的效果。

汽包网: 鲸鱼采用环形游动的方式,通过喷出气泡来驱赶猎物。

调整参数: 根据算法的设计,调整一些控制参数,以保持搜索的多样性和收敛性。

重复迭代: 重复上述步骤,直到达到预定的停止条件(如迭代次数达到设定值或找到满足要求的解)。

3 代码结果

这是鲸鱼算法的代码结果,每一次迭代输出了领导者的位置和适应度值。我对结果进行简要的分析:

初始阶段(Iteration 1-5):

    在初始阶段,领导者的位置和适应度值有所波动,算法在搜索空间中进行了随机探索。

逐步收敛(Iteration 6-15):

    随着迭代次数的增加,领导者的位置逐渐向最优解的方向移动,适应度值逐渐增加。算法开始逐步收敛向较优解。

收敛和震荡(Iteration 16-35):

    在一定阶段,算法可能遇到局部最优解,导致领导者的位置在一定范围内震荡。这是常见的优化算法现象,可能需要调整参数或引入更复杂的策略以克服局部最优。

继续搜索(Iteration 36-50):

    算法继续搜索并尝试跳出局部最优,领导者的位置有一定的波动。在这个过程中,算法可能会探索新的解空间,寻找更优的解。

    总体而言,这个结果展示了鲸鱼算法的基本行为,包括随机探索、逐步收敛、可能的局部最优震荡以及继续搜索的过程。算法的性能和结果可能受到初始种群的影响,以及算法参数的选择。在实际应用中,对算法进行调优和参数选择是常见的任务,以获得更好的优化性能。

4 算法优缺点

优点:

全局优化能力: 鲸鱼算法具有全局搜索的能力,能够在搜索空间中寻找全局最优解。这使得它在处理复杂、多峰、高维度的优化问题时表现较好。

    易于理解和实现: 算法的基本思想模拟了鲸鱼的捕猎行为,因此相对易于理解和实现。这使得鲸鱼算法对于初学者来说是一种较为友好的优化算法。

    适用性广泛: 鲸鱼算法并不对问题的具体形式有特殊的要求,因此可以应用于多种类型的优化问题,包括数值优化、参数调整等。

缺点:

参数敏感性: 鲸鱼算法的性能可能受到参数设置的影响,如学习率、收敛条件等。不同的问题可能需要不同的参数配置,而寻找合适的参数可能需要一定的试验和调整。

    局部最优解: 像许多优化算法一样,鲸鱼算法也可能陷入局部最优解,特别是在搜索空间存在多个局部最优解的情况下。这可能导致算法在找到全局最优解之前停滞在某个局部最优解。

    收敛速度: 鲸鱼算法的收敛速度可能相对较慢,特别是在高维度问题上。这可能需要更多的迭代次数才能达到满意的优化结果。

    对初始解的依赖性: 初始鲸鱼群体的选择可能对算法的性能产生影响,不同的初始解可能导致不同的优化结果。因此,需要谨慎选择初始解。

    总体而言,鲸鱼算法是一种灵活且易于理解的优化算法,但在应用时需要注意参数调整和对初始解的选择。在具体问题中,选择合适的优化算法通常涉及到对问题性质和算法特性的深入理解。

6 附件之源代码

#include <iostream>

#include <cmath>

#include <cstdlib>

#include <ctime>



// 定义链表节点

struct Node {
   

    double position;  // 鲸鱼的位置

    double fitness;   // 适应度值

    Node* next;       // 下一个节点

};



// 定义鲸鱼群体

class WhalePopulation {
   

private:

    Node* head;        // 链表头

    int populationSize; // 群体大小



    // 初始化链表

    void initializePopulation() {
   

        head = nullptr;

        for (int i = 0; i < populationSize; ++i) {
   

            insertNode(rand() % 100);  // 随机生成初始位置

        }

    }



    // 插入节点到链表

    void insertNode(double position) {
   

        Node* newNode = new Node{
   position, 0, nullptr};

        if (!head) {
   

            head = newNode;

        } else {
   

            newNode->next = head;

            head = newNode;

        }

    }



    // 计算适应度值(示例使用简单的目标函数 x^2)

    void calculateFitness() {
   

        Node* current = head;

        while (current) {
   

            current->fitness = pow(current->position, 2);

            current = current->next;

        }

    }



    // 选择领导者

    Node* selectLeader() {
   

        Node* current = head;

        Node* leader = current;

        while (current) {
   

            if (current->fitness < leader->fitness) {
   

                leader = current;

            }

            current = current->next;

        }

        return leader;

    }



    // 更新位置(简单的示例,每个鲸鱼在[-1, 1]范围内随机移动)

    void updatePositions() {
   

        Node* current = head;

        while (current) {
   

            double randomMove = (rand() % 201 - 100) / 100.0; // [-1, 1]

            current->position += randomMove;

            current = current->next;

        }

    }



public:

    // 构造函数

    WhalePopulation(int size) : populationSize(size) {
   

        initializePopulation();

    }



    // 执行鲸鱼算法

    void runAlgorithm(int iterations) {
   

        for (int iter = 0; iter < iterations; ++iter) {
   

            calculateFitness();

            Node* leader = selectLeader();

            std::cout << "Iteration " << iter + 1 << ": Leader position = " << leader->position

                      << ", Fitness = " << leader->fitness << std::endl;

            updatePositions();

        }

    }



    // 销毁链表

    ~WhalePopulation() {
   

        Node* current = head;

        while (current) {
   

            Node* temp = current;

            current = current->next;

            delete temp;

        }

    }

};



int main() {
   

    srand(static_cast<unsigned>(time(nullptr)));



    // 创建鲸鱼群体,初始大小为10

    WhalePopulation whalePopulation(10);



    // 运行鲸鱼算法,迭代次数为50次

    whalePopulation.runAlgorithm(50);



    return 0;

}
相关文章
|
10天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
14天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
5天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
11天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
6天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
21天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3960 5
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
10天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
533 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
9天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
17天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
998 3
|
14天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
453 18
白话文讲解大模型| Attention is all you need