MATLAB数学建模:数学规划模型

数学规划模型

数学规划是运筹学的一个重要分支,也是现代数学的一门重要学科。在实际问题的需要和计算机的飞速发展背景之下,数学规划迅速发展并成为了一门活跃的新兴学科。
在本章中,我们将介绍数学规划模型的概念和线性规划、非线性规划的概念、性质和应用。

1. 数学规划模型

在许多实际问题中,我们常常需要确定一些可控制变量的值, 从而使得相关的量达到最佳. (使目标达到最大或最小). 这类问题统称为 优化问题 ,通常来说都需要建立规划模型进行求解.

数学规划模型是决定如何分配有限资源,从而达到人们期望的目标的 优化分配数学模型,在运筹学中处于中心地位.其一般表达式为:
m i n f ( x , α , β ) minf(x,\alpha,\beta)
s . t . g ( x , α , β ) 0 s. t. g(x,\alpha,\beta)\leqslant 0
式中, f f 为目标函数, g g 为约束函数。 x x 为可控变量, α \alpha 为已知参数, β \beta 为随机参数。 m i n min 表示“求最小值”, s . t s.t 表示“受约束于”(subject to)。


2. 线性规划

线性规划是运筹学中研究较早、发展较快,应用广泛且方法成熟的一个分支,可以良好地辅助人们进行科学管理.

2.1 线性规划的标准形式

