近似解决非线性优化问题的方法:序列线性规划SLP

news2024/11/23 11:40:24

文章目录

  • 1. 什么是序列线性规划?
  • 2. SLP算法逻辑
    • 2.1 非线性规划问题
    • 2.2 通过泰勒级数展开线性化
    • 2.3 步长边界Step Bounds
    • 2.4 序列线性规划的迭代逻辑
  • 3. 演算示例
  • 4. 涉及代码
    • 4.1 绘制可行域
    • 4.2 求解序列线性规划
    • 4.3 计算步长边界更新公式
  • 参考资料


1. 什么是序列线性规划?

Successive Linear Programming (SLP) 序列线性规划,有时也称为 Sequential Linear Programming,它是一种用于近似解决非线性优化问题的优化技术1,最早的相关资料来自1961年,由Shell Oil公司的Griffith和Stewart提出,起初SLP的计算方法被称为数学近似规划法(Mathematical Approximation Programming,MAP),该方法从最优解的某个估值出发,求解模型的一系列通过泰勒级数展开的一阶近似(线性规划)问题,从而实现对非线性规划问题的有效求解2

2. SLP算法逻辑

2.1 非线性规划问题

非线性规划(Nonlinear Programming,NLP)是数学优化中的一个分支,涉及目标函数和/或约束条件是非线性的优化问题。与线性规划不同,非线性规划问题中,变量和函数之间的关系是非线性的,这使得问题的复杂性和求解难度大大增加。

考虑这么一个非线性问题:

minimize ⁡ g 0 ( x ) + A 0 y = h ( x , y ) subject to g ( x ) + A 1 y = b 1 ( m 1  rows  ) , A 2 x + A 3 y = b 2  ( m 2  rows  ) , l x < x < u x , l y < y < u y . \begin{array}{ll} \operatorname{minimize} & g_0(x)+A_0 y=h(x, y) \\ \text {subject to} & \\ & g(x)+A_1 y=b_1\left(m_1 \text { rows }\right), \\ & \left.A_2 x+A_3 y=b_2 \text { (} m_2 \text { rows }\right), \\ & l^x<x<u^x, l^y<y<u^y .\end{array} minimizesubject tog0(x)+A0y=h(x,y)g(x)+A1y=b1(m1 rows ),A2x+A3y=b2 (m2 rows ),lx<x<ux,ly<y<uy.

其中, h ( x , y ) h(x,y) h(x,y) 是目标函数, x = [ x 1 , x 2 , . . . , x n 1 ] x=[x_1,x_2,...,x_{n_1}] x=[x1,x2,...,xn1] 是非线性变量,与目标函数的非线性关系体现在非线性函数 g 0 ( ) g_0() g0() 上,与 m 1 m_1 m1 条非线性约束的非线性关系体现在 g ( x ) = ( g 1 ( x ) , g 2 ( x ) , . . . , g m 1 ( x ) ) g(x)=(g_1(x),g_2(x),...,g_{m_1}(x)) g(x)=(g1(x),g2(x),...,gm1(x)) 上,变量 x x x 的上下界为 l x = [ l 1 x , l 2 x , . . . , l n 1 x ] , u x = [ u 1 x , u 2 x , . . . , u n 1 x ] l^x=[l_1^x,l_2^x,...,l_{n_1}^x],u^x=[u_1^x,u_2^x,...,u_{n_1}^x] lx=[l1x,l2x,...,ln1x],ux=[u1x,u2x,...,un1x]

另一部分变量 y = [ y 1 , y 2 , . . . , y n 2 ] y=[y_1,y_2,...,y_{n_2}] y=[y1,y2,...,yn2] 是线性变量,与目标函数、约束条件的关系都是线性的,上式中的 m 2 m_2 m2 行约束是线性函数,同理, y y y 也有相对应的上下界,上下界的向量值允许是正无穷或负无穷。

任何非线性规划可以用上述形式表示3,对于非线性规划,允许 m 2 = 0 m_2=0 m2=0,即没有线性约束;而像诸如不等式的松弛变量,以及广义逻辑约束线性化的辅助变量,均是线性叠加的形式,归到 y y y 当中。

