motivation:
记录一些fmincon使用方法和应对一些问题的解决方法
1.简介:
在MATLAB中,使用函数
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
即可调用fmincon函数进行约束非线性规划,其中fun为目标函数:
例如:
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
x0为初始值:
x0 = [0.5,0]
A和b为线性不等式约束条件的参数,Aeq和beq为线性不等式约束条件的参数(没有使用过,形式如下):
A = [1,2];
b = 1; % A*x <= b
Aeq = [2,1];
beq = 1; % Aeq*x <= b
lb为x0中每一维的下限,ub位每一维的上限,形式如下:
%表示x0第一维的区间是[0,1],第二维的区间是[0,2]
lb = [0,0];
ub = [1,2];
nonlcon(Nonlinear constraints)为非线性不等式约束,使用方法如下:
例如:
x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)
创建约束函数的.m文件
function [c,ceq] = mycon(x)
c = [(),…,()] % Compute nonlinear inequalities at x.
ceq = [(),..,()] % Compute nonlinear equalities at x.
option为设置fmincon的参数,定义option的形式为:
option = optimoptions(@fmincon,’参数名1′, 参数值1, ‘参数名2’, 参数值2)
例如:
option = optimoptions(@fmincon,’Algorithm’,’sqp’)
2.option参数的设置
除去option外,传入fmincon的其他参数形式简单,调用起来非常简单,此处不再赘述。以下介绍option中的几个参数。
‘Algorithm’:
该参数的含义是,为fmincon规划选择算法。可选算法有:
‘interior – point’ (默认算法)
‘trust – region – reflective’
‘sqp’
‘sqp-legacy'(iotimoptions only)
‘active – set’
其中,后三种方法为medium-scale算法,不能应对大规模的规划问题。‘trust – region – reflective’ 算法能够应对大规模的规划问题,但是使用‘trust-region-reflective’算法需要满足一些条件。但是官方文档表示,大规模和中规模算法各有优势,不是单纯的数据量大小:
Don’t let the name “large scale” mislead you; you can use a large-scale algorithm on a small problem. Furthermore, you do not need to specify any sparse matrices to use a large-scale algorithm. Choose a medium-scale algorithm to access extra functionality, such as additional constraint types, or possibly for better performance.
实验发现(使用‘interior – point’算法),当变量在500个左右,当约束公式的长度减小的时(从70000+项削减到10000+项),规划时间大大缩短(从170分钟缩短到11分钟),但是在进行长公式规划的时候,系统占用的cpu和内存并不高,所以可以考虑“将约束条件分组,多线程进行规划,再组合”
官方文档推荐:
先使用‘interior-point’算法;(能够快速精确的解决大规模的问题)
在小规模到中规模的问题上运行一个优化,先尝试‘sqp’,再尝试‘active-set’;
合适的时候使用‘trust-region-reflective’,问题必须满足:目标函数包含了梯度,边界和线性约束只能存在一个;
When the Solver Fails
1.开启Iterative Display
options = optimoptions(‘solvername’, ‘Display’,’iter’)
在执行规划之后打印出参数
Iteration Func-count f(x) Step-size First-order optimality
1 4 -0.841471 1 0.54
exitflag返回为1的条件是:
First-order optimality measure was less thanoptions.OptimalityTolerance, and maximum constraint violation was less thanoptions.ConstraintTolerance.
First-order optimality measure小于thanoptions.OptimalityTolerance,并且maximum constraint violation小于thanoptions.ConstraintTolerance
在实验中发现,返回的exitflag是0时(表示超过最大迭代数),大部分的非线性约束的不等式的值小于0,部分等于0,其实已经满足的条件,但是程序仍然进行迭代运算,直到超过最大迭代数,而且后期每次迭代的约束方程的值和目标函数已经不发生变化。此时认为已经满足了约束。
另一种情况是,exitflag为0,但是某些非线性约束的不等式方程的值大于0,此时没有满足约束。
所以exitflag = 0包含了两种情况。
可以通过观察First-order optimality measure,将OptimalityTolerance调大,可以将第一种情况分离开来。
‘Solver Takes Too Long’
未完待续