线性规划的标准形式为:
{ m i n z = c 1 x 1 + c 2 x 2 + + c n x n a 11 x 1 + a 12 x 2 + + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + + a 2 n x n = b 2                                           a m 1 x 1 + a m 2 x 2 + + a m n x n = b m x 1 , x 2 , , x n 0 \begin{cases} minz = c_{1}x_{1} +c_{2}x_{2} +\cdots + c_{n}x_{n} \\a_{11}x_{1} + a_{12}x_{2} + \cdots + a_{1n}x_{n} = b_{1}\\a_{21}x_{1} + a_{22}x_{2} + \cdots + a_{2n}x_{n} = b_{2}\\ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\\a_{m1}x_{1} + a_{m2}x_{2} + \cdots + a_{mn}x_{n} = b_{m}\\ x_{1},x_{2},\cdots,x_{n} \geqslant 0\end{cases}
我们记
{ m i n z = j = 1 n c j x j σ j = 1 n a i j x j = b i i = 1 , 2 , , m x j 0 j = 1 , 2 , , n \begin{cases} minz = \sum_{j = 1}^{n}c_{j}x_{j} \\ \sigma_{j = 1}^{n}a_{ij}x_{j} = b_{i} & i = 1,2,\cdots,m \\ x_{j}\geqslant0 & j = 1,2,\cdots,n \end{cases}
记为矩阵形式为:
{ m i n Z = C x A x = b x 0 j = 1 , 2 , , n \begin{cases} minZ = Cx \\ Ax = b \\ x \geqslant0 & j = 1,2,\cdots,n \end{cases}

线性规划的标准形式要求:目标函数最小化,约束条件取等式,变量 b b 非负。不符合这三个条件的线性模型也可以转化为标准形式。

从实际问题中抽象和建立数学模型一般来说有以下三个步骤:

  1. 根据影响目标达成情况的因素寻找决策变量。
  2. 由决策变量和目标之间的函数关系建立目标函数。
  3. 由决策变量所受的限制确定决策变量的约束条件。

这样,我们所建立的数学模型都具备以下特点:

  1. 每个模型中都含有若干个决策变量 ( x 1 , x 2 , , x n ) (x_{1},x_{2},\cdots,x_{n}) ,其中 n n 为决策变量个数。决策变量的一组值就代表某一个优化方案,决策变量一般是非负的。
  2. 目标函数和约束条件都是决策变量的线性函数。
    当我们得到的数学模型的目标函数为线性函数、约束条件为线性不等式或线性等式时,我们称这样的数学模型为 线性规划模型

2.2 线性规划的求解方法

求解线性规划问题的基本方法是 单纯形法 ,经过改进和发展又有改进单纯形法、对偶单纯形法、原始对偶方法、分解算法和各种多项式时间算法。对于只有两个变量的,简单的线性规划问题,也可采用图解法求解。

线性规划包含 单纯形线性规划多目标线性规划

2.2.1 单纯形线性规划

单纯形法是从所有基本可行解的一个较小部分中,通过迭代过程选出最优解的方法.其迭代过程的一般描述为:

  1. 将线性规划化为典范形式,从而可得一个初始基本可行解 x ( 0 ) x(0) (初始顶点).将它作为迭代过程的出发点,其目标值为 z ( x ( 0 ) ) z(x(0)) .
  2. 寻找一个基本可行解 x ( 1 ) x(1) , 使 z ( x ( 1 ) ) z ( x ( 0 ) ) z(x(1)) \leqslant z(x(0)) . 方法是通过消去法将产生 x ( 0 ) x(0) 的典范形式化为产生 x ( 1 ) x(1) 的典范形式.
  3. 继续寻找相对较好的基本可行解 x ( 2 ) , x ( 3 ) , x(2),x(3),\cdots ,使目标函数值不断改进:
    z ( x ( n ) ) z ( x ( n 1 ) ) z ( x ( 2 ) ) z ( x ( 1 ) ) z ( x ( 0 ) ) . z(x(n)) \leqslant z(x(n-1)) \leqslant \cdots \leqslant z(x(2)) \leqslant z(x(1)) \leqslant z(x(0)).
    当某个基本可行解再也不能被其他基本可行解所改进的时候,它就是我们所求的最优解.

在 MATLAB 中,我们使用单纯形法的变种:投影法 求解线性规划问题.函数为 linprog.

1. x = linprog(f,A,b)
2. x = linprog(f,A,b,Aeq,beq)
3. x = linprog(f,A,b,Aeq,beq,lb,ub)
4. x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
5. x = linprog(f,A,b,Aeq,beq,lb,ub,options)
6. [x,fval] = linprog(......)
7. [x,fval,exitflag] = linprog(......)
8. [x,fval,exitflag,output] = linprog(......)
9. [x,fval,exitflag,output,lambda] = linprog(......)
  1. 求解问题 m i n ( f x ) min(f'*x) , 约束条件为 A x b A*x \leqslant b .
  2. 在求解(1)中问题的基础上增加等式约束: A e q x = b e q Aeq*x = beq .
  3. 定义变量 x x 的下界和上界 l b , u b lb,ub , 使得 x x 始终在该范围内.
  4. 设置初值为 x 0. x0. (大型算法将忽略初值,默认只适用于中型算法)
  5. o p t i o n s options 指定的优化参数进行最小化.
  6. 返回解 x x 处的目标函数值 f v a l fval .
  7. 返回 e x i t f l a g exitflag 值,描述函数计算的退出条件.
  8. 返回包含优化信息的输出变量 o u t p u t output .
  9. 将解 x x 处的 L a g r a n g e Lagrange 乘子返回到 l a m b d a lambda 参数中.

[例]

求函数 f ( x ) = 5 x 1 4 x 2 6 x 3 f(x) = -5x_{1} - 4x_{2} - 6x_{3} , 其中 x x 满足条件:
{ x 1 x 2 + x 3 20 3 x 1 + 2 x 2 + 4 x 3 42 3 x 1 + 2 x 2 30 x 1 , x 2 , x 3 0 \begin{cases} x_{1} - x_{2} + x_{3} \leqslant 20 \\ 3x_{1} + 2x_{2} + 4x_{3} \leqslant 42 \\ 3x_{1} + 2x_{2} \leqslant 30 \\ x_{1},x_{2},x_{3} \geqslant 0 \end{cases}

[解]

% 将变量按照顺序排好,用系数表示目标函数
f = [-5;-4;-6];
% 没有等式条件,Aeq和beq均为空矩阵。即
Aeq = [];
beq = [];

%不等式条件系数
A = [1 -1 1 
    3 2 4
    3 2 0];
b = [20;42;30];

%没有上限要求
lb = [0;0;0];
ub = [inf;inf;inf];
[x,fval] = linprog(f,A,b,[],[],lb,[]);
x
fval

程序运行结果:


Optimal solution found.


x =

         0
   15.0000
    3.0000


fval =

   -78

>> 

2.2.2 多目标线性规划

多目标线性规划是多目标最优化理论的重要组成部分. 由于多个目标之间的矛盾性和不可公度性, 要求出使得所有目标均达到最优的全局最优解是不可能的, 求解多目标规划问题往往只能求出其有效解.

目前,求解多目标线性规划问题有效解的办法包括 理想点法, 线性加权和法, 最大最小法, 目标规划法.

多目标线性规划有两个或以上的目标函数, 且目标函数和约束条件均为线性函数. 其数学模型表示为:
m a x { z 1 = c 11 x 1 + c 12 x 2 + + c 1 n x n z 2 = c 21 x 1 + c 22 x 2 + + c 2 n x n                                                   z r = c r 1 x 1 + c r 2 x 2 + + c r n x n max \begin{cases} z_{1} = c_{11}x_{1} + c_{12}x_{2} + \cdots + c_{1n}x_{n} \\ z_{2} = c_{21}x_{1} + c_{22}x_{2} + \cdots + c_{2n}x_{n} \\ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\ \ \ \ \ \ \ \ \ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots \\ z_{r} = c_{r1}x_{1} + c_{r2}x_{2} + \cdots + c_{rn}x_{n} \\ \end{cases}
约束条件为:
{ a 11 x 1 + a 12 x 2 + + a 1 n x n b 1 a 21 x 1 + a 22 x 2 + + a 2 n x n b 2                                           a m 1 x 1 + a m 2 x 2 + + a m n x n b m x 1 , x 2 , , x n 0 \begin{cases} a_{11}x_{1} + a_{12}x_{2} + \cdots + a_{1n}x_{n} \leqslant b_{1}\\a_{21}x_{1} + a_{22}x_{2} + \cdots + a_{2n}x_{n} \leqslant b_{2} \\ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\\a_{m1}x_{1} + a_{m2}x_{2} + \cdots + a_{mn}x_{n} \leqslant b_{m}\\ x_{1},x_{2},\cdots,x_{n} \geqslant 0\end{cases}
上述多目标线性规划及约束条件可用矩阵表示:

线性规划:
m a x Z = C x maxZ = Cx

约束条件:
{ A x b x 0 . \begin{cases} Ax \leqslant b \\ x \geqslant 0 \end{cases}.

求解多目标线性规划的常用方法是 理想点法线性加权和法.

2.2.2.1 理想点法

m a x Z = C x max Z = Cx
在约束条件
{ A x b x 0 . \begin{cases} Ax \leqslant b \\ x \geqslant 0 \end{cases}.
中, 先求解 r r 个单目标问题 m i n x D Z j ( x ) ,     j = 1 , 2 , , r min_{x\in D}Z_{j}(x), \ \ \ j = 1,2,\cdots,r .设其最优值为 Z j Z_{j}^{*} , 称 Z Z^{*} 为值域中的一个 理想点,在期望的某种度量之下,寻求距离 Z Z^{*} 最近的 Z Z 作为近似值.

一种最直接的方法是最短距离理想点法:

构造评价函数
ϕ ( Z ) = i = 1 n [ Z i Z i ] 2 \phi(Z) = \sqrt{ \sum_{i = 1}^{n} [Z_{i}-Z_{i}^{*}]^{2} }
然后极小化 ϕ [ Z ( x ) ] \phi[Z(x)] , 即求解
m i n x D ϕ ( Z ) = i = 1 n [ Z i ( x ) Z i ] 2 min_{x \in D}\phi(Z) = \sqrt{ \sum_{i = 1}^{n} [Z_{i}(x)-Z_{i}^{*}]^{2} }
并将其最优解 x x^{*} 作为约束条件在这种意义下的"最优解".

[例]
利用理想点法求解:
m a x f 1 ( x ) = 3 x 1 2 x 2 maxf_{1}(x) = 3x_{1} - 2x_{2}
m a x f 2 ( x ) = 4 x 1 3 x 2 maxf_{2}(x) = -4x_{1} - 3x_{2}
s . t . { 2 x 1 + 3 x 2 18 2 x 1 + x 2 10 x 1 , x 2 0 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}

[解]

先分别求解 f 1 ( x ) f_{1}(x) f 2 ( x ) f_{2}(x) 最优解:

% 求解f1(x)最优解
f1 = [3;-2];
A = [2,3;2,1];
b = [18;10];
lb = [0;0];
[x1,fval1] = linprog(f1,A,b,[],[],lb)

%求解f2(x)最优解
f2 = [-4;-3];
[x2,fval2] = linprog(f2,A,b,[],[],lb)

解得

Optimal solution found.


x1 =

     0
     6


fval1 =

   -12


Optimal solution found.


x2 =

     3
     4


fval2 =

   -24

>> 

故得到理想点为: ( 12 , 24 ) (12,24) .

随后求下列模型的最优解:

m i n x D [ f ( x ) ] = [ f 1 ( x ) 12 ] 2 + [ f 2 ( x ) 24 ] 2 min_{x \in D}[f(x)] = \sqrt{ [f_{1}(x)-12]^{2} + [f_{2}(x) - 24]^{2} }
s . t . { 2 x 1 + 3 x 2 18 2 x 1 + x 2 10 x 1 , x 2 0 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}
求解程序如下:

A = [2,3;2,1];
b = [18;10];
lb = [0;0];
x0 = [1;1];
x = fmincon('((-3*x(1) + 2*x(2)-12)^2 + (4*x(1) + 3*x(2)-24)^2)^(1/2)',x0,A,b,[],[],lb,[])

运行结果:


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    0.5268
    5.6488

>> 

2.2.2.2 线性加权和法

在具有多个指标的问题中,我们可以对那些相对重要的指标给予较大的权系数,从而将多目标向量问题转为所有目标的加权求和的标量问题. 这样,我们可以使用线性加权和法解决多目标线性规划问题.

基于以上思路,我们构造如下的评价函数:
m i n x D Z ( x ) = i = 1 r ω i Z i ( x ) min_{x \in D} Z(x) = \sum^{r}_{i = 1}\omega_{i}Z_{i}(x)
m a x Z = C x max Z = Cx
将其最优解 x x^{*} 作为约束条件在线性加权和意义下的"最优解" ( ω i \omega_{i} 为加权因子,有多种选取方法,包括 专家打分法, 容限法加权因子分解法等.)

[例]
取权系数分别为 ω i = 0.5 , ω 2 = 0.5 \omega_{i} = 0.5, \omega_{2} = 0.5 .对
m a x f 1 ( x ) = 3 x 1 2 x 2 maxf_{1}(x) = 3x_{1} - 2x_{2}
m a x f 2 ( x ) = 4 x 1 3 x 2 maxf_{2}(x) = -4x_{1} - 3x_{2}
s . t . { 2 x 1 + 3 x 2 18 2 x 1 + x 2 10 x 1 , x 2 0 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}
进行线性加权和法求解.

[解]

f = [-0.5;-2.5];
A = [2,3;2,1];
b = [18;10];
lb = [0;0];
x = linprog(f,A,b,[],[],lb)

程序执行结果为:

x = 

    0.0000
    6.0000

2.2.2.3 最大最小法

在进行决策时, 采取保守策略无疑是稳妥的. 这要求我们在最坏的情况下寻求最好的结果. 按照这一思路,我们可以构造如下评价函数:

ϕ ( Z ) = m a x 1 i r Z i \phi(Z) = max_{1\leqslant i \leqslant r}Z_{i}

m i n x D ϕ [ Z ( x ) ] = m i n x D m a x 1 i r Z i ( x ) min_{x \in D} \phi[Z(x)] = min_{x \in D}max_{1 \leqslant i \leqslant r} Z_{i} (x)

并求解
m a x Z = C x . maxZ = Cx.
并将其最优解 x x^{*} 作为约束条件在最大最小意义下的最优解.

[例]
对问题
m a x f 1 ( x ) = 3 x 1 2 x 2 maxf_{1}(x) = 3x_{1} - 2x_{2}
m a x f 2 ( x ) = 4 x 1 3 x 2 maxf_{2}(x) = -4x_{1} - 3x_{2}
s . t . { 2 x 1 + 3 x 2 18 2 x 1 + x 2 10 x 1 , x 2 0 s.t. \begin{cases} 2x_{1} + 3x_{2} \leqslant 18\\ 2x_{1} + x_{2} \leqslant 10 \\ x_{1}, x_{2} \geqslant 0\end{cases}
进行最大最小法求解.

[解]

%定义函数:fun(x)
function f = fun(x)
f(1) = 3*x(1) - 2*x(2);
f(2) = -4*x(1) - 3*x(2);

随后在单独的MATLAB程序中调用上面定义的函数fun(x):

x0 = [1;1];
A = [2,3;2,1];
b = [18;10];
lb = zeros(2,1);
[x,fval] = fminimax('fun',x0,A,b,[],[],lb,[])

程序执行结果为:

Local minimum possible. Constraints satisfied.

fminimax stopped because the size of the current search direction is less than
twice the default value of the step size tolerance and constraints are 
satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

   -0.0000
    6.0000


fval =

  -12.0000  -18.0000

>> end

3. 非线性规划

在前文中, 我们简要介绍了线性规划, 即目标函数和约束条件均为线性函数的规划问题. 然而,在实际工作中,我们常常遇到另外一类更为一般的规划问题. 在这种问题中,目标函数和约束条件中至少有一个是非线性函数. 我们称这样的问题为 非线性规划问题.

非线性规划是具有非线性约束条件或(和)非线性目标函数的数学规划问题. 非线性规划研究一个 n n 元实函数在一组等式或不等式的约束条件下的极值问题,且目标函数和约束条件中至少有一个是未知量的非线性函数.


3.1 非线性规划的标准形式

非线性规划在计算上相比线性规划而言常常要困难得多, 理论上的讨论也无法像线性规划那样给出简洁的结果形式和全面透彻的结论. 在数学建模中, 要进行认真的分析, 对实际问题进行合理假设和简化, 优先考虑使用线性规划模型, 当线性近似误差较大时再去考虑使用非线性规划.

非线性规划问题的标准形式为:
m i n f ( x ) minf(x)
s . t . { g i ( x ) 0 i = 1 , 2 , , m h j ( x ) = 0 j = 1 , 2 , , r s.t.\begin{cases} g_{i}(x)\leqslant 0 & i = 1,2,\cdots,m \\ h_{j}(x) = 0 & j = 1,2,\cdots, r \end{cases}
其中, x x n n 维欧氏空间 R R^{*} 中的向量, f ( x ) f(x) 为目标函数. g i ( x ) g_{i}(x) , h j ( x ) h_{j}(x) 为约束条件,且目标函数和约束条件中至少有一个是非线性函数.

非线性规划模型按照约束条件分类可分为以下三类:

  1. 无约束非线性规划模型
    m i n f ( x ) minf(x)
    x R n x \in R^{n}
  2. 等式约束非线性规划模型
    m i n f ( x ) minf(x)
    s . t . h j ( x ) = 0       j = 1 , 2 , , r s.t.h_{j}(x) = 0 \ \ \ \ \ j = 1,2,\cdots,r
  3. 不等式约束非线性规划模型
    m i n f ( x ) minf(x)
    s . t . h i ( x ) 0       i = 1 , 2 , , m s.t.h_{i}(x) \leqslant 0 \ \ \ \ \ i = 1,2,\cdots,m

3.2 二次规划

若某个非线性规划的目标函数是自变量的二次函数, 且它的约束条件全都是线性函数,则称这种规划为 二次规划. 二次规划是一类特殊的非线性规划.

二次规划有多种求解方法. 其中较为简便的是沃尔夫法. 它是依据库恩-塔克条件,在线性规划单纯形法的基础上加以修正而成的.

沃尔夫法的标准数学模型为;
m i n x 1 2 x T H x + f T x min_{x} \frac{1}{2}x^{T}Hx + f^{T}x

s . t . { A x b A e q x = b e q l b x u b s.t.\begin{cases} A · x \leqslant b \\ Aeq · x = beq \\ lb \leqslant x \leqslant ub\end{cases}
式中, H , A H,A A e q Aeq 为矩阵, f , b , b e q , l b , u b f,b,beq,lb,ub x x 为列向量.

在 MATLAB中, 我们使用quadprog 函数求解二次规划问题,调用格式为:

1. x = quadprog(H,f,A,b)
2. x = quadprog(H,f,A,b,Aeq,beq)
3. x = quadprog(H,f,A,b,lb,ub)
4. x = quadprog(H,f,A,b,lb,ub,x0)
5. x = quadprog(H,f,A,b,lb,ub,x0,options)
6. [x,fval] = quadprog(...)
7. [x,fval,exitflag] = quadprog(...)
8. [x,fval,exitflag,output] = quadprog(...)
9. [x,fval,exitflag,output,lambda] = quadprog(...)
  1. 返回使函数 1 2 x T H x + f T x \frac{1}{2}x^{T}Hx + f^{T}x 最小化的向量 x x ,其约束条件为 A x b . A·x \leqslant b.
  2. 返回使函数 1 2 x T H x + f T x \frac{1}{2}x^{T}Hx + f^{T}x 最小化的向量 x x ,其约束条件为 A x b A·x \leqslant b A e q x = b e q . Aeq · x = beq.
  3. 定义变量的下界和上界.
  4. 要求同上,且设置初值 x 0. x0.
  5. 根据 options 所指定的优化参数最小化.
  6. 返回向量 x x x x 处的目标函数值 f v a l . fval.
  7. 返回参数 exitflag, 描述计算的退出条件.
  8. 返回包含优化信息的结构输出 output.
  9. 返回解 x x 处包含 L a g r a n g e Lagrange 乘子的 lambda 结构参数.

[例]

求解下列最优化问题:

目标函数为:
f ( x ) = 1 2 x 1 2 + x 2 2 x 1 x 2 2 x 1 6 x 2 f(x) = \frac{1}{2}x^{2}_{1} + x^{2}_{2} - x_{1}x_{2} - 2x_{1} - 6x_{2}
约束条件为:
{ x 1 + x 2 2 x 1 + 2 x 2 2 2 x 1 + x 2 3 x 1 0 , x 2 0 \begin{cases} x_{1} + x_{2} \leqslant 2 \\ -x_{1} + 2x_{2} \leqslant 2 \\ 2x_{1} + x_{2} \leqslant 3 \\ x_{1} \geqslant 0, x_{2} \geqslant 0\end{cases}

[解]

目标函数修改为;
f ( x ) = 1 2 ( x 1 2 2 x 1 x 2 + 2 x 2 2 ) 2 x 1 6 x 2 f(x) = \frac{1}{2}(x_{1}^{2} - 2x_{1}x_{2} + 2x_{2}^{2}) -2x_{1} - 6x_{2}
并且记
H = [ 1 1 1 2 ] , f = [ 2 6 ] , x = [ x 1 x 2 ] , A = [ 1 1 1 2 2 1 ] , b = [ 2 2 3 ] H = \begin{bmatrix} 1 & -1 \\ -1 & 2\end{bmatrix}, f = \begin{bmatrix} -2 \\ -6\end{bmatrix}, x = \begin{bmatrix} x_{1}\\ x_{2}\end{bmatrix},A = \begin{bmatrix} 1 & 1 \\ -1 & 2 \\ 2 & 1\end{bmatrix}, b =\begin{bmatrix} 2 \\ 2 \\ 3\end{bmatrix}
上述优化问题相应地记为
m i n x 1 2 x T H x + f T x min_{x} \frac{1}{2}x_{T}Hx + f^{T}x
s . t . { A x b ( 0 , 0 ) T x s.t.\begin{cases} A \cdot x \leqslant b\\ (0,0)^{T} \leqslant x \end{cases}
按照上述思路,编写程序:

H = [1,-1;-1,2];
f = [-2;-6];
A = [1 1;-1 2;2 1];
b = [2;2;3];
lb = zeros(2,1);
[x,fval,exitflag] = quadprog(H,f,A,b,[],[],lb)

程序运行结果如下:


Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    0.6667
    1.3333


fval =

   -8.2222


exitflag =

     1

>> 

3.3 无约束规划

无约束规法划是最常见的一种求解非线性规划的方法, 它在实际应用中也较为常见. 此外, 我们也可以将许多有约束最优化问题转换为无约束最优化问题进行求解.

求解无约束最优化问题的方法主要有两类: 直接搜索法和梯度法.

直接搜索法适用于目标函数高度非线性, 不存在导数或导数难以计算的情形. 很多实际问题都是非线性的, 直接搜索法不失为一种有效的解决办法. 常用的直接搜索法包括 单纯形法, Hooke-Jeeves搜索法, Pavell 共轭方向法等. 直接搜索法的缺点是收敛速度慢,求解时间长.

在可求函数导数的情况下, 梯度法是一种更优越的方法. 梯度法利用函数的梯度和 H e s s i a n Hessian 矩阵构造算法, 达成更快的收敛速度.

在 MATLAB 中,无约束规划可以由三个功能函数 fminbnd, fminsearch, fminunc 实现.

3.3.1 fminbnd 函数

该函数的功能是求 取固定区间内单变量函数 的最小值.数学模型为:
m i n x f ( x ) ,      x 1 x x 2 min_{x}f(x),\ \ \ \ x_{1}\leqslant x\leqslant x_{2}
式中, x , x 1 , x 2 x,x_{1},x_{2} 均为标量, f ( x ) f(x) 为目标函数.

函数调用格式如下:

1. x = fminbnd(fun,x1,x2)
2. x = fminbnd(fun,x1,x2,options)
3. x = fminbnd(fun,x1,x2,options,P1,P2,...)
4. [x,fval] = fminbnd(...)
5. [x,fval,exitflag] = fminbnd(...)
6. [x,fval,exitflag,output] = fminbnd(...)
  1. 返回 [ x 1 , x 2 ] [x1,x2] 区间上 fun 参数描述的标量函数的最小值点 x x .
  2. options 参数指定的优化参数进行最小化.
  3. 提供额外的参数 P 1 , P 2 P1,P2 等,传输给目标函数 f u n fun . 若不需要则空置为’[]’.
  4. 返回解 x x 处目标函数的值.
  5. 返回 exitflag 值描述 fminbnd 函数的退出条件.
  6. 返回包含优化信息的结构输出.

对优化参数选项 o p t i o n s options , 可使用 optimset 函数设置或改变这些参量的值. options 参数有以下选项:

1. Display
2. MaxFunEvals
3. MaxIter
4. TolX
5. exitflag
6. output
  1. ‘off’:不显示输出. ‘iter’:显示每一步迭代过程. ‘fina’:显示最终结果.
  2. 指定函数评价的最大允许次数.
  3. 指定最大允许迭代次数.
  4. 指定 X X 处的终止容限.
  5. 描述退出条件: 大于0表示目标函数收敛于解 x x 处. 等于0表示已经达到函数评价或迭代的最大次数. 小于0表示目标函数不收敛.
  6. 该参数包含三种优化信息: ouput.iterations 表示迭代次数; output.algorithm 表示所用算法; output.funcCount 表示函数评价次数.

[注]

  1. 目标函数在区间内必须为连续函数.
  2. fminbnd 函数可能只能给出局部最优解而非全局最优解.
  3. 当问题的解位于区间边界上时,fminbnd 函数的收敛速度常常很慢.
  4. fminbnd 函数只用于实变量.

[例]

( 0 , 2 π ) (0,2\pi) 上求函数 y = s i n 2 x y = sin2x 的最小值.

[解]

输入

[x,y_min] = fminbnd('sin(2*x)',0,2 * pi)

输出为


x =

    2.3562


y_min =

   -1.0000

[例]

对边长为 4 m 4m 的正方形铁板,在四角处减去边长相等的小正方形从而制成无盖盒子,应该怎么剪才能使得盒子容积最大?

[解]
构造数学模型:设剪去的正方形边长为 x x , 则对应的盒子容积为 f ( x ) = ( 4 2 x ) 2 x f(x) = (4-2x)^{2}x
要使容积最大化,就要求函数 f ( x ) f(x) 在区间 x ( 0 , 2 ) x \in (0,2) 上的最大值, 也就是求 f ( x ) -f(x) 在区间上的最小值.

输入

[x,f_min] = fminbnd('-(4-2*x)^2 * x',0,2)

输出为


x =

    0.6667


f_min =

   -4.7407

即:在四个边角剪去边长为 0.6667 m 0.6667m 的正方形, 所得容器容积最大, 为 4.74.7 m 3 . 4.74.7m^{3}.


3.3.2 fminsearch 函数

该函数功能为求解多变量无约束函数的最小值,其数学模型为:
m i n x f ( x ) min_{x}f(x)
其中, x x 为向量, f ( x ) f(x) 为一个返回标量函数值的函数.

fminsearch 函数常用于无约束非线性最优化问题. 其调用格式如下:

1. x = fminserach(fun,x0)
2. x = fminserach(fun,x0,options)
3. x = fminserach(fun,x0,options,P1,P2,...)
4. [x,fval] = fminsearch(...)
5. [x,fval,exitflag] = fminsearch(...)
6. [x,fval,exitflag,output] = fminsearch(...)
  1. 设定初值为 x 0 x0 ,求函数 f u n fun 的局部极小点 x x .
  2. o p t i o n s options 指定的优化参数进行优化.
  3. 将问题参数 P 1 , P 2 P1,P2 等直接输给目标函数 f u n fun , 将 o p t i o n s options 参数设为空矩阵,作为默认值.
  4. x x 处的目标函数值返回到 f v a l fval 参数中.
  5. 返回 e x i t f l a g exitflag 值,描述函数的退出条件.
  6. 返回包含优化信息的参数 o u t p u t output 的结构输出.

[注]

  1. 应用 fminsearch 函数可能会得到局部最优解.
  2. fminsearch 函数只对实数进行最小化,也即是说 x x 必须由实数组成, f ( x ) f(x) 函数也必须返回实数. 若 x x 为复数,则必须将它分为实部和虚部两个部分.
  3. 对于求解二次以上的问题而言, fminubc 函数比 fminsearch 函数有效,但对于 高度非线性不连续问题, fminsearch 函数更具稳健性.
  4. fminsearch 函数不适合求解平方和问题, 使用 lsqnonlin 函数更好一些.

[例]

求函数 3 1 3 + 3 x 1 x 2 3 7 x 1 x 2 + 2 x 2 2 3_{1}^{3} + 3x_{1}x_{2}^{3} - 7x_{1}x_{2} + 2x_{2}^{2} 的最小值.

[解]

输入

f = '3*x(1)^3 + 3*x(1)*x(2)^3 - 7*x(1)*x(2) + 2*x(2)^2'
x0 = [0,0];
[x,f_min] = fminsearch(f,x0) 

运行结果为


f =

    '3*x(1)^3 + 3*x(1)*x(2)^3 - 7*x(1)*x(2) + 2*x(2)^2'


x =

    0.6269    0.5960


f_min =

   -0.7677


3.3.3 fminunc 函数

fminunc 函数功能为求多变量标量函数的最小值, 常用于无约束非线性规划问题的求解. 调用格式如下:

1. x = fminunc(fun,x0)
2. x = fminunc(fun,x0,options)
3. x = fminunc(fun,x0,options,P1,P2,...)
4. [x,fval] = fminunc(...)
5. [x,fval,exitflag] = fminunc(...)
6. [x,fval,exitflag,output] = fminunc(...)
7. [x,fval,exitflag,output,grad] = fminunc(...)
8. [x,fval,exitflag,output,grad,Hessian] = fminunc(...)
  1. 设定初值为 x 0 x0 ,求函数 f u n fun 的局部极小点 x x .
  2. o p t i o n s options 指定的优化参数进行最小化.
  3. 将问题参数 P 1 , P 2 P1,P2 等直接输给目标函数 f u n fun , 将 o p t i o n s options 参数设为空矩阵,作为默认值.
  4. x x 处的目标函数值返回到 f v a l fval 参数中.
  5. 返回 e x i t f l a g exitflag 值,描述函数的退出条件.
  6. 返回包含优化信息的参数 o u t p u t output 的结构输出.
  7. 将解 x x f u n fun 函数的梯度返回到 g r a d grad 参数中.
  8. 将解 x x 处目标函数的 Hessian矩阵信息返回到参数 H e s s i a n Hessian 中.

对于优化参数选项 options, 可使用 optimset 函数设置或改变这些参数的值. 其中有的参数适用于所有的优化算法, 有的只适用于大型优化问题, 另外一些适用于中型优化问题.

我们首先描述适用于大型优化问题的 o p t i o n s options 选项. 对于 fminunc 函数,必须提供的梯度信息包括:

1. LargeScale
2. Diagnostics
3. Display
4. GradObj
5. MaxFunEvals
6. MaxIter
7. TolFun
8. TolX
9. Hessian
10. HessPattern
11. MaxPCGIter
12. PrecondBandWidth
13. TolPCG
14. TypicalX
15. DerivativeCheck
16. DiffMaxChange
17. DiffMinChange
18. LineSearchType
19. exitflag变量
20. output变量
 
  1. 设为’on’ 时, 使用大型算法; 设为’off’ 时,使用解决中型问题的算法.
  2. 输出最小化函数的诊断信息.
  3. 显示水平: ‘off’: 不显示输出; ‘iter’: 显示每一步迭代过程的输出; ‘final’: 显示最终结果.
  4. 用户定义的目标函数的梯度.
  5. 函数评价的最大次数
  6. 最大允许迭代次数
  7. 函数值的终止容限
  8. x x 处的终止容限, 只适用于大型算法的参数.
  9. 用户定义的目标函数的 Hessian 矩阵.
  10. 用于有限差分的 Hessian 矩阵的稀疏形式.
  11. PCG迭代的最大次数.
  12. PCG前处理的带宽, 默认为0.
  13. PCG迭代的终止容限.
  14. 典型 x x 值, 该参数只适用于中型算法.
  15. 对用户提供的导数和有限差分求出的导数进行对比.
  16. 变量有限差分梯度的最大变化
  17. 变量有限差分梯度的最小变化
  18. 一维搜索算法的选择
  19. 描述退出条件: > 0 >0 表示目标函数收敛于解 x x 处, = 0 =0 表示已经达到函数评价或迭代的最大次数; < 0 <0 表示目标函数不收敛.
  20. 该参数包含的优化信息有:
  1. outlut.iterations 表示迭代次数;
  2. output.algorithm 表示所采用的算法;
  3. output.funCount 表示函数评价次数;
  4. output.cgiterations 表示PCG迭代次数;
  5. output.stepsize 表示最终步长的大小;
  6. output.firstorderopt 表示一阶优化的度量;

注:

  1. fun 为需要最小化的目标函数. 该函数需要向量参数 x x 作为输入, 返回 x x 处的目标函数值(标量) I . I. 在实际使用中, 可将其定义为命令行:

    x = fminunc(inline('norm(x)^2'),x0)
    

    同样, fun 函数还可以是一个包含函数名的字符串, 它所对应的函数可以是.m 文件, 内部函数或 .mex 文件.

  2. fun = 'myfun', 则 x = fminunc(@myfun,x0). 其中,.m 文件必须具有以下形式:

    function f = myfun(x)
    f = ......       %计算x处的函数值
    
  3. 若可以计算出 fun 函数的梯度, 且参数 options.GradObj 设为’on’,也就是:

    options = optimset('GradObj','on')
    

    fun 函数必须返回解 x x 处的梯度向量 g g 到第二个输出变量中. 当被调用的 fun 函数只需要一个输出变量时(如算法只需要目标函数的值而不需要其梯度值时), 可通过核对 nargout 的值避免计算梯度值:

     function[f, g] = myfun(x)
     f = ...
     if nargout >1
         g = ...
     end 
    
  4. 若 Hessian 矩阵可以求得, 且 options.Hessian 设为 on, 即:

    options = optimset('Hessian','on')
    

    fun 函数必须返回解 x x 处的 Hessian 矩阵到第三个输出变量中去. 当被调用的 fun 函 数不需要 Hessian 矩阵值时,可通过核对 nargout 的值来避免计算 Hessian 矩阵:

    function[f, g] = myfun(x)
    f = ...
    if nargout > 1
        g = ...
        if nargout > 2
        H = ...
    end
    
  5. 目标函数必须是连续的, fminunc 函数有时只能给出局部最优解.

  6. fminunc 函数只能对实数进行优化, 因此 f ( x ) f(x) 必须返回实数, x x 必须是实数. 当 x x 为复数时, 必须将其分解为实部和虚部.

  7. 在使用大型算法时, 用户必须在 fun函数中提供梯度,否则将给出警告信息.

  8. 对于求解平方和问题, 相较fminunc 函数, lsqnonlin 函数效果更佳.

[例]

最小化函数:
f ( x ) = 3 x 1 2 + 2 x 1 x 2 + x 2 2 f(x) = 3x_{1}^{2} + 2x_{1}x_{2} + x_{2}^{2}

[解]

% 定义函数并保存为.m 文件
function f = myfun1(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;

随后在Command Window中调用函数:

[x,fval] = fminunc(@myfun1,x0)

运行得到结果:

Local minimum found.

Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.

<stopping criteria details>

>> x,fval

x =

   1.0e-06 *

    0.2541   -0.2029


fval =

   1.3173e-13

下面再使用提供的梯度 g g 最小化原函数:

function [f,g] = myfun1(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;
if nargout >1
    g(1) = 6*x(1) + 2*x(2);
    g(2) = 2*x(1) + 2*x(2);
end

将优化选项结构 options.GradObj 设为on得到梯度值:

>> options = optimoptions('fminunc','GradObj','on','Algorithm','trust-region');
>> x0 = [1,1];
>> [x,fval] = fminunc(@myfun1,x0,options)

Local minimum found.

Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.

<stopping criteria details>


x =

   1.0e-15 *

    0.2220   -0.2220


fval =

   9.8608e-32


3.4 有约束规划

有约束规划法是一种非线性规划求解方法. 在有约束最优化问题中, 常需要将该问题转化为更简单的子问题. 这些子问题可以求解并作为迭代过程的基础.

我们可以用 fmincon 函数求解有约束规划问题. 该函数调用格式如下;

1. x = fmincon(fun,x0,A,b)
2. x = fmincon(fun,x0,A,b,Aeq,beq)
3. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
4. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
5. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
6. [x,fval] = fmincon(...)
7. [x,fval,exitflag] = fmincon(...)
8. [x,fval,exitflag,output] = fmincon(...)
9. [x,fval,exitflag,output,lambda] = fmincon(...)
10. [x,fval,exitflag,output,lambda,grad] = fmincon(...)
11. [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)
  1. 给定初值 x 0 x0 ,求解函数fun 的最小值点 x x . 函数约束条件为 A x b A\cdot x \leqslant b .
  2. 同时还增加约束条件 A x b A\cdot x \leqslant b A e q x = b e q . Aeq \cdot x = beq.
  3. 同时还定义变量 x x 的上界和下界.
  4. 同时还在nonlcon 参数中提供非线性的 c(x)ceq(x).
  5. options 指定的参数进行最小化.
  6. 同时还返回解 x x 处的目标函数值.
  7. 同时还返回 exitflag 参数, 描述函数计算的退出条件.
  8. 同时还返回包含优化信息的输出参数output.
  9. 同时还返回解 x x fun 函数 Lagrange乘子的 lambda 参数.
  10. 同时还返回解 x x fun 函数的梯度.
  11. 同时还返回解 x x fun 函数的 Hessian 矩阵

注: nonlcon 参数
nonlcon 参数计算非线性不等式约束 c 0 c \leqslant 0 和非线性等式约束 c e q ( x ) = 0. ceq(x) = 0. 该参数是一个包含函数名的字符串. 此参数要求输入一个向量 x x , 返回两个变量: x x 处的非线性不等式向量 c c 和非线性等式向量 c e q . ceq. 举例:若 nonlcon = 'mycon', 则.m 文件 mycon.m 必须具备以下格式:

function [c,ceq] = mycon(x)
c = ...       %计算x处的非线性不等式
ceq = ...     %计算x处的非线性等式

若还计算了约束的梯度,即:

options = optimset('GradConstr', 'on')

nonlcon 函数必须在第三个和第四个输出变量中返回 c(x) 的梯度 GCceq 的梯度 GCeq.

当被调用的 nonlcon 函数不需要输出梯度值时,可通过检测 nargout 来避免计算梯度:

function [c,ceq,GC,GCeq] = mycon(x)
c = ...
ceq = ...
if nargout >2
    GC = ...
    GCeq = ...
end

[例]

解优化问题:
m i n f ( x 1 , x 2 , x 3 ) = x 1 2 ( x 2 + 2 ) x 3 min f(x_{1},x_{2},x_{3}) = x_{1}^{2}(x_{2} + 2)x_{3}
约束条件为
{ 350 163 x 1 2.86 x 3 0.86 0 10 4 1 0 3 x 1 4 x 2 x 3 3 x 1 ( x 2 + 1.5 ) + 4.4 1 0 3 x 1 4 x 2 x 3 3 3.7 x 3 0 375 3.56 1 0 5 x 1 x 2 1 x 3 2 4 x 3 x 1 0 1 x 1 4 4.5 x 2 50 10 x 3 30 \begin{cases} 350-163x_{1}^{-2.86}x_{3}^{0.86} \leqslant 0 \\ 10-4*10^{-3}x_{1}^{-4}x_{2}x_{3}^{3} \leqslant \\ x_{1}(x_{2}+1.5) + 4.4*10^{-3}x_{1}^{-4}x_{2}x_{3}^{3}-3.7x_{3} \leqslant 0 \\ 375-3.56*10^{5}x_{1}x_{2}^{-1}x_{3}^{-2} \leqslant \\ 4-\frac{x_{3}}{x_{1}} \leqslant 0 \\ 1 \leqslant x_{1} \leqslant 4 \\ 4.5 \leqslant x_{2} \leqslant 50 \\ 10 \leqslant x_{3} \leqslant 30 \end{cases}

[解]

定义目标函数和非线性约束条件函数:

function f = myfun00(x)
f = x(1)*x(1)*(x(2)+2)*x(3); 

function [c,ceq] = myfun01(x)
c(1) = 350 - 163*x(1)^(-2.86)*x(3)^0.86;
c(2) = 10-0.004*(x(1)^(-4))*x(2)*(x(3)^3);
c(3) = x(1)*(x(2)+1.5)+0.0044*(x(1)^(-4))*x(2)*(x(3)^3)-3.7*x(3);
c(4) = 375-356000*x(1)*(x(2)^(-1))*x(3)^(-2);
c(5) = 4-x(3)/x(1);
ceq = 0;

函数求解程序:

x0 = [2 25 20]';
lb = [1 4.5 10]';
ub = [4 50 30]';
[x,fval,exitflag] = fmincon(@myfun00,x0,[],[],[],[],lb,ub,@myfun01)

运行结果如下:


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    1.0000
    4.5000
   10.0000


fval =

   65.0005


exitflag =

     1

>> 

目标函数和非线性约束条件函数:

function f = myfun00(x)
f = x(1)*x(1)*(x(2)+2)*x(3); 

function [c,ceq] = myfun01(x)
c(1) = 350 - 163*x(1)^(-2.86)*x(3)^0.86;
c(2) = 10-0.004*(x(1)^(-4))*x(2)*(x(3)^3);
c(3) = x(1)*(x(2)+1.5)+0.0044*(x(1)^(-4))*x(2)*(x(3)^3)-3.7*x(3);
c(4) = 375-356000*x(1)*(x(2)^(-1))*x(3)^(-2);
c(5) = 4-x(3)/x(1);
ceq = 0;

函数求解程序:

x0 = [2 25 20]';
lb = [1 4.5 10]';
ub = [4 50 30]';
[x,fval,exitflag] = fmincon(@myfun00,x0,[],[],[],[],lb,ub,@myfun01)

运行结果如下:


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    1.0000
    4.5000
   10.0000


fval =

   65.0005


exitflag =

     1

>> 
发布了32 篇原创文章 · 获赞 14 · 访问量 6358

猜你喜欢

转载自blog.csdn.net/u010186354/article/details/104169733
今日推荐