非线性规划的特点

  1. 多个局部最优解:线性规划问题(凸优化)的局部最优解是全局最优解,然后非线性规划问题通常存在多个局部最优解,因此要找到全局最优解并不容易;
  2. 计算复杂性:由于非线性函数的存在,规划问题的求解可能涉及复杂的计算和迭代过程,通常需要使用高级的优化算法和数值方法,例如梯度法、序列线性规划、序列二次规划、元启发式等。

2.2 通过泰勒级数展开线性化

使用泰勒级数展开的前提是所有的非线性函数 g 0 ( x ) , g 1 ( x ) , . . . g m 1 ( x ) g_0(x),g_1(x),...g_{m_1}(x) g0(x),g1(x),...gm1(x) 在任何地方都是可微的,可微性条件保证了依靠梯度进行优化的算法能够正常运行并收敛到最优解。

给定一个初始基点 ( x a , y a ) (x^a,y^a) (xa,ya),用点 x a x^a xa 处的一阶泰勒展开式替代非线性规划问题中的非线性函数,得到 L P LP LP 问题。如下,定义所有非线性函数一阶导的雅可比矩阵为: J ( x a ) = ( ∂ g / ∂ x a ) J(x^a)=\left(\partial g / \partial x^a\right) J(xa)=(g/xa)

用一阶泰勒展开式 g ( x a ) + J ( x a ) ( x − x a ) g(x^a)+J(x^a)(x-x^a) g(xa)+J(xa)(xxa) 近似替代 g ( x ) g(x) g(x),得到如下的线性规划问题(SLP问题):

minimize ⁡ g 0 ( x a ) + ∇ g 0 ( x a ) ( x − x a ) + A 0 y subject to J ( x a ) ( x − x a ) + A 1 y = b 1 − g ( x a ) A 2 x + A 3 y = b 2 l x < x < u x , l y < y < u y \begin{array}{ll} \operatorname{minimize} & g_0(x^a) + \nabla g_0(x^a) (x-x^a)+A_0 y \\ \text {subject to} & \\ & J(x^a) (x-x^a)+A_1 y=b_1-g(x^a) \\ & A_2 x+A_3 y=b_2 \\ &l^x<x<u^x, l^y<y<u^y \end{array} minimizesubject tog0(xa)+g0(xa)(xxa)+A0yJ(xa)(xxa)+A1y=b1g(xa)A2x+A3y=b2lx<x<ux,ly<y<uy

其中,目标函数的 g 0 ( x a ) g_0(x^a) g0(xa) 是常量可以省略。显然的,求解近似线性规划问题的解并不一定是非线性规划问题的可行解,但随着迭代次数增加, x x x 和基点差距缩小,这种不可行性也会随之降低。

2.3 步长边界Step Bounds

如前面所述,用一阶泰勒展开式替代原非线性函数的误差随着 x − x a x-x^a xxa 越大而越大,而只要 ∣ x − x a ∣ |x-x^a| xxa 足够小,则一阶泰勒展开式的误差也逐步缩小,即认为非线性函数在 ( x , x a ) (x, x^a) (x,xa) 的极小范围内是近乎线性的。因此,为了减小误差,应对从基点出发的搜索范围 ∣ x − x a ∣ |x-x^a| xxa 进行限制,用 d = x − x a d=x-x^a d=xxa 表示搜索范围,用 ( − s , s ) (-s,s) (s,s) 表示搜索范围的边界,也称为步长边界Step Bounds, s s s 是与 x x x 维度相同的正向量。

显然,搜索范围内的解 x a + d x^a+d xa+d 同样落在 [ l x , u x ] [l^x,u^x] [lx,ux] 范围内,因此可得:

l x − x a ≤ d ≤ u x − x a → max ⁡ ( l x − x a , − s ) ≤ d ≤ min ⁡ ( u x − x a , s ) l^x-x^a\leq d\leq u^x-x^a\\\\ \rightarrow \max(l^x-x^a,-s)\leq d\leq \min(u^x-x^a, s) lxxaduxxamax(lxxa,s)dmin(uxxa,s)

在搜索范围的限制下,求解的SLP形式的线性规划问题用符号表示为 L P ( x a , s ) LP(x^a,s) LP(xa,s),基于 x a x^a xa 求得的新解为 ( d a , y a + 1 ) (d^a,y^{a+1}) (da,ya+1),即得到的后继点为 ( x a + 1 , y a + 1 ) (x^{a+1},y^{a+1}) (xa+1,ya+1),其中 x a + 1 = x a + d a x^{a+1}=x^a+d^a xa+1=xa+da

