遗传算法(确定性排挤)

该博客介绍了确定性排挤(Deterministic Crowding)技术在可再生能源领域的太阳能辐射估计中如何用于变量选择。通过将父代和子代个体分为两部分,并计算它们之间的距离,依据DC准则进行环境选择,以保持种群多样性。这种方法旨在优化遗传算法的性能,提高预测精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

确定性排挤是一种小生境技术,代码是按照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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值