Bestfi=Oderfi(Size);
BestS=Kpar(Indexfi(Size),:)%保存最大适应度值对应的染色体(参数)
%*******step2:选择和复制************
图1 算法流程图

fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size);
r=Size-sum(fi_S);
Rest=fi_Size-fi_S;
[RestValue,Index]=sort(Rest);
for i=Size:-1:Size-r+1
fi_S(Index(i))=fi_S(Index(i))+1;
end
k=1;
for i=Size:-1:1
for j=1:1:fi_S(i)
TempE(k,:)=Kpar(Indexfi(i),:);
k=k+1;
end
end
% step 3交叉率不能太大
Pc=0.7;
for i=1:2:(Size-1)
temp=rand;
if Pc>temp
alfa=rand;
TempE(i,:)=alfa*Kpar(i+1,:)+(1-alfa)*Kpar(i,:);
TempE(i+1,:)=alfa*Kpar(i,:)+(1-alfa)*Kpar(i+1,:);
end
end
TempE(Size,:)=BestS;
Kpar=TempE;
%*******Step 4:变异*******变异率不能太大
Pm=0.15+[1:1:Size]*(0.01)/Size;
Pm_rand=rand(Size,CodeL);
Mean=(MaxX+MinX)/2;
Dif=(MaxX-MinX)/2;
for i=1:1:Size
for j=1:1:CodeL
if Pm(i)>Pm_rand(i,j)
TempE(i,j)=Mean(j)+Dif(j)*(rand- 0.4);
End
end
end
TempE(Size,:)=BestS;%保留最优个体
Kpar=TempE;
end
BestS
Best_J=BestJ(G)
figure(1);
plot(time,BestJ);
xlabel('Time(s)');Ylabel('Best J');
3 实验结果
经过300代进化后,均方误差可以达到0.0029,如图2所示;经过400代之后,均方误差为0.0027,变化曲线如图3所示。图中:横坐标是进化代数,纵坐标是均方误差。
从上面的实验可以看出,参数范围都在最小二乘法估计的参数附近,从进化曲线可以看出,本算法收敛的速度是比较快的,在进化约120代时,就接近了收敛值,同时由于应用了随着进化代数的增加改变变异率的方法,在进化后期,均方误差值略有降低,克服了过早收敛的现象。可以根据精度的要求,运行数次后,得到优化的参考结论参数值。

图2 进化300代的变化曲线

图3 进化400代的变化曲线
4 结论
从仿真实验可以看出:用简单的最小二乘法粗略估计参数的范围是有效的,在粗略估计范围后,用遗传算法对结论参数进行优化,可以一次优化多个参数,具有简单易行的特点,在所选范围不是太窄的情况下,可以达到较高的精度,而且本算法对范围的大致确定要求不是很严格,具有较好的鲁棒性。
参考文献
[1] 楼顺天等. 基于MATLAB的系统分析与设计. [M] . 西安:西安电子科技大学出版社,2001
[2] 刘金琨. 先进PID控制MATLAB仿真(第2版) . [M] . 北京:电子工业出版社,2004
[3] LOO HAY LEE, YING LI FAN. An adaptive real-coded Genetic Algorithm. Applied Artifical Intelligence. [J]. 2002,16: 457-486
[4] 周林娜,张庆灵,杨春雨.T-S模糊系统的鲁棒局部稳定.系统工程与电子技术.[J]. 2006,28(12) : 1863-1866