群体智能优化算法-爱情进化算法 (Love Evolution Algorithm, LEA,含Matlab源代码)

ops/2025/3/19 13:41:34/

摘要

爱情进化算法(LEA)是一种基于心理学刺激-价值-角色理论(Stimulus-Value-Role Theory)所提出的新型元启发式算法。该算法将“恋爱中的人”抽象为种群个体,通过对个体“幸福度(Happiness)”的定义和动态更新,模拟了从“相遇 -> 价值交流 -> 角色平衡”三个阶段不断逼近全局最优解的过程。LEA 在高维连续优化与工程应用等场景下可实现对搜索空间的充分探索与精细开发。本文结合算法原理,呈现 LEA 的完整 MATLAB 代码以及中文详细注释,以便读者深入理解并快速应用此算法


1. 算法介绍

1.1 理论背景:刺激-价值-角色 (SVR) 理论

  1. 刺激(Stimulus)
    • 两个体初次见面,对对方外在的“刺激”做出评估或回应,作为后续了解的基础。
  2. 价值(Value)
    • 进一步通过“价值”层面的沟通,双方交换信息,以判断是否能维持更深层次的关系。
  3. 角色(Role)
    • 随着关系发展,双方开始确定各自角色地位并进行长期合作,对搜索问题而言即在最优解附近进行精细开发。

LEA 将这三大阶段对应为三个主要更新算子:相遇、价值交互和角色平衡,并结合记忆机制以及边界映射策略来保证全局搜索的多样性和局部开发的精度。

1.2 算法流程简述

  1. 初始化种群
    • [lb, ub] 范围内随机生成 N 个个体坐标,并计算其初始“幸福度”(适应度)。
    • 记录其中全局最优个体(H_G, G)。
  2. 参数定义
    • h_max, h_min:幸福度上下限,用于在后期调节个体间交互强度;
    • lambda_c, lambda_p:刺激阈值与角色平衡阈值,决定何时进入价值交互或角色平衡等算子;
    • 其他系数:结合双曲衰减、正态扰动等手段,以保持搜索多样性。
  3. 主循环
    • 相遇 (Encounter):随机将种群划分为两半 (A, B),进行配对;
    • 刺激 (Stimulus) 阶段:计算个体间差异 (Gap) 并确定进入“价值”或“角色”算子;
    • 价值 (Value) 阶段:若 c < lambda_c,分别对 A、B 中的个体用公式进行“价值交换”更新位置 (Equations (11-14));
    • 角色 (Role) 阶段:若 p < lambda_p,则在 eq.(16) 中进行角色平衡,否则进行“反射操作” (Reflection);
    • 记忆机制:更新后检查越界并映射回搜索范围,同时更新全局最优个体 (H_G, G)。
  4. 终止条件
    • 当函数评估次数 FE > MaxFEs 或达到了给定终止标准后,算法停止,输出全局最优解及收敛曲线。

2. 完整 MATLAB 代码及中文注释

以下为 LEA(爱情进化算法)的 MATLAB 源代码:

