文章目录
1. 问题2. 程序2.1 目标函数2.2 约束条件2.3 主函数3. 附录摘要
本文以一个双变量的目标函数优化问题为例,借助MATLAB内置的遗传算法进行优化分析。
1. 问题
最小化如下包含两个变量的目标函数
minxf(x)=100(x12−x2)2+(1−x1)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)
满足的非线性约束条件和边界条件为:
{x1x2+x1−x2+1.5≤010−x1x2≤00≤x1≤1and0≤x2≤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≤1and0≤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中使用遗传算法执行最优化