y1,y2,y3为3个预测向量,Y为真实值,都为列向量
%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
D=3; %基因数目
NP=200; %染色体数目
Xs=0; %上限
Xx=1; %下限
G=200; %最大遗传代数
f=zeros(D,NP); %初始种群赋空间
nf=zeros(D,NP); %子种群赋空间
Pc=0.8; %交叉概率
Pm=0.1; %变异概率
f=rand(D,NP)*(Xs-Xx)+Xx; %随机获得初始种群
%%%%%%%%%%%%%%%%%%%%%%按适应度升序排列%%%%%%%%%%%%%%%%%%%%%%%
for np=1:NP
FIT(np)=func(f(:,np),y1,y2,y3,Y);
end
[SortFIT,Index]=sort(FIT);
Sortf=f(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
%%%%%%%%%%%%%%采用君主方案进行选择交叉操作%%%%%%%%%%%%%%%%
Emper=Sortf(:,1); %君主染色体
NoPoint=round(D*Pc); %每次交叉点的个数
PoPoint=randi([1 D],NoPoint,NP/2); %交叉基因的位置
nf=Sortf;
for i=1:NP/2
nf(:,2*i-1)=Emper;
nf(:,2*i)=Sortf(:,2*i);
for k=1:NoPoint
nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%%%%
for n=1:D
r=rand(1,1);
if r<Pm
nf(n)=rand(1,1)*(Xs-Xx)+Xx;
end
end
%%%%%%%%%%%%%%%%%%%%%子种群按适应度升序排列%%%%%%%%%%%%%%%%%%
for np=1:NP
NFIT(np)=func(f(:,np),y1,y2,y3,Y);
end
[NSortFIT,Index]=sort(NFIT);
NSortf=nf(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%%%产生新种群%%%%%%%%%%%%%%%%%%%%%%%%%%
f1=[Sortf,NSortf]; %子代和父代合并
FIT1=[SortFIT,NSortFIT]; %子代和父代的适应度值合并
[SortFIT1,Index]=sort(FIT1); %适应度按升序排列
Sortf1=f1(:,Index); %按适应度排列个体
SortFIT=SortFIT1(1:NP); %取前NP个适应度值
Sortf=Sortf1(:,1:NP); %取前NP个个体
trace(gen)=SortFIT(1); %历代最优适应度值
disp(['迭代次数:',num2str(gen)]);
end
Bestf=Sortf(:,1); %最优个体
trace(end) %最优值
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
weights = Bestf;
这里的损失函数func可自定义
这里举一个MSE的例子
function fitness = func(weights,y1,y2,y3,Y)
y = [y1,y2,y3]; %y1,y2,y3为列向量
y_pre = weights' .*y;
y_pre = sum(y_pre,2); %按列相加
original_loss = sum((y_true - y_pred).^2) / length(y_true);
%% 限制权重相加为1
a = sum(weights);
if abs(a - 1) > 0
penalty =abs(a -1)^2;
value = original_loss + penalty;
else
value = original_loss;
end
end