群体优化算法----多乌鸦搜寻算法介绍,找多目标函数组解,Pareto前沿

介绍

乌鸦搜寻算法(Crow Search Algorithm,CSA)是一种新型的群体智能优化算法,其灵感来源于乌鸦的行为特性,尤其是乌鸦在食物搜寻和藏匿过程中的智能行为。乌鸦是一种高度聪明的鸟类,它们展示出复杂的社会行为和问题解决能力,这些特性为算法的设计提供了启发

乌鸦搜寻算法的基本概念

乌鸦搜寻算法的核心思想是模拟乌鸦寻找和藏匿食物的行为。具体来说,乌鸦会记住其他乌鸦藏匿食物的位置,并且在必要时会尝试偷取它们的食物。此外,乌鸦在找到食物后,会选择一个隐蔽的地方藏起来,以防止其他乌鸦偷取

算法的基本步骤

初始化种群:在算法的初始阶段,会随机生成一群乌鸦,每只乌鸦代表一个解。种群的每个成员都被赋予一个随机的位置,这个位置对应于解空间中的一个解。

记忆位置:每只乌鸦都会记住一个位置,这个位置代表它当前认为最好的解(即找到的食物位置)。

更新位置:每个迭代过程中,乌鸦会根据以下规则更新其位置:

乌鸦会随机选择其他乌鸦作为参考对象,尝试靠近它们的位置。
乌鸦在移动过程中会有一定的概率被其他乌鸦发现并被偷取食物。
为了避免被其他乌鸦发现,乌鸦在移动时会选择一个随机方向并更新位置。
存储最优解:在每个迭代结束时,算法会检查种群中是否有新的更优解,如果有则更新全局最优解。

数学表示

乌鸦搜寻算法的数学模型如下:
设 𝑋𝑖(𝑡) 表示第 𝑖i 只乌鸦在第 𝑡t次迭代中的位置, 𝑀𝑖(𝑡) 表示第 𝑖只乌鸦在第 𝑡t次迭代中记住的最佳位置。

乌鸦位置更新的公式为:
在这里插入图片描述
其中:
𝑟是一个在 [0,1][0,1] 之间的随机数。𝐴𝑃是第 𝑗只乌鸦的发现概率,表第 𝑗 只乌鸦在更新位置时被其他乌鸦发现的概率。𝑟𝑎𝑛𝑑 是一个随机方向量𝑠𝑡𝑒𝑝𝑠𝑖𝑧𝑒 是步长,控制每次移动的距离

算法的优点和应用

乌鸦搜寻算法具有以下几个显著的优点:
简单易实现:算法的步骤和更新规则相对简单,易于理解和实现。
全局搜索能力强:由于乌鸦具有记忆和偷窃行为,算法在搜索空间中能够有效地跳出局部最优,具有较强的全局搜索能力。
适应性强:乌鸦搜寻算法能够适应多种不同类型的优化问题,包括连续和离散的优化问题

应用领域

乌鸦搜寻算法可以应用于许多领域,包括但不限于:

工程优化:例如结构优化、参数调优等。
机器学习:用于优化模型参数、特征选择等。
图像处理:例如图像分割、边缘检测等。
网络优化:例如路由优化、资源分配等

本文代码

我们编写一个多目标乌鸦搜寻算法(Multi-Objective Crow Search Algorithm, MOCSA)来同时优化多个目标函数。多目标优化问题需要找到一组解,这些解在多个目标函数之间取得一个折衷,即Pareto前沿

示例多目标优化问题:
假设我们要同时优化以下两个目标函数:
在这里插入图片描述
目标是在二维搜索空间内找到Pareto最优解集

核心代码

