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

news2024/12/25 13:41:13

介绍

乌鸦搜寻算法(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前沿

效果

在这里插入图片描述

完整代码获取

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

自适应巡航控制技术规范(简化版)

自适应巡航控制技术规范(简化版) 1 系统概述2 功能需求3 性能需求4 功能激活条件5 功能抑制条件6 系统局限性1 系统概述 ACC 自适应巡航系统可自动控制纵向跟车距离,减轻驾驶员的工作量,即驾驶员无需频繁的踩制动和油门便可完成部分的驾驶任务,但责任主体仍然是驾驶员,驾…

OrangePi AIpro测评:性能、应用与开发者体验解析

一、OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4K高…

SPI转四串口芯片CH9434的设计

一、CH9434的介绍 CH9434 是一款SPI转四串口转接芯片&#xff0c;提供四组全双工的9线异步串口&#xff0c;用于单片机/嵌入式系统扩展异步串口。CH9434包含四个兼容16C550的异步串口&#xff0c;最高支持4Mbps波特率通讯。最多支持25 路GPIO&#xff0c;提供半双工收发自动切换…

Rust基础学习-ModulesPackage

在Rust中&#xff0c;模块有助于将程序分割成逻辑单元&#xff0c;以提高可读性和组织性。一旦程序变得更大&#xff0c;将其拆分为多个文件或命名空间非常重要。 模块有助于构建我们的程序。模块是项目的集合&#xff1a;包括函数、结构体甚至其他模块。 Module 定义模块 在…

嵌入式硬件VS软件,到底哪个更难?

在嵌入式系统开发中&#xff0c;硬件和软件是密不可分的两个方面。但是&#xff0c;究竟是硬件开发更具挑战性&#xff0c;还是软件开发更难以应对呢&#xff1f;本文将就这一问题展开讨论&#xff0c;探究嵌入式硬件和软件在开发过程中的各种挑战与特点。 一、硬件开发&#…

12.实战私有数据微调ChatGLM3

实战私有数据微调ChatGLM3 实战私有数据微调ChatGLM3实战构造私有的微调数据集基于 ChatGPT 设计生成训练数据的 Prompt使用 LangChain GPT-3.5-Turbo 生成训练数据样例训练数据解析、数据增强和持久化存储自动化批量生成训练数据集流水线提示工程&#xff08;Prompt Engineer…

HTTPS请求阶段图解分析

HTTPS请求阶段分析 请求阶段分析 请求阶段分析 一个完整、无任何缓存、未复用连接的 HTTPS 请求需要经过以下几个阶段&#xff1a; DNS 域名解析、TCP 握手、SSL 握手、服务器处理、内容传输。 一个 HTTPS 请求共需要 5 个 RTT 1 RTT&#xff08;域名解析&#xff09; 1 RTT…

element table 点击某一行中按钮加载

在Element UI中&#xff0c;实现表格&#xff08;element-table&#xff09;中的这种功能通常涉及到数据处理和状态管理。当你点击某一行的按钮时&#xff0c;其他行的按钮需要动态地切换为加载状态&#xff0c;这可以通过以下步骤实现&#xff1a; 1.表格组件&#xff1a;使用…

NodeClub:NodeJS构造开源交流社区

NodeClub&#xff1a; 连接每一个想法&#xff0c;NodeClub让社区更生动- 精选真开源&#xff0c;释放新价值。 概览 NodeClub是一个基于Node.js和MongoDB构建的社区系统&#xff0c;专为开发者和社区爱好者设计。它提供了一套完整的社区功能&#xff0c;包括用户管理、内容发…

基于 Nginx Ingress + 云效 AppStack 实现灰度发布

作者&#xff1a;子丑 场景简介 灰度发布是降低生产部署风险&#xff0c;提升线上服务稳定性的重要手段&#xff0c;这在当前快速迭代的软件研发中尤为重要。相对于 K8s 默认的滚动部署或者简单的 Pod 分批&#xff0c;基于流量特征的灰度发布验证更精准&#xff0c;风险更低…

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包&#xff0c;可以拿到包含flag的txt文件。…

buuctf----warmup_csaw_2016

进来医院先来一套常规检查 啥保护都没,看大佬说基本栈溢出 CT一看 OK cat flag 更喜欢了 40060D 找到地址 get也来了,稳啦! 0x80-0x40 8 根据上道题的exp from pwn import * ghust remote("node5.buuoj.cn",27229) addr 0x40060D payload bA * 0x40 bB*8…

SpringMVC-基础架构

一、什么是MVC 二、什么是SpringMVC 三、SpringMVC的特点 四、配置SpringMVC 简单流程&#xff1a; 总体框架 1.创建pom.xml依赖 <!--打包方式--><packaging>war</packaging><!--依赖--><dependencies><dependency><groupId>org.s…

路由器怎么设置局域网?

局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是指在一个相对较小的地理范围内&#xff0c;如家庭、办公室或学校等&#xff0c;通过路由器等设备连接起来的计算机网络。设置局域网可以方便地实现内部资源共享和信息交流。本文将介绍如何设置局域网以及一个…

C# 设置PDF表单不可编辑、或提取PDF表单数据

PDF表单是PDF中的可编辑区域&#xff0c;允许用户填写指定信息。当表单填写完成后&#xff0c;有时候我们可能需要将其设置为不可编辑&#xff0c;以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。 之前文章详细介绍过如何使用免费Spire.PDF…

晶振的匹配电容的计算

晶振 等效电路 C0是晶振的静态电容 L1是晶振的等效电感 C1是晶振的等效电容 R1是晶振的等效串联电阻 芯片内部已有反相器和负载电阻 计算公式 参考1 参考2

maven 显式依赖包包含隐式依赖包,引起依赖包冲突

问题&#xff1a;FlinkCDC 3.0.1 代码 maven依赖包冲突 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包&#xff0c;有多个不同的版本&#xff0c;因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它…

Mongodb在UPDATE操作中使用$push向数组中插入数据

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第69篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

基数排序O(n)时间复杂度的实现

基数排序O(n)时间复杂度的实现 前言 之前写过一篇文章六种常见排序算法分析与实现&#xff0c;讲了六种常见的排序算法&#xff0c;但是没有了解到桶排序&#xff0c;基数排序这两种排序算法&#xff0c;今天刷LeetCode发现了这两种算法&#xff0c;本文先来聊聊基数排序的思…