然而,对于SLP算法而言,步长 d d d 的选择至关重要,如果设置的步长边界过大,则SLP将在很长一段时间内在当前最优解附近振荡(精度不高);如果设置的步长边界过小,则SLP的收敛速度将会非常缓慢。因此,Griffith和Stewart也在1961年的文献中强调了在迭代时步长边界在最优点附近应降低的必要性,以控制解的震荡并强制收敛3

通常的做法是自适应地调整步长边界,这里介绍一个简单的更新步长边界的算法1,显然的,对于 L P ( x a , s ) LP(x^a, s) LP(xa,s) 得到的新解,总是比初始基点会更好;同理,由于是近似替代非线性函数,因此也希望得到的新解放在非线性规划当中,是变得更优。因此可以通过如下逻辑更新步长边界:

  1. 计算新解 ( x a + 1 , y a + 1 ) (x^{a+1},y^{a+1}) (xa+1,ya+1) 和旧解 ( x a , y a ) (x^a,y^a) (xa,ya),在SLP和NLP问题中对目标函数的改进量之间关系,计算如下公式:
    h N L P ( x a + 1 , y a + 1 ) − h N L P ( x a , y a ) h S L P ( x a + 1 , y a + 1 ) − h S L P ( x a , y a ) \frac{h_{NLP}(x^{a+1},y^{a+1})-h_{NLP}(x^a,y^a)}{h_{SLP}(x^{a+1},y^{a+1})-h_{SLP}(x^a,y^a)} hSLP(xa+1,ya+1)hSLP(xa,ya)hNLP(xa+1,ya+1)hNLP(xa,ya)
  2. 如果上述式子接近 1 1 1,例如在 [ 0.75 , 1.25 ] [0.75,1.25] [0.75,1.25] 范围内,则说明线性近似的准确性较高,继续增大步长边界;反之,如果上述式子的值偏离 1 1 1,例如 ( − ∞ , 0.75 ) ∪ ( 1.25 , + ∞ ) (-\infin,0.75)\cup (1.25,+\infin) (,0.75)(1.25,+),说明近似线性函数与原来的非线性函数差距较大,此时应减少步长边界。

2.4 序列线性规划的迭代逻辑

综上所述,序列线性规划的完整迭代逻辑如下:

  1. 获取非线性规划问题的一个初始可行解 ( x a , y a ) (x^a,y^a) (xa,ya) 作为基点;
  2. 给定步长边界 ( − s , s ) (-s,s) (s,s),求解一阶泰勒展开式近似的线性规划问题 L P ( x a , s ) LP(x^a, s) LP(xa,s);获取最优点 ( x a + 1 , y a + 1 ) (x^{a+1}, y^{a+1}) (xa+1,ya+1)
  3. 判断近似线性规划的最优解是否满足以下终止条件:
    • h S L P ( x a + 1 , y a + 1 ) − h S L P ( x a , y a ) h_{SLP}(x^{a+1},y^{a+1})-h_{SLP}(x^a,y^a) hSLP(xa+1,ya+1)hSLP(xa,ya) 足够小:说明一阶泰勒展开式的斜率趋于 0 0 0,此时认为到了非线性函数的局部最优点;
    • 新解基本满足非线性规划问题的KKT条件:达到了非线性规划问题的局部最优点;
    • 新解在非线性规划问题上可行,且 h N L P ( x a + 1 , y a + 1 ) − h N L P ( x a , y a ) h_{NLP}(x^{a+1},y^{a+1})-h_{NLP}(x^a,y^a) hNLP(xa+1,ya+1)hNLP(xa,ya) 足够小;
    • 步长边界足够小:同理,斜率趋向于 0 0 0
  4. 如果不满足上面的终止条件,用新的解更新为新的初始点,通过前面提到的步长边界更新方法,将步长边界更新为 s ′ s' s,回到第2步。

由于SLP算法是基于局部线性化来求解的,因此极易陷入局部最优解,最终会收敛到距离初始点最近的局部最优解。

3. 演算示例

给定如下一个简单的非线性规划问题4

