clear; clc;
% 设置遗传算法参数
popsize=100; % 种群规模
GGAP=1.0; % 代沟
Pc=0.7; % 交叉概率
Pm=0.1; % 变异概率
MAXGEN=100; % 最大进化代数
A=[22,1,5;22,1,6;22,1,7;22,1,8;22,1,9;22,1,10;22,1,11;22,2,5;22,2,7;22,2,8;22,2,9;
22,2,10;22,3,2;22,3,6;22,3,8;22,3,9;22,4,5;22,4,8;23,1,5;23,1,7;23,2,9;23,3,8];
B=[3;4;2;3;3;4;40;1;1;2;2;19;1;1;2;4;1;3;1;1;1;1];
% 导入系统负荷数据(kW),为计算目标函数
Loaddata = [450 425 415 400 400 410 415 440 500 540 565 555 530 525 523 520 530 550 580 600 597 575 526 500];
chrom=zeros(popsize,length(A)); % 种群初始化
trace=zeros(size(chrom,2)+2,MAXGEN); % 代记录表初始化
%% 种群初始化
for kk=1:length(B)
chrom(:,kk)=crtbp(popsize,1,A(kk,3));
end
% 计算初始目标函数
ObjV=exmfun(chrom);
%% 优化
gen=0; % 代计数器
while gen<MAXGEN
FitnV=ranking(ObjV); % 父代适应度
selch=select('sus',chrom,FitnV,GGAP); % 选择得子代(随机遍历)
ObjVsel=exmfun(selch);
best_selch_id=find(ObjVsel==min(ObjVsel)); % 子代精英序号(仅取一个)
best_selch_id=best_selch_id(1);
best_selch=selch(best_selch_id,:); % 选出子代精英个体
selch(best_selch_id,:)=[]; % 剔除子代精英(不参与交叉)
selch=recombin('xovdprs',selch,Pc); % 交叉(减少代理的两点)
for i=1:size(selch,1)
for j=1:size(selch,2)
if rand<=Pm % 变异
num=selch(i,j); % 原始编码
newnum=ceil( A(j,3)*rand )-1; % 在进制范围内随机变异
while newnum==num
newnum=ceil( (A(j,3))*rand )-1;
end
selch(i,j)=newnum;
end
end
end
ObjVsel_1=exmfun(selch);
worst_selch_id=find(ObjVsel_1==max(ObjVsel_1)); % 找到遗传操作后的子代最差个体(仅取一个)
worst_selch_id=worst_selch_id(1);
selch(worst_selch_id,:)=best_selch(1,:); % 精英替换掉最差个体
% 重新插入子代精英(插回原位置)
selch(best_selch_id+1:end+1,:)=selch(best_selch_id:end,:);
selch(best_selch_id,:)=best_selch(1,:);
chrom=selch;
ObjV=exmfun(chrom);
gen=gen+1; % 代计数器更新
[Y,I]=min(ObjV);
I=I(1);
trace(1:size(chrom,2),gen)=chrom(I,:);
trace(end-1,gen)=Y;
trace(end,gen)=mean(ObjV);
end