function MOCSA
    % 参数设置
    n = 50; % 乌鸦数量
    dim = 2; % 问题维度
    maxIter = 500; % 最大迭代次数
    lb = -5.12; % 变量下界
    ub = 5.12; % 变量上界
    
    % 初始化乌鸦的位置
    X = lb + (ub - lb) * rand(n, dim);
    % 初始化乌鸦的记忆位置
    M = X;
    % 计算初始适应度
    fitness = arrayfun(@(i) evaluate_objectives(X(i,:)), 1:n, 'UniformOutput', false);
    fitness = vertcat(fitness{:});
    
    % Pareto前沿初始化
    [ParetoFront, ParetoSet] = update_pareto(X, fitness);
    
    % 动态参数
    initialStepSize = 1.0;
    finalStepSize = 0.1;
    initialAP = 0.1;
    finalAP = 0.9;
    
    for t = 1:maxIter
        % 动态调整步长和发现概率
        stepSize = initialStepSize - (initialStepSize - finalStepSize) * (t / maxIter);
        AP = initialAP + (finalAP - initialAP) * (t / maxIter);
        
        for i = 1:n
            % 随机选择其他乌鸦
            j = randi(n);
            while j == i
                j = randi(n);
            end
            
            % 更新位置
            r = rand;
            if r <= AP
                % 被发现,随机移动
                X(i,:) = X(i,:) + stepSize * (2 * rand(1, dim) - 1);
            else
                % 未被发现,向记忆位置移动
                X(i,:) = X(i,:) + rand * (M(j,:) - X(i,:));
            end
            
            % 边界处理
            X(i,:) = max(min(X(i,:), ub), lb);
            
            % 计算新位置的适应度
            newFitness = evaluate_objectives(X(i,:));
            
            % 更新记忆位置
            if dominates(newFitness, fitness(i,:))
                M(i,:) = X(i,:);
                fitness(i,:) = newFitness;
            end
        end
        
        % 更新Pareto前沿
        [ParetoFront, ParetoSet] = update_pareto([ParetoSet; X], [ParetoFront; fitness]);
        
        % 打印当前Pareto前沿的大小
        fprintf('Iteration %d: Pareto Front Size = %d\n', t, size(ParetoFront, 1));
    end
    
    % 绘制Pareto前沿
    plot_pareto(ParetoFront);
end

% 评估目标函数
function objectives = evaluate_objectives(x)
    f1 = sum(x.^2);
    f2 = 10 * numel(x) + sum(x.^2 - 10 * cos(2 * pi * x));
    objectives = [f1, f2];
end

% 更新Pareto前沿
function [ParetoFront, ParetoSet] = update_pareto(Pop, Fitness)
    n = size(Fitness, 1);
    isDominated = false(n, 1);
    ParetoFront = Fitness(~isDominated, :);
    ParetoSet = Pop(~isDominated, :);
end

% 判定是否支配
function flag = dominates(f1, f2)
    flag = all(f1 <= f2) && any(f1 < f2);
end

% 绘制Pareto前沿
function plot_pareto(ParetoFront)
    figure;
    plot(ParetoFront(:,1), ParetoFront(:,2), 'ro');
    xlabel('f1');
    ylabel('f2');
    title('Pareto Front');
    grid on;
end

说明

初始化阶段:生成初始种群,计算每只乌鸦在两个目标函数上的适应度,并初始化Pareto前沿。
动态参数调整:在每次迭代中,根据当前迭代次数动态调整步长(step size)和发现概率(AP)。
位置更新:每只乌鸦随机选择另一只乌鸦作为参考,根据AP决定是否移动到记忆位置或随机移动,并更新适应度和记忆位置。
Pareto前沿更新:在每次迭代结束时,更新Pareto前沿,保留非支配解。
绘制Pareto前沿:在算法结束时,绘制最终的Pareto前沿

效果

在这里插入图片描述

完整代码获取

微信扫一扫,回复"多乌鸦搜寻算法"
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/707030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对补码的理解:两种求法

课本的结论是&#xff1a;二进制数的最高位是符号位。符号位为 0 表示正数和 零 &#xff0c;符号位为 1 表示负数。 正数是原码反码补码都是一样的。负数的反码是&#xff1a;符号位不变&#xff0c;剩下位取反。 负数的补码是&#xff1a;符号位不变&#xff0c;剩下位取反&a…

eclipse创建maven项目

第一步&#xff1a;打开eclipse 我们选择java项目即可 点击finish即可 它会自动下载插件 然后在控制台上输入Y即可

ChatGPT:自然语言处理的新纪元与OpenAI的深度融合

随着人工智能技术的蓬勃发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进步。OpenAI作为这一领域的领军者&#xff0c;以其卓越的技术实力和创新能力&#xff0c;不断推动着NLP领域向前发展。其中ChatGPT作为OpenAI的重要成果更是在全球范围内引起了…

HAL库--内存保护(MPU)实验

MPU是内核外设&#xff0c;想获取相关资料只能从内核手册查找 MPU功能仅F7/H7系列具备 内存保护单元(MPU介绍) MPU基本介绍 说白了MPU用来管理内存和外设存储区的访问权限 MPU可配置保护8/16个内存区域(看芯片型号)&#xff0c;每个区域最小要求256字节&#xff0c;且每个区…

