写了两个月多目标了,突然上课课程作业叫写单目标。之前用Python写过一次,这次用matlab写吧,也暴露了遗传算法的一些固有问题,可以记录一下:
先上代码,讨论放到最后:
%%get initial parameter
NP=40;
L=10;
Pc=0.7;
Pm=0.1;
G=50; %迭代次数
O2=[0 3.14];
wid=[2 10]; %rotor mag
len=[27 35];
%% generate Primary population
fo=randi([0,1],NP,L);
fw=randi([0,1],NP,L);
fl=randi([0,1],NP,L);
x0=zeros(1,NP*2);
tempx0=zeros(1,NP*2);
xw=zeros(1,NP*2);
tempxw=zeros(1,NP*2);
xl=zeros(1,NP*2);
tempxl=zeros(1,NP*2);
fbest=zeros(1,G);
Ovalue=zeros(1,G);
Wvalue=zeros(1,G);
Lvalue=zeros(1,G);
%% begin to Iteration
for i=1:1:G
disp([i]);
f1=zeros(1,NP*2);
nfo=fo;
nfw=fw;
nfl=fl;
for M=1:2:NP
p=rand();
if p<Pc
q=randi([0,1],1,L);
for j=1:1:L %交叉
if q(j)==1
nfo=exchange(nfo,M,j);
nfw=exchange(nfw,M,j);
nfl=exchange(nfl,M,j);
end
end
end
end
j=1;
while j<=NP*Pm %变异
h=randi(NP);
for k=1:1:round(NP*Pm)
g=randi(L);
nfo(h,g)=~nfo(h,g);
nfw(h,g)=~nfw(h,g);
nfl(h,g)=~nfl(h,g);
end
j=j+1;
end
newfo=[fo;nfo]; %垂直方向合并两个矩阵
newfw=[fw;nfw];
newfl=[fl;nfl];
tempsize=size(newfo);
for j = 1:1:tempsize(1)
Uo=newfo(j,:);
Uw=newfw(j,:);
Ul=newfl(j,:);
x0(j)=twoto10(Uo,L,O2);
xw(j)=twoto10(Uw,L,wid);
xl(j)=twoto10(Ul,L,len);
% diaoyong(xw(j),xl(j),x0(j)); %调用maxwell对应的输入值
% data=readmatrix('force.csv');
% f1(j)=data(end);
% delete('force.csv')
f1(j)=funcl(x0(j));
end
maxfit=max(f1); %加入随机量轮盘赌,否则遗传算法太容易收敛到局部最优了。
minfit=min(f1);
rr=find(f1==maxfit);
fbest(i)=f1(rr(1,1));
Ovalue(i)=x0(rr(1,1));
Wvalue(i)=xw(rr(1,1));
Lvalue(i)=xl(rr(1,1)); %记录每一代最优个体
sum_f1=sum(f1);
fitvalue=f1./sum_f1;
fitvalue=cumsum(fitvalue);
ms=sort(rand(NP,1));
fiti=1;
newi=1;
fo=[];
fw=[];
fl=[];
while newi<=NP
if (ms(newi))<fitvalue(fiti) %轮盘赌
fo=[fo;newfo(fiti,:)];
fw=[fw;newfw(fiti,:)];
fl=[fl;newfw(fiti,:)];
newi=newi+1;
else
fiti=fiti+1;
end
end
end
因为是在多目标代码上改的,所以有些冗余的地方,见谅。我想讨论的是下面这点:
太容易收敛了。
多目标的时候还不觉得,那时候模型相对复杂,收敛需要一定的迭代次数,这种简单的模型,真的就是迭代个4.5次就到来最优值附近了。
有的同学会说了,到最优值附近快,难道不是好事嘛。
是好事,但万一是局部最优呢?
多目标其实也存在这个问题,只是它有个寻优的过程,让人感觉比较安心。我今天调这个代码,发现收敛太快了,就一直在思考是不是自己哪写得不对。但这个现象其实是遗传算法自带的。。。
放一张图吧,最优值是1,大家看看收敛得有多块。
其实初始带结果就很好了对吧,因为我在第一代种已经做了一次筛选,所以这里结果的第一代相当于咱口头说的第二代。
也算是加深了自己对遗传算法的理解吧,哎。