本期我们进行运筹学之非线性规划算法的讲解,我们将对非线性规划的基础知识进行一个简单的回顾,并介绍求解无约束极值问题和约束极值问题的MATLAB和Python相关代码,以帮助大家利用工具快速求解无约束极值问题和约束极值问题,做到事半功倍。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹说”公众号→后台回复“算法介绍之非线性规划”获取完整代码。话不多说,我们一起来看看吧!
一、基础知识
1、无约束极值问题
⭐问题描述
无约束极值问题可以表述为:
min fX,X∈En
迭代法大体分为两类:一类是要用到函数的一阶导数和(或)二阶导数,由于用到了函数的解析性质,故称为解析法;另一类在迭代过程中仅用到函数值,而不要求函数的解析性质,这类方法称为直接法。一般来说,直接法收敛速度较慢,只是在变量较少时才使用。因此下面介绍解析法中的两种算法:梯度法(最速下降法)和牛顿法。
⭐梯度法
梯度法又名最速下降法,是一种用于求解最优化问题的迭代优化算法,是理解其他非线性优化问题方法的基础。
基本思路:
通过不断地沿着目标函数的负梯度方向更新参数,以使目标函数值逐渐减小,最终达到局部或全局最小值。
算法基本步骤:
(1)给定初始点X(0) 和允许误差ε>0 ,令k : = 0。
(2)计算f(X(k)) 和∇(X(k)) ,若∥∇(X(k))∥2≤ε ,停止迭代,得近似极小点X(k) 和近似极小值f(X(k)) ;否则,转下一步。
(3)做一维搜索。
λk:minf(X(k)-λ∇f(X(k))
并计算X(k+1)=X(k)-λk∇f(X(k)) ,然后令k : k+1,转回第(2)步。
求解流程:
⭐牛顿法
基本思想:
牛顿法可用于求解非正定二次函数的极小点,对于正定二次函数,迭代搜索方向就是指向其极小点的方向,因此,用牛顿法求解正定二次函数的无约束最优化问题,只需一次就可以得到最优解。
考虑正定二次函数
此处A 为对称正定阵,X∈En ,c 为常数。
假定该函数的极小点是X* ,,则必有
从而AX*=-B 。另外,对任一点X(0)∈En ,函数在该点的梯度∇fX(0)=AX(0)+B 。消去B 就得到
∇fX(0)=AX(0)-AX*
由此可解出
这说明,对应正定二次函数,从任意近似点X(0) 出发,沿-A-1∇f(X0) 方向搜索,以1为步长,迭代一步即可达极小点。
牛顿法迭代步骤:
已知目标函数f(X) 及其梯度gX=∇f(X) ,Hessian矩阵,终止限ε1 ,ε2 ,ε3 。
(1)选定初始点X0 ;计算f0=f(X0) ,g=g(X0) ,置k=0 。
(2)计算GkX=∇2f(Xk) 。
(3)由方程解GkPk=-gk ,解出Pk 。
(4)计算Xk+1=Xk+Pk ,fk+1=f(Xk+1) ,gk+1=g(Xk+1) 。
(5)判别终止准则是否满足:若满足,则输出最优解Xk+1 ,fk+1 停止;否则,置k=k+1 ,转(2)。
算法流程图:
算法对比:
2、约束极值问题
绝大多数实际问题都受到某些条件的限制,这些限制条件(约束)常给工作带来很大的困难。解决约束极值问题,可以考虑将约束极值问题转换为无约束极值问题,制约函数法就是通过构造某种制约函数,并将其加到非线性规划的目标函数上,从而将约束极值问题转换为无约束极值问题。下面介绍其中最基本的两种算法:罚函数法(也称外点法)和障碍函数法(也称内点法)。
⭐罚函数法(外点法)
罚函数法的迭代步骤:
(1)取第一个罚因子M1=1(例如说取),允许误差 ε>0 ,并令k : =1。
(2)求下述无约束极值问题的最优解:
min P(X,Mk)
极小值点为X(k)。
(3)若存在某一个j(1≤j≤l) ,有
−gj(X(k))>ε
或(和)存在某一个i(1≤i≤m),有
−|hi(X(k))|>ε
则取Mk+1>Mk,并令k : =k+1。然后,转回第(2)步。否则,停止迭代,得所要的点X(k)。
⭐障碍函数法(内点法)
算法特点:
障碍函数法的一个重要特点,就是函数P(X,M)可在整个 En 空间内进行优化,可以任意选择初始点,这给计算带来了很大的方便。
如果要求每次的近似解都是可行解,以便观察目标函数值的改善情况;或者,如果目标函数在可行域外的性质比较复杂,甚至没有定义,这时就无法使用上面所述的罚函数了。
障碍函数法的迭代步骤:
(1)取第一个障碍因子r1>0,允许误差ε>0,并令k:=1。
(2)构造障碍函数。
(3)对障碍函数进行无约束极小化(注意,迭代点必须在R0内),设极小解为X(k)∈R0。
(4)检查是否满足收敛准则。
满足则停止迭代并得到所要的近似极小解X(k)。否则取rk+1<rk并令k:=k+1。然后,转回第(3)步继续迭代。
二、算法实现
1、梯度法
(1)例题介绍
用梯度法求解下列无约束非线性规划问题。
其中 ,要求选取初始点 。函数图像如下所示:
(2)代码实现
①MATLAB
★ 代码展示
我们以上述例题为例,借助MATLAB介绍实现求解的相关代码。
★ 代码调用
代码运行及最终结果展示如下,x(1)代表了公式中的x,x(2)代表了公式中的y,经过代码运行得出无约束非线性规划问题的最小值在x = 10,y = 10时取到,最小值f(x)为0,具体结果体现为无限接近0的数字。
(2)Python代码展示
我们以上述例题为例,借助Python介绍实现求解的相关代码。
★ 代码调用
代码运行及最终结果展示如下经过代码运行得出无约束非线性规划问题的最小值在接近x = 10,y = 10时取到,最小值f(x)为0。
(3)可视化
2、牛顿法
(1)例题介绍
用梯度法求解下列无约束非线性规划问题。
其中 ,要求选取初始点 。函数图像如下所示:
(2)代码实现
①MATLAB
★ 代码展示
我们以上述例题为例,借助MATLAB介绍实现求解的相关代码。
★ 代码调用
代码运行及最终结果展示如下,x(1)代表了公式中的x1,x(2)代表了公式中的x2,经过代码运行得出无约束非线性规划问题的最小值在x1 = 0,x2 = 0时取到,最小值f(x)为0,具体结果体现为x1,x2 和f(x)都为无限接近0的数字。
②Python
★ 代码展示
我们以上述例题为例,借助Python介绍实现求解的相关代码。
★ 代码调用
代码运行及最终结果展示如下,经过代码运行得出无约束非线性规划问题的最小值在x = 0,y = 0时取到,最小值f(x)为0,具体结果体现为三者都为无限接近0的数字。
(3)可视化
3、罚函数法
(1)例题介绍
用罚函数法求解
(2)代码实现
①MATLAB
★ 代码展示
我们以上述例题为例,借助MATLAB介绍实现求解的相关代码。
代码运行及最终结果展示如下,当M=0时,x(M)=0.5,当M=1时,x(M)=0.25,当M=10时,x(M)=0.045。
(2)Python代码展示
我们以上述例题为例,借助Python介绍实现求解的相关代码。
代码运行及最终结果展示如下,当M=0时,x(M)=0.5,当M=1时,x(M)=0.25,当M=10时,x(M)=0.045。
4、障碍函数法
(1)例题介绍
用障碍函数法求解
(2)代码实现
①MATLAB
★ 代码展示
我们以上述例题为例,借助MATLAB介绍实现求解的相关代码。
★ 代码调用
代码运行及最终结果展示如下,当r=1时,x(r)=1,当x=0.1时,x(r)=0.316,当x=0.01时,x(r)=0.1。原约束问题极小点x*=0。
②Python
★ 代码展示
我们以上述例题为例,借助Python介绍实现求解的相关代码。
★ 代码调用
代码运行及最终结果展示如下,当r=1时,x(r)=1,当x=0.1时,x(r)=0.316,当x=0.01时,x(r)=0.1。原约束问题极小点x*=0。
三、参考资料
【非线性规划(一):定义与数值优化方法(梯度法、牛顿法、拟牛顿法、变尺度法)】
https://blog.csdn.net/qq_29831163/article/details/89483975
【梯度下降算法详解及Python实现.整理】
https://zhuanlan.zhihu.com/p/107782332
【牛顿法python 实现】
https://blog.csdn.net/Big_Pai/article/details/88540037
本期的内容就介绍到这里,想要进一步了解运筹学,关注本公众号,快快学起来吧!
作者 | 王连聚 齐涵
责编 | 刘文志
审核 | 徐小峰