确定性排挤是一种小生境技术,代码是按照A. Will, J. Bustos, M. Bocco, J. Gotay, C. Lamelas,On the use of niching genetic algorithms for variable selection in solar radiation estimation,Renewable Energy,Volume 50,2013,Pages 168-176,ISSN 0960-1481,https://doi.org/10.1016/j.renene.2012.06.039.这篇文章的描述写出来的,具体代码如下,可以用于platemo3.2的版本
function [Dec,Obj,MSE] = DCEnvironment(parentDec,parentObj,parentMSE,offspringDec,offspringObj,offspringMSE)
%DCENVIROMENT 使用Deterministic Crowding对父代和子代个体进行环境选择
%输入参数:
%parentDec为父代决策变量,parentObj为父代目标值(单目标情况,仅有1列),parentMSE为父代预测值的估计误差值
%offspringDec为子代决策变量,offspringObj为子代目标值,offspringMSE为子代预测值的估计误差值
%输出参数:
%Dec为环境选择后的决策变量,Obj为环境选择后的目标值,MSE为环境选择后的估计误差
%floor为向下取整,将父代分成父代个体1和父代个体2
parDec1 = parentDec(1:floor(end/2),:);
parDec2 = parentDec(floor(end/2)+1:floor(end/2)*2,:);
parObj1 = parentObj(1:floor(end/2));
parObj2 = parentObj(floor(end/2)+1:floor(end/2)*2);
parMSE1 = parentMSE(1:floor(end/2));
parMSE2 = parentMSE(floor(end/2)+1:floor(end/2)*2);
%将子代分成子代个体1和子代个体2
offDec1 = offspringDec(1:floor(end/2),:);
offDec2 = offspringDec(floor(end/2)+1:floor(end/2)*2,:);
offObj1 = offspringObj(1:floor(end/2));
offObj2 = offspringObj(floor(end/2)+1:floor(end/2)*2);
offMSE1 = offspringMSE(1:floor(end/2));
offMSE2 = offspringMSE(floor(end/2)+1:floor(end/2)*2);
%计算父代个体1到子代个体1之间决策变量的距离
disPar1Off1 = sqrt(sum((parDec1-offDec1).^2,2));
%计算父代个体1到子代个体2之间决策变量的距离
disPar1Off2 = sqrt(sum((parDec1-offDec2).^2,2));
%计算父代个体2到子代个体1之间决策变量的距离
disPar2Off1 = sqrt(sum((parDec2-offDec1).^2,2));
%计算父代个体2到子代个体2之间决策变量的距离
disPar2Off2 = sqrt(sum((parDec2-offDec2).^2,2));
%使用临时变量保存环境选择后的数据
[N,D] = size(parDec1);
tempDec1 = NaN(N,D);
tempDec2 = NaN(N,D);
tempObj1 = NaN(N,1);
tempObj2 = NaN(N,1);
tempMSE1 = NaN(N,1);
tempMSE2 = NaN(N,1);
%使用DC准则确定使用小生境,determinIDX为逻辑索引值
%DC准则为:d(P1,C1)+d(P2,C2) <= d(P2,C1)+d(P1,C2),其中C为后代个体的意思
determinIDX = ((disPar1Off1+disPar2Off2) <= (disPar1Off2+disPar2Off1));
%小生境环境选择
for i = 1 : N
if determinIDX(i)==1 %父代直接和其对应子代对比
%判断父代个体1和子代个体1
if parObj1(i)<=offObj1(i)
tempDec1(i,:) = parDec1(i,:);
tempObj1(i) = parObj1(i);
tempMSE1(i) = parMSE1(i);
else
tempDec1(i,:) = offDec1(i,:);
tempObj1(i) = offObj1(i);
tempMSE1(i) = offMSE1(i);
end
%判断父代个体2和子代个体2
if parObj2(i)<=offObj2(i)
tempDec2(i,:) = parDec2(i,:);
tempObj2(i) = parObj2(i);
tempMSE2(i) = parMSE2(i);
else
tempDec2(i,:) = offDec2(i,:);
tempObj2(i) = offObj2(i);
tempMSE2(i) = offMSE2(i);
end
else
%判断父代个体1和子代个体2
if parObj1(i)<=offObj2(i)
tempDec1(i,:) = parDec1(i,:);
tempObj1(i) = parObj1(i);
tempMSE1(i) = parMSE1(i);
else
tempDec1(i,:) = offDec2(i,:);
tempObj1(i) = offObj2(i);
tempMSE1(i) = offMSE2(i);
end
%判断父代个体2和子代个体1
if parObj2(i)<=offObj2(i)
tempDec2(i,:) = parDec2(i,:);
tempObj2(i) = parObj2(i);
tempMSE2(i) = parMSE2(i);
else
tempDec2(i,:) = offDec1(i,:);
tempObj2(i) = offObj1(i);
tempMSE2(i) = offMSE1(i);
end
end
end
Dec = [tempDec1;tempDec2];
Obj = [tempObj1;tempObj2];
MSE = [tempMSE1;tempMSE2];
end