min ⁡ f ( x 1 , x 2 ) = ( x 1 + 1 ) × ( x 2 + 1 )  s.t.  g ( x 1 , x 2 ) = − 0.25 ( x 1 ) 2 + x 1 − x 2 + 3 ≤ 0 h ( x 1 , x 2 ) = 0.4 × x 1 + 0.6 × x 2 − 5 ≤ 0 x 1 ≥ 0 , x 2 ≥ 1 \begin{array}{cl}\min & f\left(x_1, x_2\right)=\left(x_1+1\right) \times\left(x_2+1\right) \\ \text { s.t. } & g(x_1,x_2)= -0.25\left(x_1\right)^2 +x_1-x_2+3\leq 0 \\ & h(x_1,x_2)=0.4 \times x_1+0.6 \times x_2-5\leq 0 \\ & x_1 \geq 0, x_2 \geq 1\end{array} min s.t. f(x1,x2)=(x1+1)×(x2+1)g(x1,x2)=0.25(x1)2+x1x2+30h(x1,x2)=0.4×x1+0.6×x250x10,x21

非线性规划问题的可行域如下灰色区域所示,目标函数如下图中等高线所示,显然,最小化目标函数值的最优解应该落在灰色区域靠下的位置,根据目标值曲线可知,最优解是 ( x 1 = 0 , x 2 = 3 ) (x_1=0,x_2=3) (x1=0,x2=3)。接下来,我们用序列线性规划进行迭代求解最优值。

部分数值计算结果与参考资料有出入,以本文的为准,读者也可根据文末的代码自主验证。

绘制可行域代码见第4部分

(1)计算非线性函数的一阶导

由于需要利用到一阶导对非线性函数进行线性近似,因此需要计算非线性函数 f , g f,g f,g 对于非线性变量的一阶导(雅可比矩阵),在上述例子中, x 1 , x 2 x_1,x_2 x1,x2 都是非线性变量,因此求得的一阶导如下:

∇ f ( x 1 , x 2 ) = [ x 2 + 1 , x 1 + 1 ] ∇ g ( x 1 , x 2 ) = [ − 0.5 x 1 + 1 , − 1 ] \begin{gathered}\nabla f\left(x_1, x_2\right)=\left[x_2+1, x_1+1\right] \\ \nabla g\left(x_1, x_2\right)=\left[-0.5 x_1+1,-1\right]\end{gathered} f(x1,x2)=[x2+1,x1+1]g(x1,x2)=[0.5x1+1,1]

线性函数 h h h 不需要展开。

(2)设定初始基点和步长边界

设定初始的步长边界 s = 15 s=15 s=15,初始点 ( x 1 = 1 , x 2 = 5 ) (x_1=1,x_2=5) (x1=1,x2=5),将初始点代入上述式子,得到非线性函数在初始点处的梯度如下:

∇ f ( x 1 , x 2 ) = [ 6 , 2 ] ∇ g ( x 1 , x 2 ) = [ 0.5 , − 1 ] \begin{gathered}\nabla f\left(x_1, x_2\right)=\left[6, 2\right] \\ \nabla g\left(x_1, x_2\right)=\left[0.5,-1\right]\end{gathered} f(x1,x2)=[6,2]g(x1,x2)=[0.5,1]

(3)迭代求解序列线性规划

将上面的初始设定,代入非线性规划问题当中转化为SLP问题,根据前面的步长边界关系式可知:

max ⁡ ( l x − x a , − s ) ≤ d ≤ min ⁡ ( u x − x a , s ) → max ⁡ ( l x , − s + x a ) ≤ x ≤ min ⁡ ( u x , s + x a ) \max(l^x-x^a,-s)\leq d\leq \min(u^x-x^a, s)\\\\\rightarrow \max(l^x,-s+x^a)\leq x\leq \min(u^x, s+x^a) max(lxxa,s)dmin(uxxa,s)max(lx,s+xa)xmin(ux,s+xa)

得到的SLP问题如下:

