爱情进化算法(Love Evolution Algorithm,LEA)是期刊“The Journal of Supercomputing”的2024年智能优化算法
01.引言
爱情进化算法(LEA)是一种受刺激-价值-角色理论启发的新型进化算法。LEA的优化过程包括刺激、价值和作用三个阶段。
02.优化算法的流程
恋爱是一个人在其一生中能够自主、自愿、自由地建立的亲密关系,是异性或同性之间爱慕的一种表达。1970年,美国心理学家Murstein提出了一种影响深远的人际关系心理学理论:刺激-价值-角色(stimulus-value-role, SVR)理论[7]。SVR理论将恋爱(婚姻选择)分为三个阶段,分别是刺激阶段、价值阶段和角色阶段。刺激阶段包括通过视觉、听觉和非互动手段实现的价值满足。价值阶段包括通过言语互动欣赏的价值。角色阶段包括夫妻双方在相互分配的角色中发挥作用的能力。
在每一段关系中,无论是失败还是成功,双方都或多或少地发生了变化。这种变化可能是积极的,也可能是消极的。然而,不可否认的是,在寻找爱情的道路上,我们在思想、观念等方面或多或少都取得了进步。SVR理论提供了一个重要的视角为我们解释相遇-相爱-相处的分析路径。这也启发了恋爱的过程与元启发式算法的优化过程有一些相似之处。不同的人有不同的气质、个性、爱好等等。在本文中,这些被统一称为一个人的特征。然后,将某一特征抽象为某一维度的变量。显然,夫妻双方在恋爱过程中的幸福感与这些特征密切相关。因此,一个人所拥有的全部特征被抽象成一个候选解决方案。这些特征的结合影响着一个人的方方面面,决定着一个人的幸福。因此,幸福度将某一特定人的问题抽象为某一特定候选解的目标函数值。在恋爱的过程中,人的性格会进步。因此,历史上最优秀人物的特征被比喻为最佳解决方案。然后,一个特定的最佳特性可以被比作最佳解的一个特定变量。受支持向量回归理论的启发,本文算法的优化过程分为三个阶段:刺激阶段、值阶段和角色阶段。不可避免地,分手会在这三个阶段发生。分手后,双方都会反思和改进。这种情况被抽象为反射操作。优化过程结构如图所示。
04.本代码效果图
05.部分代码
function [H_G,G, CV] = LEA (N,MaxFEs,lb,ub,dim,fun)
%% Initialization
CV = zeros (1, MaxFEs); % Convergence curves
[X,lb,ub] = Initialization(N,dim,ub,lb); % Initialize the population
FE = 0; % Number of function evaluations
H = zeros (N, 1); % The happiness degrees
H_G = inf; % The best value
for i = 1:N
H(i) = fun (X(i,:));
FE = FE+1;
if H_G>H(i)
H_G = H(i,:);
G = X(i,:); % The best solution
end
CV(FE) = H_G;
end
% Parameter settings
h_max = 0.7;
h_min = 0;
lambda_c = 0.5;
lambda_p = 0.5;
%% Main loop
while FE<MaxFEs
h = (1-FE/MaxFEs)*(h_max-h_min)+h_min; %Eq. (17)
%% Encounter
% Eqs. (4) and (5)
r = 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));
%% Stimulus phase
c = Gap_P(H_A,H_B); % Eq. (6)
mu = sum(sqrt(sum((X-G).^2)/N))/dim + eps; % Eq. (10)
for i = 1:N/2
if c(i)<lambda_c
%% Value phase
for j = 1:dim
% Eq. (11)/(12)
phi1 = G(:,j)*A(i,j);
phi2 = G(:,j)^2 + A(i,j)*B(i,j);
phi3 = G(:,j)*B(i,j);
% Eq. (13)
rho_A = sqrt((phi2-phi1)^2);
rho_B = sqrt((phi2-phi3)^2);
% Eq. (14)
A(i,j) = rand* A(i,j) + randn*rho_A;
B(i,j) = rand* B(i,j) + randn*rho_B;
end
% Eq. (19)
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);
p(i) = (rand+0.5)*c(i)*sum(sqrt((A(i,:)-B(i,:)).^2))/(dim*mu); % Eq. (15)
if p(i)<lambda_p
%% Role phase
% Eq. (16)
xi = A(i,:).*B(i,:);
xi = (xi-min(xi))/(max(xi)-min(xi) + eps) + h;
for j = 1:dim
% Eq. (18)
A(i,j) = G(:,j) + randn*mu*xi(j);
B(i,j) = G(:,j) + randn*mu*xi(j);
end
else
%% Reflection operation
for j = 1:dim
% Eq. (7)
sA = (3*rand-1.5)*(A(i,j)/(B(i,j) + eps));
sB = (3*rand-1.5)*(B(i,j)/(A(i,j) + eps));
% Eq. (8)
z = randi(dim);
k = randi(dim);
delta = 0.5*(A(i,z)/(ub(z)-lb(z)) + B(i,k)/(ub(k)-lb(k)));
% Eq. (9)
A(i,j) = G(:,j) + sA*mu*delta;
B(i,j) = G(:,j) + sB*mu*delta;
end
end
else
%% Reflection operation
for j = 1:dim
% Eq. (7)
sA = (3*rand-1.5)*(A(i,j)/(B(i,j) + eps));
sB = (3*rand-1.5)*(B(i,j)/(A(i,j) + eps));
% Eq. (8)
z = randi(dim);
k = randi(dim);
% Eq. (9)
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;
end
end
% Eq. (20)
FE = 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 = [A;B];
H = [H_A;H_B];
end
end
% Eq. (6)
function p = Gap_P(f1,f2)
p = (0.5+rand(length(f1),1)).*(f1-f2).^2;
p = p./(max(p)+min(p)+eps);
end
% Eq. (20)
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>Ah
hG = Ah;
G = Ax;
end
CV(FE) = hG;
end
% Eq. (20)
function [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>Bh
hG = Bh;
G = Bx;
end
CV(FE) = hG;
end
% Eq. (19)
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>Ah
hG = Ah;
G = Ax;
end
CV(FE) = hG;
end
% Eq. (19)
function [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>Bh
hG = Bh;
G = Bx;
end
CV(FE) = hG;
end