其实对于做优化的人来说,解决线性优化与非线性优化问题,有很多比MATLAB更加迅速的求解软件与语言,如AMPL,GAMS等语言,而且写起来十分的抽象(但凡越高级的语言越抽象)。但我还是更习惯于使用MATLAB,毕竟我只要求解出来即可,也不追求求解速度。
所以就利用这段时间学习一下MATLAB官方提供的优化工具包的使用。MATLAB官方文档是我学习的文档。Optimization Toolbox提供了在满足约束条件下查找参数来实现最小化或最大化目标的功能。其提供了许多函数可以用来求解线性优化和非线性优化相关的许多问题,但对于NP-hard问题这些只能起到一个辅助作用,可以使用这些函数构造更加复杂的优化算法,比如列生成算法,或用于某些算法,在这些算法中优化只是其中的一个步骤,比如机器人的运动规划。
在运用里面的优化工具包求解优化时,我们以文档中举的一个简单的线性优化问题为例来进行分入门。考虑这样一个函数:f(x)=100(x2−x1^2)+(1−x1)^2,并且其约束条件为:x1^2+x2^2≤1 这个问题如果我们要自己去写算法求解,估计很多人得学好相关的优化算法才能写的出来,但用MATLAB的数学优化工具包则可以很快的求解,对我们进行后面的优化能起到帮助,虽然现在我做的东西基本上是NP-Hard的,MATLAB求解不出来,但在整个求解过程中用来解决部分优化问题还是很方便的。说偏了继续回来,要用MATLAB的优化工具包求解首先得建立两个数学模型文件,因为主要是学习优化工具包,而且这个也比较简单,就不多说首先建立两个m文件。一个为目标函数rosenbrock.m,一个为约束条件unitdisk.m。均写成函数形式。
function f=rosenbrock(x) f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; end
function [c,ceq]=unitdisk(x) c=x(1)^2+x(2)^2-1; ceq=[]; end
接下来就是运用工具包求解了,有两种方法,第一种方法就是用MATLAB界面应用程序中的optimization,打开可以看到如下界面(官方文档中说以后会取消这种方式):
按照我所示的界面设置好即可,注意不同程序不同文件名在最左边的这一栏设置是不一样的,最后点击start运行,就可得到最下面的结果。 第二种方法则是在命令框中输入命令去做,对于此问题首先输入options = optimoptions(@fmincon, ‘Display’,’iter’,’Algorithm’,’interior-point’);可以看到括号里的第一个对应的求解方法,展现对应的迭代就是上图第二栏的最下面,算法用的内点法上图左侧栏目的第二行。最后输入[x,fval] = fmincon(@rosenbrock,[0 0], [],[],[],[],[],[],@unitdisk,options)即可求解,最后为什么有6个[]可以自行输入的时候去探索一下,他会弹出一些参数,如果你的模型不含有这个就可以输入[]。
后续我会再看看这个工具箱的应用程序具体怎么用。