min ⁡ f ( 1 , 5 ) + ∇ f ⊤ [ x 1 − 1 , x 2 − 5 ] g ( 1 , 5 ) + ∇ g ⊤ [ x 1 − 1 , x 2 − 5 ] ≤ 0 h ( x 1 , x 2 ) = 0.4 × x 1 + 0.6 × x 2 − 5 ≤ 0 0 ≤ x 1 ≤ 15 + 1 1 ≤ x 2 ≤ 15 + 5 ⇓ min ⁡ 12 + 6 ( x 1 − 1 ) + 2 ( x 2 − 5 ) − 1.25 + 0.5 ( x 1 − 1 ) − ( x 2 − 5 ) ≤ 0 0.4 x 1 + 0.6 x 2 − 5 ≤ 0 0 ≤ x 1 ≤ 16 1 ≤ x 2 ≤ 20 \begin{array}{cl}\min & f(1,5)+\nabla f^{\top}[x_1-1,x_2-5] \\ & g(1,5) +\nabla g^{\top} [x_1-1,x_2-5]\leq 0 \\ & h(x_1,x_2)=0.4 \times x_1+0.6 \times x_2-5\leq 0 \\ & 0\leq x_1\leq 15+1\\ & 1\leq x_2 \leq 15+5 \end{array}\\\\ \Downarrow\\\\ \begin{array}{cl}\min & 12+6(x_1-1)+2(x_2-5) \\ & -1.25 + 0.5(x_1-1)-(x_2-5) \leq 0 \\ & 0.4 x_1+0.6 x_2-5\leq 0 \\ & 0\leq x_1\leq 16\\ & 1\leq x_2 \leq 20 \end{array} minf(1,5)+f[x11,x25]g(1,5)+g[x11,x25]0h(x1,x2)=0.4×x1+0.6×x2500x115+11x215+5min12+6(x11)+2(x25)1.25+0.5(x11)(x25)00.4x1+0.6x2500x1161x220

求解上述线性规划问题(这里用SCIP求解,代码见第4节),得到最优结果: f ∗ = 2.5 , x 1 ∗ = 0 , x 2 ∗ = 3.25 f^*=2.5,x_1^*=0,x_2^*=3.25 f=2.5,x1=0,x2=3.25。上面提到的步长边界更新策略,计算得到:

h N L P ( x a + 1 , y a + 1 ) − h N L P ( x a , y a ) h S L P ( x a + 1 , y a + 1 ) − h S L P ( x a , y a ) = 0.82 \frac{h_{NLP}(x^{a+1},y^{a+1})-h_{NLP}(x^a,y^a)}{h_{SLP}(x^{a+1},y^{a+1})-h_{SLP}(x^a,y^a)}=0.82 hSLP(xa+1,ya+1)hSLP(xa,ya)hNLP(xa+1,ya+1)hNLP(xa,ya)=0.82

上式中 h N L P ( x a + 1 , y a + 1 ) − h N L P ( x a , y a ) = − 7.75 h_{NLP}(x^{a+1},y^{a+1})-h_{NLP}(x^a,y^a)=-7.75 hNLP(xa+1,ya+1)hNLP(xa,ya)=7.75 h S L P ( x a + 1 , y a + 1 ) − h S L P ( x a , y a ) = − 9.5 h_{SLP}(x^{a+1},y^{a+1})-h_{SLP}(x^a,y^a)=-9.5 hSLP(xa+1,ya+1)hSLP(xa,ya)=9.5,以及步长边界 s = 15 s=15 s=15 都不接近于 0 0 0,且新解不满足原非线性规划问题的KKT条件,因此对步长边界进行更新,由于 0.82 0.82 0.82 接近 1 1 1,认为线性近似后的优化趋势一致,于是进一步扩大步长边界,这里将步长边界更新为 s = 30 s=30 s=30

第二次迭代,此时初始点为 ( x 1 = 0 , x 2 = 3.25 ) , s = 30 (x_1=0,x_2=3.25), s=30 (x1=0,x2=3.25),s=30,计算非线性函数在该初始点的梯度:

∇ f ( x 1 , x 2 ) = [ 4.25 , 1 ] ∇ g ( x 1 , x 2 ) = [ 1 , − 1 ] \begin{gathered}\nabla f\left(x_1, x_2\right)=\left[4.25, 1\right] \\ \nabla g\left(x_1, x_2\right)=\left[1,-1\right]\end{gathered} f(x1,x2)=[4.25,1]g(x1,x2)=[1,1]

得到新的序列线性规划问题:

