目录:
一、非线性规划介绍
二、matlab中非线性规划函数
1.fminbnd——求解一维函数
2.fminsearch——求解无约束多维极值问题
3.fminimax——求解最大最小值(多目标)问题
4.fminunc——求解无约束多维极值问题
5.fmincon——约束优化问题
三、启发式算法介绍
1.模拟退火算法(SA,Simulated Annealing)
2.神经网络算法(NN,Neural Network)
3.蚁群算法(ACO,Ant Clony Optimization)
一、非线性规划介绍
线性规划的目标函数与约束条件都是线性的,如果目标函数与约束条件中包含有非线性因素存在,则这样的规划问题就被称为非线性规划问题。其实,规划问题可以简单粗暴的一分为二,不是线性就是非线性。在实际的问题中,非线性规划的比率较高,今天学习的非线性规划也仅仅作为一个简单的入门。
非线性规划的一般数学表示形式为:
min f(X)
st. h(X)=0
g(X)>=0
与线性规划的数学形式一致
二、matlab中的内置非线性规划函数
matlab中的内置非线性规划函数在其工具箱Optimization Toolbox中均有对应的功能,介绍函数后我们可以直接使用工具箱来进行求解。
1.fminbnd——求解一维函数
[x,fx,exitflag,output]=fminbnd(fun,lb,ub,options)
输出参量分析:
x:最小值点
fx:最小值
exitflag:输出算法停止原因
若1,则已寻找到最优解
若0,迭代次数超过设置的迭代次数
若-2,则输入的lb,ub错误
output:一个struct字段,包含三项信息
interations:迭代次数
funcCounnt:函数赋值次数
algorithm:使用算法
输入参量分析:
fun:输入的函数,以'fun'或@fun的形式输入
lb,ub:解的可行域
options:options是对求解过程中的迭代次数,终止容差(我理解的是解的精度),以及是否做出迭代图像的控制。options的设置要使用optimset函数
以一段具体代码来分析:
options = optimset('Display','iter'); %显示迭代过程。
options = optimset('PlotFcns',@optimplotfval); %绘制迭代图。
options = optimset('Tolx',1e-6); %设置解的容差
options = optimset('MaxIter',1000); %设置最大迭代次数
这里以matlab内置humps函数演示
humps图像如图
ezplot(@humps,[0 2])
取解的范围为[0.2 1]
clear all
clc
lb = 0.2; %规定解的可行域
ub = 1;
options = optimset('Display','iter'); %显示每一步的迭代结果
options = optimset('PlotFcns',@optimplotfval); %绘制迭代图。
options = optimset('Tolx',1e-6); %设置解的容差
format long
[x,fx,exitflag,output]=fminbnd(@humps,lb,ub,options)
运行结果:
x =
0.637008945968909
fx =
11.252754125696612
exitflag =
1
output =
包含以下字段的 struct:
iterations: 10
funcCount: 11
algorithm: 'golden section search, parabolic interpolation'
message: '优化已终止:↵ 当前的 x 满足使用 1.000000e-06 的 OPTIONS.TolX 的终止条件↵'
由于只能求一维函数极值,因此fminbnd函数的应用(比如解一些高中数学题?)并不多,但通过对fminbnd函数的使用却能让我们学会options的设置以及明白各项输出结果所代表的意义。
2.fminsearch——求解无约束多维问题
fminsearch是用来求解无约束条件的多维极值函数,其调用方式为:
[x,fx,exitflag,output]=fminsearch(fun,x0,options)
输出输入参量的意义同上,其中x0为给定初始解。
matlab代码实现
function f=fun(x) %建立函数的.m文件
f=x(1)+x(2)^2/(4*x(1))+x(3)^2/x(2)+2/x(3);
end
clear all
clc
options = optimset('Display','iter'); %显示每一步的迭代结果
options = optimset('Tolx',1e-6); %设置解的容差
[x,fx,exitflag,output]=fminsearch(@fun,[0.5 0.5 0.5],options)
运行结果: