遗传算法现在参数优化中的应用2007/06/02 23:30(1)De Jong函数
二维的De Jong函数图形如下
[x1,x2] = meshgrid(-512:4:512);
f=x1.^2+x2.^2;
mesh(x1,x2,f);
xlabel('x1');
ylabel('x2');
zlabel('f(x1,x2)');
函数的代码
function [eval]=dejong(sol)
numv = size(sol,2);
x=sol(1:numv);
eval=sum(x.^2);
De Jong
De Jong函数适值的代码
function [sol,eval]=dejongmin(sol,options)
numv = size(sol,2)-1;
x=sol(1:numv);
eval=dejong(x);
eval=-eval;
求解的代码
%维数n=3
%设置参数边界
bounds = ones(3,1)*[-512 512];
%遗传算法优化
[p,endPop,bestSols,trace]=ga(bounds,'dejongmin');
%性能跟踪
plot(trace(:,1),trace(:,3),'b-')
hold on
plot(trace(:,1),trace(:,2),'r-')
xlabel('Generation');
ylabel('Fittness');
legend('解的变化','种群平均值的变化');
>> p
p =
1.0e-003 *
0.2500 0.1567 0.0500 -0.0001
此时,De Jong函数的适值的极小值为dejong(p)=1.0e-003* -0.0001
(2) Rosenbrock函数
二维的Rosenbrock函数绘制图如下
[x1,x2] = meshgrid(-512:1:512);
f=100*(x2-x1.^2).^2+(1-x1).^2;
mesh(x1,x2,f);
xlabel('x1');
ylabel('x2');
zlabel('f(x1,x2)');
Rosenbrock
Rosenbrock函数适值
function [sol,eval]=rosenbrockmin(sol,options)
numv = size(sol,2)-1;
x=sol(1:numv);
eval=rosenbrock(x);
eval=-eval;
求解过程
%维数n=4
%设置参数边界
bounds = ones(4,1)*[-512 512];
%遗传算法优化
[p,endPop,bestSols,trace]=ga(bounds,'rosenbrockMin');
%性能跟踪
plot(trace(:,1),trace(:,3),'b-')
hold on
plot(trace(:,1),trace(:,2),'r-')
xlabel('Generation');
ylabel('Fittness');
legend('解的变化','种群平均值的变化');
注:该程序求出的解有很大的不确定性,有待改进,最优解为1 1 1 1,极小值为0
(3)
function [eval]=griewangk(sol)
numv = size(sol,2);
x=sol(1:numv);
multi=1;
for i=1:numv
multi=multi*cos(x(i)/sqrt(i));
end
eval=sum(x.^2/4000)-multi+1;
function [sol,eval]=griewangkmin(sol,options)
numv = size(sol,2)-1;
x=sol(1:numv);
eval=griewangk(x);
eval=-eval;
%维数n=6
%设置参数边界
bounds = ones(6,1)*[-512 512];
%遗传算法优化
[p,endPop,bestSols,trace]=ga(bounds,'griewangkmin');
%性能跟踪
plot(trace(:,1),trace(:,3),'b-')
hold on
plot(trace(:,1),trace(:,2),'r-')
xlabel('Generation');
ylabel('Fittness');
legend('解的变化','种群平均值的变化');
同样不稳定,最优解应为0 0 0 最小值应为0
[x1,x2] = meshgrid(-500:5:50);
f=x1.^2/4000+x2.^2/4000-cos(x1)*cos(x2/sqrt(2))+1;
mesh(x1,x2,f);
xlabel('x1');
ylabel('x2');
zlabel('f(x1,x2)');
函数代码
function [eval]=rosenbrock(sol)
numv = size(sol,2);
x=sol(1:numv);
summ=0;
for i=1:numv-1
summ=summ+100*(x(i+1)-x(i).^2).^2+(1-x(i)).^2;
end
eval=summ;