min ⁡ 4.25 + 4.25 ( x 1 − 0 ) + ( x 2 − 3.25 ) − 0.25 + ( x 1 − 0 ) − ( x 2 − 3.25 ) ≤ 0 0.4 x 1 + 0.6 x 2 − 5 ≤ 0 0 ≤ x 1 ≤ 30 1 ≤ x 2 ≤ 33.25 \begin{array}{cl}\min & 4.25+4.25(x_1-0)+(x_2-3.25) \\ & -0.25 +(x_1-0)-(x_2-3.25) \leq 0 \\ & 0.4 x_1+0.6 x_2-5\leq 0 \\ & 0\leq x_1\leq 30\\ & 1\leq x_2 \leq 33.25 \end{array} min4.25+4.25(x10)+(x23.25)0.25+(x10)(x23.25)00.4x1+0.6x2500x1301x233.25

求解得最优结果: f ∗ = 4 , x 1 ∗ = 0 , x 2 ∗ = 3 f^*=4,x_1^*=0,x_2^*=3 f=4,x1=0,x2=3。判断是否更新步长边界,计算:

h N L P ( x a + 1 , y a + 1 ) − h N L P ( x a , y a ) h S L P ( x a + 1 , y a + 1 ) − h S L P ( x a , y a ) = 0.5 \frac{h_{NLP}(x^{a+1},y^{a+1})-h_{NLP}(x^a,y^a)}{h_{SLP}(x^{a+1},y^{a+1})-h_{SLP}(x^a,y^a)}=0.5 hSLP(xa+1,ya+1)hSLP(xa,ya)hNLP(xa+1,ya+1)hNLP(xa,ya)=0.5

因此拒绝该新解,并将步长边界降低。由于拒绝了该新解,因此新一轮迭代的起始点为 ( 0 , 3.25 ) (0,3.25) (0,3.25),与第二次迭代一致,因此本轮迭代的 SLP 问题与上述模型一致,只需缩小 x 1 , x 2 x_1,x_2 x1,x2 的定义域。

显然的,由于 0 ≤ 0 + s , 3 ≤ 3.25 + s 0\leq 0+s,3\leq 3.25+s 00+s,33.25+s,不论如何缩小步长边界 s ≥ 0 s\geq 0 s0 的值,上述式子恒成立,即近似线性规划的最优解总是 ( 0 , 3 ) (0,3) (0,3)。此时满足算法终止条件,得到最终的非线性规划的近似结果为 ( x 1 = 0 , x 2 = 3 ) (x_1=0,x_2=3) (x1=0,x2=3)

4. 涉及代码

4.1 绘制可行域

由于对可行域进行填充的逻辑是,将函数值范围落在 [ − 1 e 10 , 0 ] [-1e10, 0] [1e10,0] 的部分进行填充,即填充函数值小于等于 0 0 0 的部分,因此所有约束应转化为 ≤ 0 \leq 0 0 的函数形式。

import numpy as np
import matplotlib.pyplot as plt

# 定义目标函数
def objective_function(x1, x2):
    return (x1 + 1) * (x2 + 1)

# 定义约束函数
def constraint1(x1, x2):
    return -(0.25*x1**2 - x1 + x2 -3)
def constraint2(x1, x2):
    return 0.4*x1+0.6*x2-5
def constraint3(x1, x2):
    return 1 - x2 

# 创建网格
x1 = np.linspace(0, 10, 400)
x2 = np.linspace(0, 10, 400)
X1, X2 = np.meshgrid(x1, x2)
Z = objective_function(X1, X2)

# 绘制目标函数的等高线
plt.figure(figsize=(8, 6))
contour = plt.contour(X1, X2, Z, levels=40, cmap='viridis')
plt.colorbar(contour)

# # 绘制约束条件的边界
constraint1_boundary = constraint1(X1, X2)
constraint2_boundary = constraint2(X1, X2)
constraint3_boundary = constraint3(X1, X2)
plt.contour(X1, X2, constraint1_boundary, levels=[0], colors='r', linestyles='dashed')
plt.contour(X1, X2, constraint2_boundary, levels=[0], colors='b', linestyles='dashed')
plt.contour(X1, X2, constraint3_boundary, levels=[0], colors='g', linestyles='dashed')

# # 填充可行区域
# 填充可行区域
feasible_region = np.maximum(np.maximum(constraint1_boundary, constraint2_boundary), constraint3_boundary)
plt.contourf(X1, X2, feasible_region, levels=[-1e10, 0], colors=['grey'], alpha=0.3)

# 设置图例和标签
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.title('Objective Function and Constraints')
plt.show()

4.2 求解序列线性规划

以第一阶段的迭代序列线性规划为例的求解代码。

from pyscipopt import Model


model = Model("Example")

x1 = model.addVar(lb=0, ub=16, vtype='C', name='x1')
x2 = model.addVar(lb=1, ub=20, vtype='C', name='x2')

model.addCons(-1.25+0.5*(x1-1)-(x2-5) <= 0)
model.addCons(0.4*x1+0.6*x2 -5 <= 0)

model.setObjective(12+6*(x1-1)+2*(x2-5), sense="minimize")
model.optimize()
status = model.getStatus()

if status == 'optimal':
    print("Optimal value:", model.getObjVal())
    for v in model.getVars():
        print(v, model.getVal(v))
    else:
        print("* No variable is printed if model status is not optimal")

4.3 计算步长边界更新公式

在指定位置修改公式,以及修改新解,运行后即可得到求解结果。

def func_nlp(x):
    return (x[0] + 1)*(x[1] + 1)

def func_slp(x):
    return 12+6*(x[0]-1)+2*(x[1]-5)

old_sol = (1, 5)
new_sol = (0, 3.25)

print((func_nlp(new_sol)-func_nlp(old_sol))/(func_slp(new_sol)-func_slp(old_sol)))

参考资料


  1. Cornell University Computational Optimization Open Textbook:SLP ↩︎ ↩︎

  2. WIKIPEDIA: Successive linear programming ↩︎

  3. Palacios-Gomez, F.; Lasdon, L.; Enquist, M. (October 1982). “Nonlinear Optimization by Successive Linear Programming”. Management Science. 28 (10): 1106–1120. doi:10.1287/mnsc.28.10.1106. ↩︎ ↩︎

  4. 非线性规划求解方法:序列线性规划(Sequential linear programming) ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1718719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全风险 - 检测设备是否为模拟器

在很多安全机构的检测中&#xff0c;关于模拟器的运行环境一般也会做监听处理&#xff0c;有的可能允许执行但是会提示用户&#xff0c;有的可能直接禁止在模拟器上运行我方APP 如何判断当前 app 是运行在Android真机&#xff0c;还是运行在模拟器? 可能做 Framework 的朋友思…

能解决各行各业的数据传输管控方案长什么样,可以进来看看

在数字化时代&#xff0c;数据成为企业最宝贵的资产之一。然而&#xff0c;随之而来的是数据管控的挑战。企业在数据管控过程中可能会遇到哪些问题&#xff1f;一个能够解决各行各业需求的数据传输管控系统应该如何构建&#xff1f;优秀的数据传输管控优势和特点又在哪里&#…

【期末速成】——计算机组成原理(1)

目录 一、什么是计算机的组成 二、冯诺依曼体系结构计算机的特点 三、计算机系统的层次结构 四、机器语言、汇编语言、高级语言, 五、 编译程序、解释程序、汇编程序 六、已知主频、CPI计算程序运行时间 一、什么是计算机的组成 计算机的组成可以分为五个部件和两个信息…

flask-slqalchemy使用详解

目录 1、flask-sqlalchemy 1.1、flask_sqlalchemy 与sqlalchemy 的关系 1.1.1、 基本定义与用途 1.2、flask_sqlalchemy 的使用 1.2.1、安装相关的库 1.2.2、项目准备 1.2.3、创建ORM模型 1.2.3.1、使用db.create_all()创建表的示例 1.2.3.2、创建多表关联ORM模型 1.…

一维时间序列信号的改进小波降噪方法(MATLAB R2021B)

目前国内外对于小波分析在降噪方面的方法研究中&#xff0c;主要有小波分解与重构法降噪、小波阈值降噪、小波变换模极大值法降噪等三类方法。 (1)小波分解与重构法降噪 早在1988 年&#xff0c;Mallat提出了多分辨率分析的概念&#xff0c;利用小波分析的多分辨率特性进行分…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候&#xff0c;我们需要自动打包&#xff0c;比如下班了&#xff0c;我要出一个包明天早上用。比如每天夜里12点&#xff0c;我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前&#xff0c;需要安装Java 。Java下载网站 ①下载…

Unity 实现让物体渲染在最前面

演示 实现方案 1.创建一个shader脚本 2.删掉原来的内容&#xff1a;我们自己写 附上完整的shader代码&#xff1a; Shader "Custom/ZTestAlways" {Properties {_Color ("Color Tint",Color) (1,1,1,1)_MainTex("Main Tex",2D) "white&q…

【EI会议|检索稳定】2024年通讯工程与云计算国际会议(CECC 2024)

2024年通讯工程与云计算国际会议&#xff08;CECC 2024&#xff09; 2024 International Conference on Communication Engineering and Cloud Computing 【重要信息】 大会地点&#xff1a;武汉 大会官网&#xff1a;http://www.iaccecc.com 投稿邮箱&#xff1a;iacceccsub-…

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年&#xff0c;LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词&#xff0c;诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”&#xff0c;指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下&#xff0c;以太坊联…

skywalking介绍及搭建

链路追踪框架比对&#xff1a; skywalking安装部署&#xff1a; 下载地址&#xff1a;Downloads | Apache SkyWalking 配置微服务与skywalking整合&#xff1a; copy agent/optional-plugins/apm-spring-cloud-getway-xx.jar到plugins&#xff0c;然后重启skywalking 监控界面…

MOE模型入门

一、目录 定义&#xff1a;MOE架构代表类型如何解决expert 平衡的&#xff1f;而不是集中到某一专家。如何训练、微调MOE模型&#xff1f;基础架构优缺点不同MOE 模型实现方式、训练方法 二、实现 定义&#xff1a;MOE架构 MOE:混合专家模型&#xff0c;多个专家共同决策的模…

2024年Kubernetes管理的发展趋势及预测

Kubernetes管理的概念 Kubernetes管理是指用于监督使用Kubernetes的跨机器集群的容器化应用程序的部署、扩展和操作的过程和工具。这个编排平台自动化了部署、管理和扩展容器化应用程序的许多方面&#xff0c;但它也引入了配置、网络、安全性和资源管理方面的复杂性。 有效的K…

Linux - 文件管理高级1

0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时&#xff0c;默认进行递归查找&#xff0c;会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …

使用LLaMA-Factory微调大模型

使用LLaMA-Factory微调大模型 github 地址 https://github.com/hiyouga/LLaMA-Factory 搭建环境 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory在 LLaMA-Factory 路径下 创建虚拟环境 conda create -p ./venv python3.10激活环境 c…

迅狐跨境电商系统源码:技术栈与多端集成

随着全球化贸易的不断深入&#xff0c;跨境电商系统源码成为了连接不同国家和地区消费者与商家的重要桥梁。本文将探讨跨境电商系统源码的技术栈以及如何通过多端集成来提升用户体验。 技术栈概览 跨境电商系统源码的技术栈是构建高效、稳定平台的基础。以下是构建跨境电商系…

Dynamics 365:安全的客户参与应用程序

客户参与应用程序使用Microsoft Dataverse提供了一个丰富的安全模型&#xff0c;可以适应许多业务场景。本节为您提供了应考虑的安全措施的特定于产品的指导。 Dataverse安全模型有以下目标&#xff1a; 只允许用户访问他们工作所需的信息。按角色对用户进行分组&#xff0c;并…

Leetcode刷题笔记6

34. 在排序数组中查找元素的第一个和最后一个位置 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力查找 [1, 2, 3, 3, 3, 4, 5] t 3 从前往后扫描暴力查找&#xff0c;最坏情况下O(N) 优化 利用数组有序的…

安泰电压放大器的设计要求有哪些内容

电压放大器是电子电路中常见的一种放大器类型&#xff0c;用于将输入电压信号放大到更高的幅度。设计一个高性能的电压放大器需要考虑多个方面的要求和指标。以下是设计电压放大器时需要考虑的几个重要内容&#xff1a; 1.放大增益 放大增益是电压放大器的核心指标&#xff0c;…

再度“痛失”TOP5的小米手机,能否接好这碗AI“大活水”?

国产手机终端需求持续修复&#xff0c;国产品牌商是最大受益者。 近日&#xff0c;中国信通院发布2024年4月国内手机市场运行分析报告。报告显示&#xff0c;今年4月&#xff0c;国内市场手机出货量同比增长了28.8%。按品牌来看&#xff0c;国产品牌手机4月出货量占同期手机出…

ubuntu 18.04 ros1学习

总结了一下&#xff0c;学习内容主要有&#xff1a; 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…