% 这段代码可以分为两个部分
% 1. 使用curr_pop即target task 和 his_pop 即source task 构建矩阵迁移矩阵M
% 2. 使用his_bestSolution 即source task 中的较好的解来进行迁移
% 3. 如果两者的维度不同,则将其先补0为相同的维度,然后进行截断处理
function [inj_solution] = mDA(curr_pop, his_pop, his_bestSolution)
% curr_pop and his_pop denote the current population and
%population from another domain. Both in the form of n*d matrix. %n is the number of individual, and d is the variable dimension.
%They do not have to be with the same d. We assume they have the %%same n (same population size)
% his_bestSolution is the best solutions from one domain.
%output is the transformed solution.
curr_len = size(curr_pop, 2); % 列数,表示target问题的维度数
tmp_len = size(his_pop, 2); % 列数,表示source问题的维度数
% 将两者使用0补成列相同的维度数大小
if curr_len < tmp_len
curr_pop(:,curr_len+1:tmp_len) = 0;
elseif curr_len > tmp_len
his_pop(:,tmp_len+1:curr_len) = 0;
end
% '表示转置
% curr_pop原来是一个shape=[NP,ND]的矩阵,其中NP表示种群大小,ND表示问题维度。现在xx是其转置,是一个[ND,NP]的矩阵。
xx = curr_pop';
noise = his_pop';
% d表示目标问题的问题维度,n表示目标问题的种群数量
[d, n] = size(xx);
xxb = [xx; ones(1, n)];% 加了bias的目标矩阵
noise_xb = [noise; ones(1, n)];% 加了bias的源矩阵
Q = noise_xb*noise_xb';
P = xxb*noise_xb';
% lambda是一个非常小的数
lambda = 1e-5;
% eye 是一个(d+1)维度的方阵
reg = lambda*eye(d+1);
% reg是一个对角线元素为一个很小值的方阵
reg(end,end) = 0;
% 这里reg添加这个单位矩阵,是为了防止除数为0
% 这里W的计算和异构迁移中M的计算一模一样
W = P/(Q+reg);
% 截断处理
tmmn = size(W,1);
W(tmmn,:) = [];
W(:,tmmn) = [];
% current_len 表示目标任务的决策空间维度数
% tmp_len 表源任务的决策空间维度数
% 然后进行截断处理
if curr_len <= tmp_len
tmp_solution = (W*his_bestSolution')';
inj_solution = tmp_solution(:,1:curr_len);
elseif curr_len > tmp_len
his_bestSolution(:,tmp_len+1:curr_len) = 0;
inj_solution = (W*his_bestSolution')';
end