matlab和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[ \begin{matrix} \boldsymbol{a}_{11}& \boldsymbol{a}_{12}& \cdots& \boldsymbol{a}_{1\boldsymbol{n}}\\ \boldsymbol{a}_{21}& \boldsymbol{a}_{22}& \cdots& \boldsymbol{a}_{2\boldsymbol{n}}\\ \vdots& \vdots& \vdots& \vdots\\ \boldsymbol{a}_{\boldsymbol{m}1}& \boldsymbol{a}_{\boldsymbol{ms}}& \cdots& \boldsymbol{a}_{\boldsymbol{mn}}\\\end{matrix} \right] ,\boldsymbol{x}=\left[ \begin{array}{c} \boldsymbol{x}_1\\ \boldsymbol{x}_2\\ \vdots\\ \boldsymbol{x}_{\boldsymbol{n}}\\\end{array} \right] ,\boldsymbol{b}=\left[ \begin{array}{c} \boldsymbol{b}_1\\ \boldsymbol{b}_2\\ \vdots\\ \boldsymbol{b}_{\boldsymbol{m}}\\\end{array} \right] ,\\\boldsymbol{C}=\left[ \begin{matrix} \boldsymbol{c}_{11}& \boldsymbol{c}_{12}& \cdots& \boldsymbol{c}_{1\boldsymbol{n}}\\ \boldsymbol{c}_{21}& \boldsymbol{c}_{22}& \cdots& \boldsymbol{c}_{2\boldsymbol{n}}\\ \vdots& \vdots& \ddots& \vdots\\ \boldsymbol{c}_{\boldsymbol{l}1}& \boldsymbol{c}_{\boldsymbol{ls}}& \cdots& \boldsymbol{c}_{\ln}\\\end{matrix} \right] ,\boldsymbol{d}=\left[ \begin{array}{c} \boldsymbol{d}_1\\ \boldsymbol{d}_2\\ \vdots\\ \boldsymbol{d}_{\boldsymbol{l}}\\\end{array} \right] ,\boldsymbol{X}=\left[ \begin{array}{c} \left( \boldsymbol{X}_{1}^{\min},\boldsymbol{X}_{1}^{\max} \right)\\ \left( \boldsymbol{X}_{2}^{\min},\boldsymbol{X}_{2}^{\max} \right)\\ \vdots\\ \left( \boldsymbol{X}_{\boldsymbol{n}}^{\min},\boldsymbol{X}_{\boldsymbol{n}}^{\max} \right)\\\end{array} \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)

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

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

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

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

为了说明如何使用函数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

默认情况下,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

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

In [1]: from scipy.optimize import linprog

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)

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

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

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

用pulp Python解决线性规划问题

用pyomo解决线性规划问题

用gekko解决线性规划问题

解决二次规划问题

详情参阅 - 亚图跨际

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值