function [ H_G,G, CV] = LEA (N, MaxFEs, lb, ub, dim, fun)
%% LEA (Love Evolution Algorithm)
% 
% 输入参数:
%   N          : 种群规模 (个体数量)
%   MaxFEs     : 最大函数评估次数
%   lb, ub     : 搜索空间的上下界 (可为标量或向量)
%   dim        : 问题维度
%   fun        : 目标函数句柄(返回适应度)
%
% 输出参数:
%   H_G        : 最优解对应的最优适应度(幸福度)
%   G          : 全局最优解位置
%   CV         : 收敛曲线(记录每次评估的全局最优适应度)CV  = zeros (1, MaxFEs);      % 记录每次函数评估后全局最优适应度
[X,lb,ub] = Initialization(N,dim,ub,lb);  % 生成初始种群
FE = 0;                                  % 函数评估计数器
H = zeros (N, 1);                        % 存储每个个体的幸福度
H_G = inf;                               % 全局最优幸福度(初始化为∞)%% (A) 初始化计算
for i = 1:NH(i) = fun (X(i,:));  % 计算适应度FE = FE+1;if H_G>H(i)H_G = H(i);G   = X(i,:);  % 全局最优位置endCV(FE) = H_G;  % 收敛曲线记下本次评估后全局最优
end% (B) 参数定义
h_max = 0.7;    % 幸福度最大值
h_min = 0;      % 幸福度最小值
lambda_c = 0.5; % 阈值: 刺激阶段后续判断
lambda_p = 0.5; % 阈值: 角色阶段后续判断%% 主要循环: 直到 FE >= MaxFEs
while FE<MaxFEs% (1) 动态调节 h (幸福度): Eq.(17)h = (1 - FE/MaxFEs)*(h_max - h_min) + h_min;% == 遇见(Encounter)==% 随机打乱 N 个体,前 N/2 -> A, 后 N/2 -> Br = randperm(N);A = X(r(1:N/2),:);B = X(r(N/2+1:end),:);H_A = H(r(1:N/2));H_B = H(r(N/2+1:end));% (2) 刺激阶段 (Stimulus Phase)c = Gap_P(H_A,H_B); % Eq.(6): 计算刺激值 c(i)mu = sum( sqrt( sum( (X - G).^2 ) / N ) )/dim + eps; % Eq.(10), 计算平均距离?for i = 1:N/2% 若 c(i) < lambda_c => 进入价值阶段 (Value Phase)if c(i) < lambda_c% 进行价值交互, eq.(11~14)for j = 1:dimphi1 = G(:,j)*A(i,j);phi2 = G(:,j)^2 + A(i,j)*B(i,j);phi3 = G(:,j)*B(i,j);rho_A = sqrt( (phi2 - phi1)^2 ); rho_B = sqrt( (phi2 - phi3)^2 );% A(i,j), B(i,j)更新, eq.(13)(14)A(i,j) = rand* A(i,j) + randn*rho_A;B(i,j) = rand* B(i,j) + randn*rho_B;end% (3) 更新并映射, eq.(19) => A(i,:), B(i,:)FE = FE+1; if FE>MaxFEs; break; end[A(i,:),H_A(i),G,H_G,CV] = Update_A_mod(A(i,:),CV,FE,G,H_G,ub,lb,fun);FE = FE+1; if FE>MaxFEs; break; end[B(i,:),H_B(i),G,H_G,CV] = Update_B_mod(B(i,:),CV,FE,G,H_G,ub,lb,fun);% (4) Role 可能性 p(i), eq.(15)p(i) = (rand+0.5)* c(i)* sum( sqrt( (A(i,:) - B(i,:)).^2 ) )/(dim*mu);if p(i) < lambda_p% (4.1) 角色阶段 eq.(16),(18)xi = A(i,:).* B(i,:);xi = ( xi - min(xi) )/( max(xi)-min(xi)+ eps ) + h; % eq(16)for j=1:dimA(i,j) = G(:,j) + randn* mu* xi(j);B(i,j) = G(:,j) + randn* mu* xi(j);endelse% (4.2) Reflection operation for j=1:dim% eq.(7)(8)(9) in code => sA = (3*rand-1.5)*(A(i,j)/(B(i,j)+eps));sB = (3*rand-1.5)*(B(i,j)/(A(i,j)+eps));z = randi(dim);k = randi(dim);delta = 0.5*( A(i,z)/(ub(z)-lb(z)) + B(i,k)/(ub(k)-lb(k)) );A(i,j)= G(:,j) + sA*mu*delta;B(i,j)= G(:,j) + sB*mu*delta;endendelse% (5) 若 c(i)>=lambda_c => 直接 Reflection operationfor j=1:dimsA = (3*rand-1.5)*( A(i,j)/(B(i,j)+eps) );sB = (3*rand-1.5)*( B(i,j)/(A(i,j)+eps) );z  = randi(dim);k  = randi(dim);delta = 0.5*( A(i,z)/(ub(z)-lb(z)) + B(i,k)/(ub(k)-lb(k)) );A(i,j)= G(:,j) + sA*mu*delta;B(i,j)= G(:,j) + sB*mu*delta;endend% eq(20), continue updatesFE = FE+1; if FE>MaxFEs; break; end[A(i,:),H_A(i),G,H_G,CV] = Update_A_ordinary(A(i,:),CV,FE,G,H_G,ub,lb,fun);FE = FE+1; if FE>MaxFEs; break; end[B(i,:),H_B(i),G,H_G,CV] = Update_B_ordinary(B(i,:),CV,FE,G,H_G,ub,lb,fun);end% 重组群体 X, HX = [A; B];H = [H_A; H_B];
end
end% Eq.(6)
function p = Gap_P(f1, f2)
% c = (0.5+rand)*(f1 - f2)^2, 归一化
p = (0.5+rand(length(f1),1)).*( f1 - f2 ).^2;
p = p./( max(p)+min(p)+eps );
end% Eq.(20) => update normal
function [Ax,Ah,G,hG,CV] = Update_A_ordinary(Ax,CV,FE,G,hG,ub,lb,fun)
AubE = Ax>ub; 
AlbE = Ax<lb;
Ax(:,AubE) = ub(AubE);
Ax(:,AlbE) = lb(AlbE);
Ah = fun(Ax);if hG>AhhG = Ah;G  = Ax;
end
CV(FE) = hG;
endfunction [Bx,Bh,G,hG,CV] = Update_B_ordinary(Bx,CV,FE,G,hG,ub,lb,fun)
BubE = Bx>ub;
BlbE = Bx<lb;
Bx(:,BubE) = ub(BubE);
Bx(:,BlbE) = lb(BlbE);
Bh = fun(Bx);if hG>BhhG = Bh;G  = Bx;
end
CV(FE) = hG;
end% eq.(19) => update mod
function [Ax,Ah,G,hG,CV]=Update_A_mod(Ax,CV,FE,G,hG,ub,lb,fun)
AubE = Ax>ub;
AlbE = Ax<lb;
Ax(:,AubE) = mod(Ax(:,AubE),ub(AubE)+eps)./(ub(AubE)+eps).*(ub(AubE)-lb(AubE)) + lb(AubE);
Ax(:,AlbE) = mod(Ax(:,AlbE),lb(AlbE)+eps)./(lb(AlbE)+eps).*(ub(AlbE)-lb(AlbE)) + lb(AlbE);
Ah = fun(Ax);if hG>AhhG = Ah;G  = Ax;
end
CV(FE) = hG;
endfunction [Bx,Bh,G,hG,CV]=Update_B_mod(Bx,CV,FE,G,hG,ub,lb,fun)
BubE = Bx>ub;
BlbE = Bx<lb;
Bx(:,BubE) = mod(Bx(:,BubE),ub(BubE)+eps)./(ub(BubE)+eps).*(ub(BubE)-lb(BubE)) + lb(BubE);
Bx(:,BlbE) = mod(Bx(:,BlbE),lb(BlbE)+eps)./(lb(BlbE)+eps).*(ub(BlbE)-lb(BlbE)) + lb(BlbE);
Bh = fun(Bx);if hG>BhhG = Bh;G  = Bx;
end
CV(FE) = hG;
end% 种群初始化
function [x, new_lb, new_ub] = Initialization(N,dim,ub,lb)
Boundary= size(ub,2);
new_lb = lb;
new_ub = ub;
if Boundary==1x=rand(N,dim).*(ub-lb)+lb;new_lb = lb*ones(1,dim);new_ub = ub*ones(1,dim);
end
if Boundary>1for i=1:dimubi=ub(i);lbi=lb(i);x(:,i)=rand(N,1).*(ubi-lbi)+lbi;end
end
end

