当前位置:   article > 正文

matlab和python线性规划和二次规划_python 解二次规划问题

python 解二次规划问题

线性规划问题

线性规划问题的一般形式是:

min ⁡ α 1 x 1 + α 2 x 2 + ⋯ + α n x n    ( 1 ) \min \boldsymbol{\alpha }_1\boldsymbol{x}_1+\boldsymbol{\alpha }_2\boldsymbol{x}_2+\cdots +\boldsymbol{\alpha }_{\boldsymbol{n}}\boldsymbol{x}_{\boldsymbol{n}}\,\, \left( 1 \right) minα1x1+α2x2++αnxn(1)

受平等约束:

不平等约束:

框约束:

x 1 ∈ ( X 1 min ⁡ , X 1 max ⁡ ) , ⋯   , x n ∈ ( X n min ⁡ , X n max ⁡ )    ( 4 ) \boldsymbol{x}_1\in \left( \boldsymbol{X}_{1}^{\min},\boldsymbol{X}_{1}^{\max} \right) ,\cdots ,\boldsymbol{x}_{\boldsymbol{n}}\in \left( \boldsymbol{X}_{\boldsymbol{n}}^{\min},\boldsymbol{X}_{\boldsymbol{n}}^{\max} \right) \,\, \left( 4 \right) x1(X1min,X1max),,xn(Xnmin,Xnmax)(4)

值得注意的是形式的不等式约束:

∑ j = 1 n β j x j ⩾ γ j \sum_{\boldsymbol{j}=1}^{\boldsymbol{n}}{\boldsymbol{\beta }_{\boldsymbol{j}}\boldsymbol{x}_{\boldsymbol{j}}\geqslant \boldsymbol{\gamma }_{\boldsymbol{j}}} j=1nβjxjγj

等价于不平等约束:

− ∑ j = 1 n β j x j ⩽ − γ j -\sum_{\boldsymbol{j}=1}^{\boldsymbol{n}}{\boldsymbol{\beta }_{\boldsymbol{j}}\boldsymbol{x}_{\boldsymbol{j}}\leqslant -\boldsymbol{\gamma }_{\boldsymbol{j}}} j=1nβjxjγj

因此,总是以以下形式写任何不等式约束是很方便的

L H S ⩽ R H S \boldsymbol{LHS}\leqslant \boldsymbol{RHS} LHSRHS

等式(1)-(4)描述的线性规划问题可以用矩阵形式表示为:

min ⁡ α T x \min \boldsymbol{\alpha }^{\boldsymbol{T}}\boldsymbol{x} minαTx

受限约束:

A x = b C x ⩽ d x ∈ X \boldsymbol{Ax}=\boldsymbol{b}\\\boldsymbol{Cx}\leqslant \boldsymbol{d}\\\boldsymbol{x}\in \boldsymbol{X} Ax=bCxdxX

其中,

A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a m 1 a m s ⋯ a m n ] , x = [ x 1 x 2 ⋮ x n ] , b = [ b 1 b 2 ⋮ b m ] , C = [ c 11 c 12 ⋯ c 1 n c 21 c 22 ⋯ c 2 n ⋮ ⋮ ⋱ ⋮ c l 1 c l s ⋯ c ln ⁡ ] , d = [ d 1 d 2 ⋮ d l ] , X = [ ( X 1 min ⁡ , X 1 max ⁡ ) ( X 2 min ⁡ , X 2 max ⁡ ) ⋮ ( X n min ⁡ , X n max ⁡ ) ] \boldsymbol{A}=\left[

a11a12a1na21a22a2nam1amsamn
\right] ,\boldsymbol{x}=\left[
x1x2xn
\right] ,\boldsymbol{b}=\left[
b1b2bm
\right] ,\\\boldsymbol{C}=\left[
c11c12c1nc21c22c2ncl1clscln
\right] ,\boldsymbol{d}=\left[
d1d2dl
\right] ,\boldsymbol{X}=\left[
(X1min,X1max)(X2min,X2max)(Xnmin,Xnmax)
\right] A=a11a21am1a12a22amsa1na2namn,x=x1x2xn,b=b1b2bm,C=c11c21cl1c12c22clsc1nc2ncln,d=d1d2dl,X=(X1min,X1max)(X2min,X2max)(Xnmin,Xnmax)

最大化某个目标函数 f ( x ) \boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的问题等同于最小化 − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的问题,因为 f ( x ) \boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的最大化问题和 − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的最小化问题具有相同的最优解 x o p t \boldsymbol{x}^{\boldsymbol{opt}} xopt 。 在下图1中,绘制了函数 f ( x ) = e − ( x − 0.5 ) sin ⁡ ( π x 2 ) \boldsymbol{f}\left( \boldsymbol{x} \right) =\boldsymbol{e}^{-\left( \boldsymbol{x}-0.5 \right)}\sin \left( \frac{\boldsymbol{\pi x}}{2} \right) f(x)=e(x0.5)sin(2πx) − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的曲线图。 从这两个函数的图形可以明显看出, f ( x ) \boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 的最大值是在使 − f ( x ) -\boldsymbol{f}\left( \boldsymbol{x} \right) f(x) 最小的同一点获得的。

问题是,

max ⁡ α T x \max \boldsymbol{\alpha }^{\boldsymbol{T}}\boldsymbol{x} maxαTx

受约束,