C++ | Leetcode C++题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution { public:int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}int maxPoints(vector<vector<int>>& points) {int n points.size();if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i…

阿里云运维第一步(监控):开箱即用的监控

作者&#xff1a;仲阳 这是云的时代&#xff0c;现在云计算已经在各行各业广泛的应用。但是上云对于大多数客户来说&#xff0c;依然有很大的学习成本&#xff0c;如下图仅是阿里云都有几百款产品&#xff0c;怎么选择&#xff1f;怎么用&#xff1f;对于客户来说都是问题。“…

高温车间降温通风方案

高温车间降温&#xff0c;解决厂房高温闷热必须做到以下两点才能实现&#xff0c;否则即使安装中央空调也没用&#xff1a;一、解决厂房内部热量 通过通排风负压风机、环保空调、工业大风扇等常用排热降温设备&#xff0c;降低室内温度&#xff1b;二、屏蔽外部太阳热源 …

5.0 Python 函数简介

1.函数 1.1 基本定义 定义: 将一组语句的集合通过函数进行封装, 简单来说是具有一定功能的代码容器, 想要执行这些语句, 只需要调用函数的名称即可. 特性: * 1. 可重复使用, 减少代码冗余. * 2. 组织结构清晰, 可读性增强. * 3. 可扩展性提高, 便于维护. 1.2 使用规则 函…

OpenCV学习(4.13) 霍夫变换

1.霍夫变换 霍夫变换&#xff08;Hough Transform&#xff09;是图像处理中的一种技术&#xff0c;主要用于检测图像中的直线、圆或其他形状。它通过将图像空间中的点映射到参数空间来实现&#xff0c;这样&#xff0c;图像空间中在同一直线上的点在参数空间中会形成一条曲线&…

CentOS系统自带Python2无法使用pip命令

Linux运维工具-ywtool 目录 一. 系统环境二.解决三.验证四.备注(1)输入"yum install -y python-pip",提示没有可用 python-pip包(2)安装完pip后进行升级 一. 系统环境 centos7系统自带的python2.7无法使用pip命令 二.解决 yum install python-pip -y三.验证 pip…

用PlayCanvas打造一个3D模型

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 PlayCanvas 的 3D 物理场景开发 应用场景介绍 PlayCanvas 是一款功能强大的 3D 引擎&#xff0c;可用于创建各种类型的 3D 体验&#xff0c;包括游戏、模拟和交互式可视化。本技术博客将介绍如何使用 Pl…

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 如何读取 Cache 内部数据并对其进行解析?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现测试结果Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加…

企业中的绩效管理

背景 企业中为何需要绩效管理&#xff0c;企业绩效管理为何比较难&#xff0c;这在企业管理中是非常难&#xff0c;同样也是非常有价值的命题&#xff0c;那么首先应该对这个命题有清晰的认知&#xff0c;特别是要想明白为何企业需要绩效管理&#xff0c;应该先明白企业。 企…

2024 年 19 种最佳大型语言模型

大型语言模型是 2023 年生成式人工智能热潮背后的推动力。然而&#xff0c;它们已经存在了一段时间了。 LLM是黑盒 AI 系统&#xff0c;它使用深度学习对超大数据集进行处理&#xff0c;以理解和生成新文本。现代 LLM 开始成型于 2014 年&#xff0c;当时一篇题为“通过联合学…

妙用OSGraph:发掘GitHub知识图谱上的开源故事

作者&#xff1a;范志东 1. 何为OSGraph&#xff1f; OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具&#xff0c;基于GitHub开源数据全域图谱&#xff0c;实现开发者行为、项目社区生态的分析洞察。可以为开发者、项目Owner、开源布道师、社区运营等提供简洁直观的…

手机如何扫描拍照?方法分享

手机如何扫描拍照&#xff1f;在数字化时代&#xff0c;手机扫描拍照软件已经成为我们日常生活和工作中不可或缺的工具。无论是快速识别纸质文档&#xff0c;还是将照片中的文字转化为可编辑的文本&#xff0c;这些软件都为我们提供了极大的便利。然而&#xff0c;市面上的手机…

msvcp110.dll有什么解决方案,msvcp110.dll几种方法详细步骤教程

本文旨在探讨如何应对电脑出现 vcruntime140_1.dll 无法继续执行代码错误提示的问题。同时&#xff0c;将阐释该文件的作用&#xff0c;列举常见的错误问题&#xff0c;并提供一些在修复 vcruntime140_1.dll 时的注意事项&#xff0c;以避免在解决过程中引发其他问题。接下来&a…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

如何获知lib cell的用途

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 除了databook可以查询cell的用途外&#xff0c;还可以通过在pr工具中获取lib cell属性的方法知晓其用途。 ICC2: report_attribute -app -class lib_cell SDFFXXX 通过看is_…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…