摘要
爱情进化算法(LEA)是一种基于心理学刺激-价值-角色理论(Stimulus-Value-Role Theory)所提出的新型元启发式算法。该算法将“恋爱中的人”抽象为种群个体,通过对个体“幸福度(Happiness)”的定义和动态更新,模拟了从“相遇 -> 价值交流 -> 角色平衡”三个阶段不断逼近全局最优解的过程。LEA 在高维连续优化与工程应用等场景下可实现对搜索空间的充分探索与精细开发。本文结合算法原理,呈现 LEA 的完整 MATLAB 代码以及中文详细注释,以便读者深入理解并快速应用此算法。
1. 算法介绍
1.1 理论背景:刺激-价值-角色 (SVR) 理论
- 刺激(Stimulus)
- 两个体初次见面,对对方外在的“刺激”做出评估或回应,作为后续了解的基础。
- 价值(Value)
- 进一步通过“价值”层面的沟通,双方交换信息,以判断是否能维持更深层次的关系。
- 角色(Role)
- 随着关系发展,双方开始确定各自角色地位并进行长期合作,对搜索问题而言即在最优解附近进行精细开发。
LEA 将这三大阶段对应为三个主要更新算子:相遇、价值交互和角色平衡,并结合记忆机制以及边界映射策略来保证全局搜索的多样性和局部开发的精度。
1.2 算法流程简述
- 初始化种群
- 在
[lb, ub]
范围内随机生成 N 个个体坐标,并计算其初始“幸福度”(适应度)。 - 记录其中全局最优个体(H_G, G)。
- 在
- 参数定义
- h_max, h_min:幸福度上下限,用于在后期调节个体间交互强度;
- lambda_c, lambda_p:刺激阈值与角色平衡阈值,决定何时进入价值交互或角色平衡等算子;
- 其他系数:结合双曲衰减、正态扰动等手段,以保持搜索多样性。
- 主循环
- 相遇 (Encounter):随机将种群划分为两半 (A, B),进行配对;
- 刺激 (Stimulus) 阶段:计算个体间差异 (Gap) 并确定进入“价值”或“角色”算子;
- 价值 (Value) 阶段:若 c < lambda_c,分别对 A、B 中的个体用公式进行“价值交换”更新位置 (Equations (11-14));
- 角色 (Role) 阶段:若 p < lambda_p,则在 eq.(16) 中进行角色平衡,否则进行“反射操作” (Reflection);
- 记忆机制:更新后检查越界并映射回搜索范围,同时更新全局最优个体 (H_G, G)。
- 终止条件
- 当函数评估次数 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.