3. 小结

爱情进化算法(LEA)基于刺激-价值-角色理论,通过相遇(Encounter)价值交互(Value)角色平衡(Role)等算子,使个体在搜索空间进行有效的全局搜索本地优化。结合映射函数的边界处理和记忆机制的全局最优解保留策略,该算法可适应多维复杂优化任务。以上 MATLAB 源码中文详细注释可供读者直接理解算法流程并应用到实际工程或科研场景中。

Love Evolution Algorithm (LEA) source codes version 1.0

Original paper: Yuansheng Gao, Jiahui Zhang, Yulin Wang,Jinpeng Wang, Lang Qin.

Love Evolution Algorithm: a stimulus-value-role theory inspired evolutionary algorithm for global optimization, The Journal of Supercomputing.


http://www.ppmy.cn/ops/167033.html

相关文章

个人blog系统 前后端分离 前端js后端go

系统设计&#xff1a; 1.使用语言&#xff1a;前端使用vue&#xff0c;并使用axios向后端发送数据。后端使用的是go的gin框架&#xff0c;并使用grom连接数据库实现数据存储读取。 2.设计结构&#xff1a; 最终展示&#xff1a;仅展示添加模块&#xff0c;其他模块基本相似 前…

新闻发稿的核心定义与媒体发稿操作指南

