摘要:本文介绍了在MATLAB中,如何利用遗传算法求解一个具体函数的最小值。通过编写简洁的代码,我们成功找到了函数的最优解,并得出了最小值。
1. 函数最小化问题描述
我们需要求解的函数为:min y = 20 + X1^2 + X2^2 + 10cos(X1)X2^2 - sin(X2)X1^2,其中 X1 和 X2 的取值范围均为 [-5, 5]。
2.1 目标函数和变量边界
我们定义了目标函数 fitnessFunction,同时设置了变量 X1 和 X2 的取值范围。
fitnessFunction = @(x) 20 + x(1)^2 + x(2)^2 + 10 * cos(x(1)) * x(2)^2 - sin(x(2)) * x(1)^2;
lb = [-5, -5]; % 变量下界
ub = [5, 5]; % 变量上界
2.2 遗传算法选项
我们使用 optimoptions 函数设置遗传算法的参数。
options = optimoptions('ga', 'PopulationSize', 100, 'MaxGenerations', 200, 'PlotFcn', {@gaplotbestf, @gaplotbestindiv});
2.3 运行遗传算法
使用 ga 函数运行遗传算法,得到最优解 x 和最小值 fval。
[x, fval] = ga(fitnessFunction, 2, [], [], [], [], lb, ub, [], options);
3. 结果展示
我们将最优解和最小值输出到命令行窗口。
fprintf('最优解: x1 = %f, x2 = %f\n', x(1), x(2));
fprintf('最小值: %f\n', fval);
可得最小值为-204.593699,X1,X2值如图
%用遗传算法求解min y=20+X1^2+10cos(X1)*X2^2-sin(X2)*X1^2
% 其中x1:[-5,5],x2:[-5,5]
% 目标函数
fitnessFunction = @(x) 20 + x(1)^2 + x(2)^2 +10 * cos(x(1))*x(2)^2- sin(x(2))*x(1)^2;
% 变量边界
lb = [-5, -5]; % 变量下界
ub = [5, 5]; % 变量上界
% 遗传算法选项
options = optimoptions('ga', ...
'PopulationSize', 100, ... % 初始种群大小
'MaxGenerations', 200, ... % 最大代数
'PlotFcn', {@gaplotbestf, @gaplotbestindiv}); % 绘图函数,绘制最佳函数值和最佳个体
% 运行遗传算法
[x, fval] = ga(fitnessFunction, 2, [], [], [], [], lb, ub, [], options);
% 显示结果
fprintf('最优解: x1 = %f, x2 = %f\n', x(1), x(2));
fprintf('最小值: %f\n', fval);