您现在的位置:e-works > 智造书屋 > 书籍列表 > 机械工程设计分析和MATLAB应用(第3版) > 无约束优化的遗传算法

第九章 最优化问题和遗传算法

第四节 无约束优化的遗传算法

1.一维无约束优化的遗传算法
例9-8  采用遗传算法求解一维函数

1 
 

在x∈(0,80)范围内,求f(x)取最大值时的自变量x值。
(1)使用优化工具箱中优化函数fmincon进行计算
% 定义函数和变量
f=inline('15*sin(x/3)-20*cos(x/4)+50','x');
% 使用优化函数fmincon计算
for x0=[0:2:80,0:4:80]                     % 任意选择初值
    x=fmincon(f,x0,[],[],[],[],0,80);       % 非线性约束优化
    xf=[[];x0,x,f(x)];
end

M文件运行结果
Optimization terminated: magnitude of directional derivative in search
 direction less than 2*options.TolFun and maximum constraint violation
  is less than options.TolCon.
No active inequalities.
可见,在求解区间内任意选择初值,并不能得到满意的结果。
(2)绘制一维非线性函数曲线
% 绘制函数曲线
figure(1);
fplot('15*sin(x/3)-20*cos(x/4)+50',[0,80])
xlabel('\bf x');ylabel('\bf f(x)');
gtext('\bf f(x)=15sin(x/3)-20cos(x/4)+50');
grid; hold on;
M文件运行的结果如图9-4所示。

1
图9-4 一维非线性函数线图和遗传优化

从图9-4可见,一维非线性函数1的图形是一条振荡曲线,在解区间[0,80]内有多个极值点。
(3)采用遗传优化算法求解
1)定义适应度。
% 定义适应度函数文件
function [sol,y]=maxf_1(sol,options)
x=sol(1);
y=15*sin(x/3)-20*cos(x/4)+50;
2)生成初始种群,个体数目取15。
% 生成初始种群,个体数目取15
startPop=initializega(15,[0,80],'maxf_1')
% 在图中以绿色“o”号标示初始种群
plot(startPop(:,1),startPop(:,2),'go');
title('\bf 一维非线性函数线图和初始种群及遗传优化')
M文件运行随机生成的初始种群是:
startPop =
   38.6805   74.2211
   18.0454   50.0209
   24.3110   44.9555
   50.2384   17.0784
   19.3034   49.9962
   71.9443   23.3046
   22.6353   48.0634
   60.9747   82.8144
   49.4000   20.1467
   76.3021   34.9598
   45.1242   53.6422
   36.0381   60.4131
   20.9398   49.6439
   47.3629   33.8447
   12.6614   56.7730
3)调用遗传优化算法函数,取进化繁殖100代,变异概率为0.08,浮点编码。
% 遗传优化算法搜索
[xf,endPop,bPop,trace]=ga([0,80],'maxf_1',[],startPop,[1e-6 1 1], 'maxGenterm',
100,'normGeomSelect',[0.08],['arithXover'],[2],'nonUnifMutation',[2 100 3]);
xf
% 在图中以红色“*”号标示最优种群
plot(endPop(:,1),endPop(:,2),'r*');
Legend('圆圈:初始种群','星号:最优种群')
M文件运行后,最优种群的星号标记在图9-4中,计算结果如表9-2所示。

表9-2 遗传算法搜索的中间结果
1

从表9-2可见,从第52代开始,就可以得到较精确的结果。经过100代搜索,获得最优种群及其函数值是:
xf =
   61.9343   84.1225
即 , 。
(4)描述遗传算法搜索过程。
% 每一代中的最好解与平均值
figure(2);
plot(trace(:,1),trace(:,2),'b:');
hold on;
plot(trace(:,1),trace(:,3),'r');
grid;
xlabel('\bf Generation');ylabel('\bf Fitness');
title('\bf 一维非线性遗传算法的各代最优解与平均值');
legend('虚线:各代种群平均值','实线:各代最优解')
M文件运行的结果如图9-5所示,图中实线表示各代最优解,虚线表示各代种群平均值。

1
图9-5 一维非线性遗传算法的各代最优解与平均值


2.多维无约束优化的遗传算法
例9-9 采用遗传算法求解二维非线性优化问题

 1

(1)绘制二维非线性函数图形
% 绘制二维非线性函数图形
x=linspace(-3,12,35);y=linspace(4,6,15);
[x1,x2]=meshgrid(x,y);
f=x1.*sin(4*pi*x1)+x2.*sin(20*pi.*x2)+21.5;          % 目标函数
surf(x1,x2,f)
xlabel('\bf x_1');ylabel('\bf x_2');zlabel('\bf f(x_1,x_2)')
title('\bf f(x_1,x_2)=x_1sin(4\pix_1)+x_2sin(20\pix_2)+21.5')
M文件运行的结果如图9-6所示。

1
图9-6  二维非线性函数图形

(2)定义适应度函数
% 定义适应度函数文件
function [sol,y]=minf_2(sol,options)
x(1)=sol(1);x(2)=sol(2);
y=x(1).*sin(4*pi.*x(1))+x(2).*sin(20*pi.*x(2))+21.5;
(3)生成初始种群
% 生成初始种群,个体数目取10
bounds=[-3 12;4 6];                                  % 变量上下限
initPop=initializega(10,bounds,'minf_2');
(4)采用遗传优化算法求解,进化繁殖200代,其他为默认参数
% 遗传优化算法搜索
[xf,endPop,beestSols,trace]=ga(bounds,'minf_2',[],[],[],'maxGenTerm',200);
beestSols
xf
M文件运行结果是:
beestSols =
    1.0000    8.6129    5.8287   35.6853
    3.0000   10.6648    5.6254   36.4818
    4.0000   11.6428    5.8287   38.5248
   15.0000   11.6343    5.8287   38.7274
   16.0000   11.6277    5.8287   38.7931
   17.0000   11.6343    5.9274   38.9171
   19.0000   11.6277    5.9274   38.9831
   23.0000   11.6277    5.9233   39.0102
   25.0000   11.6277    5.9252   39.0455
   28.0000   11.6277    5.9251   39.0458
   29.0000   11.6277    5.9250   39.0458
   48.0000   11.6271    5.9250   39.0481
   50.0000   11.6270    5.9250   39.0485
   51.0000   11.6269    5.9250   39.0487
   53.0000   11.6268    5.9250   39.0489
   55.0000   11.6267    5.9250   39.0490
   56.0000   11.6267    5.9250   39.0492
   63.0000   11.6262    5.9250   39.0499
   64.0000   11.6261    5.9250   39.0500
   65.0000   11.6260    5.9250   39.0501
   67.0000   11.6257    5.9250   39.0503
   69.0000   11.6255    5.9250   39.0503
   91.0000   11.6256    5.9250   39.0503
   93.0000   11.6256    5.9250   39.0503
  200.0000   11.6255    5.9250   39.0503
xf =
   11.6255    5.9250   39.0503
运算结果表明,繁殖到第67代时获得最优解

1
 

(5)描述遗传算法搜索过程
plot(trace(:,1),trace(:,2),'b:');
hold on;
plot(trace(:,1),trace(:,3),'r');
grid;
xlabel('\bf Generation');ylabel('\bf Fitness');
title('\bf 二维非线性遗传算法的各代最优解与平均值');
legend('虚线:各代种群平均值','实线:各代最优解')
M文件运行结果如图9-7所示,图中实线表示各代最优解,虚线表示各代种群平均值。

1
图9-7  二维非线性遗传算法的各代最优解与平均值