新闻发稿是企业或机构通过媒体渠道发布具有新闻价值的内容&#xff0c;以传递信息、塑造品牌或回应社会关切。 操作四步法&#xff1a; 1.选题策划&#xff1a;挖掘企业动态、产品创新、行业洞察中的新闻点&#xff08;如技术突破、社会责任案例&#xff09;&#xff1b; 2.内…

通过 TTL 识别操作系统的原理详解

TTL 的工作原理 TTL&#xff08;Time to Live&#xff0c;生存时间&#xff09;是网络中用于控制数据包生命周期的一个关键参数。它通过限制数据包在网络中可以经过的最大路由跳数&#xff08;或最大转发时间&#xff09;&#xff0c;确保数据包不会在网络中无休止地转发。TTL…

基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 XGBoost算法原理 4.2 XGBoost优化 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代码包含…

在C语言基础上学Java【Java】【一】

众所周知&#xff0c;Java是C风格的语言&#xff0c;对于学过C语言的人学Java可以快速适应。 废话不多说&#xff0c;直接边看代码边学。 数据类型&#xff0c;输入和输出 public class a1 {//a1是类名&#xff0c;就是文件名&#xff0c;所有的可执行代码需要写在这个里面 /…

Topaz Photo AI for Mac v3.5.2图像质量增强 支持M、Intel芯片

应用介绍 Topaz Photo AI 提高图像质量&#xff0c;让您可以专注于摄影的创意部分。利用技术锐化、消除噪点并提升照片质量。 专注于你的创造力&#xff0c;而不是你的工具。 人工智能擅长某些事情&#xff0c;但不擅长其他事情。他会写句子但不会讲故事&#xff0c;他会推荐…

【Java篇】一法不变,万象归一:方法封装与递归的思想之道

文章目录 Java 方法的使用&#xff1a;从基础到递归的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定义1.3 方法调用的执行过程1.4 实参和形参的关系1.5 没有返回值的方法 二、方法重载2.1 为什么需要方法重载2.2 方法重载的概念2.2.4 C 和 Java 的比较&…

力扣刷题200. 岛屿数量

200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 需要用到dfs 在dfs函数中&#xff0c;每次递归四个方向&#xff0c;把所有的‘1’ 都改为‘0’&#xff0c;在主函数中&#xff0c;循环遍历所有的位置&#xff0c;如果当前位置是‘1’&#xff0c;统计数加一&#xf…