摘要
本文以一个双变量的目标函数优化问题为例,借助MATLAB内置的遗传算法进行优化分析。
1. 问题
最小化如下包含两个变量的目标函数
min
x
f
(
x
)
=
100
(
x
1
2
−
x
2
)
2
+
(
1
−
x
1
)
2
(1)
\min_x f(x) = 100(x_1^2-x_2)^2 + (1-x_1)^2 \tag{1}
xminf(x)=100(x12−x2)2+(1−x1)2(1)
满足的非线性约束条件和边界条件为:
{
x
1
x
2
+
x
1
−
x
2
+
1.5
≤
0
10
−
x
1
x
2
≤
0
0
≤
x
1
≤
1
and
0
≤
x
2
≤
13
(2)
\left\{ \begin{aligned} &x_1x_2 + x_1 - x_2 + 1.5 \le 0 \\ &10 - x_1x_2 \le 0 \\ &0 \le x_1 \le 1 \ \text{and} \ 0 \le x_2 \le 13 \end{aligned} \tag{2} \right.
⎩⎪⎨⎪⎧x1x2+x1−x2+1.5≤010−x1x2≤00≤x1≤1 and 0≤x2≤13(2)
2. 程序
依托MATLAB,定义目标函数和约束函数
|
2.1 目标函数
在MATLAB中编写目标函数
function y = myFitness(x)
% 目标函数
% 输入:
% x-对应优化的变量,x(1)-x1, x(2)-x2
% 输出:
% y-对应优化值
y = 100 * (x(1)^2 - x(2))^2 + (1 - x(1))^2;
end
可在命令行键入 myFitness([1,2])
, 检查函数是否正确,正确的输出结果为 100
.
2.2 约束条件
在MATLAB中编写约束条件
function [c,c_eq] = myConstraints(x)
% 约束函数
% 输入:
% x-对应优化的变量,x(1)-x1, x(2)-x2
% 输出:
% c—不等式约束
% c_eq—等式约束
c = [1.5 + x(1)*x(2) + x(1) + x(2);
-x(1)*x(2) + 10];
c_eq = [];
end
可在命令行键入 [c, c_eq] = myConstraints([1,2])
, 检查函数是否正确,正确的输出结果为 c = [2.5000 8.0000]',c_eq = []
.
2.3 主函数
在MATLAB中编写主函数,调用内置的GA算法
%% 主函数
% 利用GA(Genetic Algorithm)最小化目标函数
ObjFcn = @myFitness; % 利用@传输目标函数句柄
nvars = 2; % 变量数目
LB = [0,0]; % 变量下限
UB = [1,13]; % 变量上限
ConsFcn = @myConstraints; % 利用@传输约束函数句柄
[x,fval] = ga(ObjFcn,nvars,[],[],[],[],LB,UB,ConsFcn); % 调用遗传算法,x为最优值对应的变量取值,fval为最优值
本例的正确结果为x=[0.8122 12.3166],fval=1.3588e+04
3. 附录
Constrained Optimization with Genetic Algorithm - A MATLAB Tutorial for Beginners
在matlab中使用遗传算法执行最优化