A x = b C x ⩽ d x ∈ X \boldsymbol{Ax}=\boldsymbol{b}\\\boldsymbol{Cx}\leqslant \boldsymbol{d}\\\boldsymbol{x}\in \boldsymbol{X} Ax=bCxdxX

等同于问题:

min ⁡ β T x \min \boldsymbol{\beta }^{\boldsymbol{T}}\boldsymbol{x} minβTx

受约束,

A x = b C x ⩽ d x ∈ X \boldsymbol{Ax}=\boldsymbol{b}\\\boldsymbol{Cx}\leqslant \boldsymbol{d}\\\boldsymbol{x}\in \boldsymbol{X} Ax=bCxdxX

( β = − α ) \left( \boldsymbol{\beta }=-\boldsymbol{\alpha } \right) (β=α) 而没有进一步改变相等性或不平等性约束。

用linprog解决线性规划问题

考虑下面问题,

min ⁡ x ∈ R n α T x \underset{\boldsymbol{x}\in \mathbb{R}^{\boldsymbol{n}}}{\min}\boldsymbol{\alpha }^{\boldsymbol{T}}\boldsymbol{x} xRnminαTx

受约束,

A x = b , C x ⩽ d , l b ⩽ x ⩽ u b \boldsymbol{Ax}=\boldsymbol{b},\\\boldsymbol{Cx}\leqslant \boldsymbol{d},\\\boldsymbol{lb}\leqslant \boldsymbol{x}\leqslant \boldsymbol{ub} Ax=b,Cxd,lbxub

MATLAB函数linprog可用于解决线性编程问题。 它的形式为:

[xopt, fval] = linprog(objfun, C, d, A, b, lb, ub)
  • 1

其中x0是初始起点。 如果问题不包含上下限,则形式为:

[xopt, fval] = linprog(objfun, C, d, A, b)
  • 1

如果问题不包含相等约束,则将A和b替换为空方括号[]。 形式将是:

[xopt, fval] = linprog(objfun, C, d, [], [], lb, ub)
  • 1

为了说明如何使用函数linprog,请考虑以下示例:

示例1在本例中,MATLAB的linprog函数将用于解决线性编程问题:

max ⁡ 3 x 1 + x 2 + 2 x 3 \max 3\boldsymbol{x}_1+\boldsymbol{x}_2+2\boldsymbol{x}_3 max3x1+x2+2x3

受限于,

3 x 1 + x 2 ⩽ 40 x 1 + 2 x 3 ⩽ 60 x 2 + 2 x 3 ⩽ 60 x 1 ⩾ 0 , x 2 ⩾ 0 , x 3 ⩾ 0 3\boldsymbol{x}_1+\boldsymbol{x}_2\leqslant 40\\\boldsymbol{x}_1+2\boldsymbol{x}_3\leqslant 60\\\boldsymbol{x}_2+2\boldsymbol{x}_3\leqslant 60\\\boldsymbol{x}_1\geqslant 0,\boldsymbol{x}_2\geqslant 0,\boldsymbol{x}_3\geqslant 0 3x1+x240x1+2x360x2+2x360x10,x20,x30

以下MATLAB指令用于查找最佳解决方案:

>> objfun = [-3; -1; -2] ;
>> C = [3, 1, 0; 1, 0, 2; 0, 1, 2] ;
>> d = [40; 60; 60] ;
>> lb = [0; 0; 0] ;
>> [xopt, fval] = linprog(objfun, C, d, [], [], lb, [])
Optimal solution found.
xopt =
10
10
25
fval =
-90
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

默认情况下,MATLAB linprog函数使用双单工算法。 可以通过优化选项结构来更改算法的选择。 例如,切换到内点求解器并求解示例1,可以使用以下指令。

>> Options = optimoptions(’linprog’, ’Algorith’, ’interior-point’);
>> [xopt, fval] = linprog(objfun, C, d, [], [], lb, [], Options)
Minimum found that satisfies the constraints.
Optimization completed because the objective function is nondecreasing in feasible directions, to within the selected value
of the function tolerance, and constraints are satisfied to
within the selected value of the constraint tolerance.
xopt =
10.0000
10.0000
25.0000
fval =
-90.0000
>> Options = optimoptions(’linprog’, ’Algorith’,
’interior-point-legacy’, ’Disp’, ’Iter’) ;
>> [xopt, fval] = linprog(objfun, C, d, [], [], lb, [], Options)
Optimization terminated.
xopt =
10.0000
10.0000
25.0000
fval =
-90.0000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Python在scipy.optimize库中还有一个函数linprog。 要使用linprog函数,必须从scipy的优化库中导入。 可以按照以下步骤进行:

In [1]: from scipy.optimize import linprog
  • 1

Python函数linprog形式接近MATLAB的linporg形式。 其语法为:

OptSol = linprog(objfun, A_ub = C, b_ub = d, A_eq = A, b_eq = b,
bounds = bnds,\ method=’optmethod’, options = optoptions)
  • 1
  • 2

要使用Python解决示示例1,可以使用以下Python指令:

linprog函数的默认求解器是内部点方法。 但是该方法还有其他两个选项,即单纯形法和修订的单纯形法。 它们的用法如下:

使用fmincon MATLAB函数解决线性规划问题

用pulp Python解决线性规划问题

用pyomo解决线性规划问题

用gekko解决线性规划问题

解决二次规划问题

详情参阅 - 亚图跨际

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/593208
推荐阅读
相关标签
  

闽ICP备14008679号