约束非线性规划工具-fmincon(matlab)的使用

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’

未完待续

    原文作者:Yangrd
    原文地址: https://www.jianshu.com/p/15c33243c0be
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