1. 线性规划(LP)
1.1 线性规划问题解的概念
线性规划问题是在一组线性约束条件的限制下,求一线性目标函数的最大或最小值的问题。一般线性规划问题的数学标准型为
max
z
=
∑
j
=
1
n
c
j
x
j
s.t.
{
∑
j
=
1
n
a
i
j
x
j
=
b
i
,
i
=
1
,
2
,
⋯
,
m
x
j
⩾
0
,
j
=
1
,
2
,
⋯
,
n
\max z=\sum_{j=1}^{n} c_{j} x_{j}\\ \text{s.t.} \begin{cases} \sum_{j=1}^{n} a_{i j} x_{j}=b_{i}, i=1,2, \cdots, m \\ x_{j} \geqslant 0, j=1,2, \cdots, n \end{cases}
maxz=j=1∑ncjxjs.t.{∑j=1naijxj=bi,i=1,2,⋯,mxj⩾0,j=1,2,⋯,n式中
b
i
⩾
0
,
i
=
1
,
2
,
⋯
,
m
b_{i} \geqslant 0, i=1,2, \cdots, m
bi⩾0,i=1,2,⋯,m。若只满足约束条件的解称为线性规划的可行解,使目标函数达到最大值的可行解称为最优解。所有可行解构成的集合称为问题的可行域。
1.2 线性规划的MATLAB标准形式及求解
MATLAB中规定线性规划的标准形式为
min
x
f
T
x
s.t.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
\mathop{\min}\limits_{x}\bm{f^Tx} \\ \text{s.t.}\begin{cases} \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\ lb \leqslant\bm{x}\leqslant ub \end{cases}
xminfTxs.t.⎩⎪⎨⎪⎧A⋅x⩽bAeq⋅x=beqlb⩽x⩽ub式中
f
,
x
,
b
,
b
e
q
,
l
b
,
u
b
\bm{f,x,b},beq,lb,ub
f,x,b,beq,lb,ub为列向量,其中
f
\bm{f}
f称为价值向量,
b
\bm{b}
b称为资源向量,
A
,
A
e
q
\bm{A},Aeq
A,Aeq为矩阵。
MATLAB中求解线性规划的命令为
[x,fval] = linprog(f,A,b) %x返回决策向量的取值,fval返回目标函数的最优值
[x,fval] = linprog(f,A,b,Aeq,beq)
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub) %若ub存在而前面的参数有不存在的则传入[]
1.3 可以转化为线性规划的问题
很多看起来不是线性规划的问题,也可以通过变换转化为线性规划问题来解决。
1.3.1
min
c
1
∣
x
1
∣
+
c
2
∣
x
2
∣
+
⋯
+
c
n
∣
x
n
∣
s.t.
A
x
⩽
b
\min c_1|x_1|+c_2|x_2|+\cdots+c_n|x_n| \\ \text{s.t.}\ \bm{Ax\leqslant b}
minc1∣x1∣+c2∣x2∣+⋯+cn∣xn∣s.t. Ax⩽b式中
x
=
[
x
1
,
⋯
,
x
n
]
T
\bm{x}=[x_1,\cdots,x_n]^T
x=[x1,⋯,xn]T,要把该问题转化为线性规划问题,取
u
i
=
∣
x
i
∣
+
x
i
2
,
v
i
=
∣
x
i
∣
−
x
i
2
u_i=\cfrac{|x_i|+x_i}{2}\ ,v_i=\cfrac{|x_i|-x_i}{2}
ui=2∣xi∣+xi ,vi=2∣xi∣−xi,记
u
=
[
u
1
,
⋯
,
u
n
]
T
,
v
=
[
v
1
,
⋯
,
v
n
]
T
,
c
=
[
c
1
,
⋯
,
c
n
]
\bm{u}=[u_1,\cdots,u_n]^T,\bm{v}=[v_1,\cdots,v_n]^T,\bm{c}=[c_1,\cdots,c_n]
u=[u1,⋯,un]T,v=[v1,⋯,vn]T,c=[c1,⋯,cn],可将上述问题变为
min
[
c
,
c
]
[
u
v
]
s.t.
{
[
A
,
−
A
]
[
u
v
]
⩽
b
u
,
v
⩾
0
\min[\bm{c,c}]\begin{bmatrix}\bm{u}\\ \bm{v} \end{bmatrix} \\ \text{s.t.}\ \begin{cases}\bm{[A,-A]}\begin{bmatrix}\bm{u}\\ \bm{v} \end{bmatrix}\leqslant \bm{b}\\ \bm{u,v}\geqslant0 \end{cases}
min[c,c][uv]s.t. ⎩⎨⎧[A,−A][uv]⩽bu,v⩾0令
y
=
[
u
v
]
=
[
u
1
,
⋯
,
u
n
,
v
1
,
⋯
,
v
n
]
T
\bm{y}=\begin{bmatrix}\bm{u}\\ \bm{v} \end{bmatrix}=[u_1,\cdots,u_n,v_1,\cdots,v_n]^T
y=[uv]=[u1,⋯,un,v1,⋯,vn]T,则上述问题继续转化为
min
[
c
,
c
]
y
s.t.
{
[
A
,
−
A
]
y
⩽
b
y
⩾
0
\min [\bm{c,c}]\bm{y} \\ \text{s.t.}\ \begin{cases}\bm{[A,-A]}\bm{y}\leqslant \bm{b}\\ \bm{y}\geqslant0 \end{cases}
min[c,c]ys.t. {[A,−A]y⩽by⩾0
1.3.2 min x i max y i ∣ x i − y i ∣ \mathop{\min}\limits_{x_i}\ \mathop{\max}\limits_{y_i}|x_i-y_i| ximin yimax∣xi−yi∣要将该问题转为线性规划问题,可令 v = max y i ∣ x i − y i ∣ v=\mathop{\max}\limits_{y_i}|x_i-y_i| v=yimax∣xi−yi∣,上述问题即转化为 min v s.t. { x 1 − y 1 ⩽ v , ⋯ , x n − y n ⩽ v y 1 − x 1 ⩽ v , ⋯ , y n − x n ⩽ v \min v \\ \text{s.t.}\ \begin{cases}x_1-y_1\leqslant v,\cdots,x_n-y_n\leqslant v \\ y_1-x_1\leqslant v,\cdots,y_n-x_n\leqslant v \end{cases} minvs.t. {x1−y1⩽v,⋯,xn−yn⩽vy1−x1⩽v,⋯,yn−xn⩽v
2. 整数规划
2.1 概论
2.1.1 整数规划的定义
当数学规划中的变量部分或全部限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适用于整数线性规划,还没有一种方法能有效地求解一切整数规划。如不加说明,一般指整数线性规划。
2.1.2 整数规划的分类
整数线性规划大致可分为两类:① 变量全限制为整数时,称纯(完全)整数规划 ② 变量部分限制为整数时,称混合整数规划
2.1.3 整数规划的特点
- 若原线性规划有最优解,当自变量限制为整数后,可能出现整数规划最优解值变差,或无可行解的情况。
- 整数规划最优解不能按照实数最优解简单取整获得。
2.1.4 求解方法分类
分枝定界法,割平面法,隐枚举法,匈牙利法,蒙特卡洛法。
2.2 0-1型整数规划
0-1型整数规划是整数规划中的特殊情形,其变量
x
i
x_i
xi仅取值0或1,称为0-1变量或二进制变量。约束条件可写为
0
⩽
x
i
⩽
1
,
x
i
为
整
数
0\leqslant x_i\leqslant 1\ ,x_i为整数
0⩽xi⩽1 ,xi为整数在实际问题中,引入0-1变量就可以把有各种情况需要分别讨论的数学规划问题统一在一个问题中讨论了。
2.2.1 相互排斥的约束条件
若有m个相互排斥的约束条件
a
i
1
x
1
+
⋯
+
a
i
n
x
n
⩽
b
i
,
i
=
1
,
2
,
⋯
,
m
a_{i1}x_1+\cdots+a_{in}x_n\leqslant b_i\ ,i=1,2,\cdots,m
ai1x1+⋯+ainxn⩽bi ,i=1,2,⋯,m为保证这m个约束条件只有一个起作用,引入m个0-1变量
y
i
=
{
1
,
第
i
个
约
束
起
作
用
0
,
第
i
个
约
束
不
起
作
用
y_i=\begin{cases}1\ ,第i个约束起作用 \\ 0\ ,第i个约束不起作用 \end{cases}
yi={1 ,第i个约束起作用0 ,第i个约束不起作用和一个充分大的常数M,则下面一组m+1个约束条件符合上述要求
a
i
1
x
1
+
⋯
+
a
i
n
x
n
⩽
b
i
+
(
1
−
y
i
)
M
,
i
=
1
,
2
,
⋯
,
m
{
y
1
+
⋯
+
y
m
=
1
y
i
=
0
或
1
,
i
=
1
,
⋯
,
m
a_{i1}x_1+\cdots+a_{in}x_n\leqslant b_i+(1-y_i)M\ ,i=1,2,\cdots,m \\ \begin{cases}y_1+\cdots+y_m=1\\ y_i=0或1\ ,i=1,\cdots,m\end{cases}
ai1x1+⋯+ainxn⩽bi+(1−yi)M ,i=1,2,⋯,m{y1+⋯+ym=1yi=0或1 ,i=1,⋯,m把相互排斥的约束条件改成普通的约束条件未必需要引入充分大的正实数,如约束条件
x
1
=
0
或
a
⩽
x
1
⩽
b
x_1=0或a\leqslant x_1 \leqslant b
x1=0或a⩽x1⩽b可改写为
{
a
y
⩽
x
1
⩽
b
y
y
=
0
或
1
\begin{cases}ay\leqslant x_1 \leqslant by\\ y=0或1\end{cases}
{ay⩽x1⩽byy=0或1
2.2.2 关于固定费用的问题
设某产品有3种生产方式,在i=1,2,3的情况下,
x
i
x_i
xi表示用第i种方式的产量,
c
i
c_i
ci表示用第i种方式时每件产品的成本,
k
i
k_i
ki表示用第i种方式时得固定成本。当
x
i
≠
0
x_i\neq0
xi=0时,存在固定成本
k
i
k_i
ki。为构成目标函数,引入3个0-1变量
y
i
y_i
yi表示第i中生产方式是否使用,此时目标函数为
min
z
=
(
k
1
y
1
+
c
1
x
1
)
+
(
k
2
y
2
+
c
2
x
2
)
+
(
k
3
y
3
+
c
3
x
3
)
\min z=(k_1y_1+c_1x_1)+(k_2y_2+c_2x_2)+(k_3y_3+c_3x_3)
minz=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3)约束条件可写为
{
y
i
ε
⩽
x
i
⩽
y
i
M
y
i
=
0
或
1
,
i
=
1
,
2
,
3
\begin{cases}y_i\varepsilon\leqslant x_i\leqslant y_iM\\ y_i=0或1\end{cases}\ ,i=1,2,3
{yiε⩽xi⩽yiMyi=0或1 ,i=1,2,3式中
ε
\varepsilon
ε为充分小的正常数,M为充分大的正常数。
2.2.3 指派问题的数学模型
拟分配n人去做n项工作,每人做且仅做一项工作,若分配第i人去做第j项工作需花费
c
i
j
c_{ij}
cij单位时间,问应如何分配工作才能使工人花费的总时间最少。要给出一个指派问题的实例,只需给出矩阵
C
=
(
c
i
j
)
\bm{C}=(c_{ij})
C=(cij),
C
\bm{C}
C称为指派问题的系数矩阵。
引入0-1变量
x
i
j
=
{
1
,
第
i
人
做
第
j
项
工
作
0
,
第
i
人
不
做
第
j
项
工
作
,
i
,
j
=
1
,
2
,
⋯
,
n
x_{ij}=\begin{cases}1\ ,第i人做第j项工作 \\ 0\ ,第i人不做第j项工作\end{cases}\ ,i,j=1,2,\cdots,n
xij={1 ,第i人做第j项工作0 ,第i人不做第j项工作 ,i,j=1,2,⋯,n上述指派问题的数学模型为
min
∑
i
=
1
n
∑
j
=
1
n
c
i
j
x
i
j
s.t.
{
∑
j
=
1
n
x
i
j
=
1
,
j
=
1
,
⋯
,
n
∑
i
=
1
n
x
i
j
=
1
,
i
=
1
,
⋯
,
n
x
i
j
=
0
或
1
,
i
,
j
=
1
,
⋯
,
n
\min\sum_{i=1}^n\sum_{j=1}^nc_{ij}x_{ij}\\ \text{s.t.}\begin{cases}\sum{_{j=1}^nx_{ij}=1,j=1,\cdots,n} \\ \sum{_{i=1}^nx_{ij}=1,i=1,\cdots,n}\\ x_{ij}=0或1,i,j=1,\cdots,n\end{cases}
mini=1∑nj=1∑ncijxijs.t.⎩⎪⎨⎪⎧∑j=1nxij=1,j=1,⋯,n∑i=1nxij=1,i=1,⋯,nxij=0或1,i,j=1,⋯,n
2.3 蒙特卡洛法(随机抽样法)
蒙特卡洛法是基于对大量事件的统计结果来实现一些确定性问题的计算,使用蒙特卡洛法必须使用计算机生成相关分布的随机数。
R = unifrnd(A,B) %返回由连续均匀分布产生的随机数组R,其上下端点分别由A和B指定。
%如果A和B是数组,则R(i,j)由A和B对应元素指定的分布产生。如果A或B是标量,则将其扩展为另一个输入的大小。
R = unifrnd(A,B,[m,n]) %以标量A,B为上下限生成一个大小为(m,n)的随机数组,若A,B为数组则大小必须为(m,n)
尽管整数规划由于限制变量为整数导致难度增加,但也为枚举法提供了方便。在自变量维数很大、取值范围很宽的情况下,用显枚举法(穷举法)计算出最优值是不现实的,但用概率论可以证明,在一定计算量的情况下,用蒙特卡洛法完全可以得出一个满意解。
MATLAB使用蒙特卡洛法求解整数规划(可非线性)步骤如下:
- 编写M文件定义目标函数f和约束向量函数g
- 用for循环设定取值次数,每个循环内部随机生成f所需要的整数个数
- 判断随机生成的数是否符合约束g,若符合则对比当前情况下的f与已得到的最优f
- 输出循环过程中得到的f最优值以及相应的自变量
2.4 整数线性规划的计算机求解
整数规划问题的求解用Lingo等专用软件比较方便,也可使用MATLAB的intlinprog函数求解,但必须把所有的决策变量化成一维决策向量,对于多维变量的数学规划问题(如指派问题的决策向量为二维),使用变量替换化成一维向量后,约束条件很难写出,而Lingo求解数学规划问题是不需要做变换的,使用起来相对容易。
MATLAB中规定整数线性规划的标准形式为
min
x
f
T
x
s.t.
{
x
(
i
n
t
c
o
n
)
为
整
数
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
\mathop{\min}\limits_{x}\bm{f^Tx} \\ \text{s.t.}\begin{cases}\bm{x}(intcon)为整数\\ \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\ lb \leqslant\bm{x}\leqslant ub \end{cases}
xminfTxs.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x(intcon)为整数A⋅x⩽bAeq⋅x=beqlb⩽x⩽ub式中
f
,
x
,
b
,
i
n
t
c
o
n
,
b
e
q
,
l
b
,
u
b
\bm{f,x,b},intcon,beq,lb,ub
f,x,b,intcon,beq,lb,ub为列向量,
A
,
A
e
q
\bm{A},Aeq
A,Aeq为矩阵。
MATLAB中求解线性规划的命令为
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
3. 非线性规划
3.1 非线性规划模型
若目标函数或约束条件中包含非线性函数,这种规划问题为非线性规划问题。非线性规划要比线性规划问题困难得多,且没有通用的一般算法。
在非线性规划问题中,可将0-1约束条件改写为非线性约束条件: x i ( 1 − x i ) = 0 x_i(1-x_i)=0 xi(1−xi)=0
线性规划与非线性规划的区别在于,如果线性规划的最优解存在,则其最优解只能在其可行域的边界上达到,而非线性规划的最优解则可能在可行域的任意一点达到。
MATLAB中规定非线性规划的标准形式为
min
f
(
x
)
s.t.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
c
(
x
)
⩽
0
c
e
q
(
x
)
=
0
l
b
⩽
x
⩽
u
b
\min f(\bm{x})\\ \text{s.t.}\begin{cases} \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\c(\bm{x})\leqslant0\\ceq(\bm{x})=0\\ lb \leqslant\bm{x}\leqslant ub \end{cases}
minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧A⋅x⩽bAeq⋅x=beqc(x)⩽0ceq(x)=0lb⩽x⩽ub式中
f
(
x
)
f(\bm{x})
f(x)为标量函数,
c
(
x
)
,
c
e
q
(
x
)
c(\bm{x}),ceq(\bm{x})
c(x),ceq(x)为非线性向量函数。
MATLAB中求解非线性规划的命令为
[x,fval] = fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
%f是用M文件定义的函数f(x);x0是x的初始值;nonlcon是用M文件定义的非线性向量函数c(x),ceq(x);options定义了优化参数,可使用默认
%将函数作为输入变量时,可用单引号包上函数名输入,或在函数名前加@输入
%若能计算出f(x)的导数并用于求解该函数,则将求得的导数作为f的第二项输出,并定义options为下式
options=optimset('GradObj','on','GradConstr','on');
3.2 无约束问题的MATLAB解法
3.2.1 无约束极值问题的符号解
多元函数f(x,y)在无约束条件下要求极值,先通过一阶偏导为0得到驻点
f
x
(
x
,
y
)
=
0
,
f
y
(
x
,
y
)
=
0
f_x(x,y)=0\ ,f_y(x,y)=0
fx(x,y)=0 ,fy(x,y)=0再通过二阶偏导得到Hessian矩阵
[
∂
2
f
∂
x
2
∂
2
f
∂
x
2
∂
2
f
∂
x
2
∂
2
f
∂
x
2
]
\begin{bmatrix}\cfrac{\partial^2f}{\partial x^2} & \cfrac{\partial^2f}{\partial x^2} \\\\ \cfrac{\partial^2f}{\partial x^2} & \cfrac{\partial^2f}{\partial x^2}\end{bmatrix}
⎣⎢⎢⎢⎡∂x2∂2f∂x2∂2f∂x2∂2f∂x2∂2f⎦⎥⎥⎥⎤如果在驻点处Hessian阵为正定阵,则在该点取极小值;若为负定阵,则在该点处取极大值;若为不定阵,则该驻点不是极值点。
df=jacobian(f) %计算函数f的雅可比矩阵,使用一次即求偏导数,使用第二次即求Hessian矩阵
S = solve(eqn,var) %以var为变量求解方程eqn。若不指定var,则方程会通过symvar函数自动判断哪些是要求解的变量
f=subs(f,{x,y},{xx(i),yy(i)}) %将参数第三项替换第二项以求解第一项的值
e = eig(A) %求解方阵A的特征值,返回一个列向量
3.2.2 无约束极值问题的数值解
MATLAB工具箱中,用于求解无约束极小值问题的函数有fminunc和fminsearch。fminunc 采用拟牛顿法(QN),是一种使用导数的算法。fminsearch 采用Nelder-Mead单纯形法,是一种直接搜索法。求函数的极小值
min
x
f
(
x
)
\min_x f(x)
xminf(x)式中x为标量或向量。
[x,fval]=fminunc(fun,x0,options) %x0是x的初始值,options是优化参数,可用默认值
%fun是一个M函数,当fun只有一个返回值时,该返回值为函数f(x);当fun有两个返回值时,第二个返回值为f(x)的梯度向量;
当fun有三个返回值时,第三个返回值是f(x)的二阶导数阵(Hessian阵)。提供的信息越多,计算越快,精度越高。
[x,fval]=fminsearch(fun,x0,options) %这两个函数都只能求给定初始值附近的一个极小值点
3.2.3 求函数零点和方程组的解
可使用roots函数对多项式函数进行求解(数值解),也可使用solve函数求函数的解析解(符号解)。roots返回double类型,solve返回符号类型。roots只能解多项式方程,solve可解别的方程(只要它解得出的话)和方程组。也可使用fslove函数求数值解,但fslove只能求得初始值附近的一个零点。fsolve要求输入的是一个函数句柄,solve则是符号表达式或者string定义的表达式。
r = roots(p) %以列向量的形式返回 p 表示的多项式的根。输入 p 是一个包含 n+1 多项式系数的向量,以 x^n 系数开头。
%0系数表示方程中不存在的中间幂。例如:p = [3 2 -2] 代表多项式 3x^2+2x−2
x = fsolve(fun,x0)
3.3 约束极值问题
带有约束条件的极值问题成为约束极值问题,也叫规划问题。
3.3.1 二次规划
若非线性规划的目标函数为自变量x的二次函数,且约束条件全是线性的,就称之为二次规划。
MATLAB中规定二次规划的标准形式为
min
1
2
x
T
H
x
+
f
T
x
s.t.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
\min\cfrac12\bm{x^THx+f^Tx} \\ \text{s.t.}\begin{cases} \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\ lb \leqslant\bm{x}\leqslant ub \end{cases}
min21xTHx+fTxs.t.⎩⎪⎨⎪⎧A⋅x⩽bAeq⋅x=beqlb⩽x⩽ub式中
H
\bm{H}
H为实对称矩阵。
MATLAB中求解线性规划的命令为
[x,fval] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
3.3.2 罚函数法
利用罚函数法,可将非线性规划问题的求解,转化为求解一系列无约束的极值问题,因而也称该方法为序列无约束最小化技术SUMT。
罚函数法求解非线性规划问题的思想是,利用问题中的约束函数作出适当的罚函数,由此构造出带参数的増广目标函数,把问题转化为无约束非线性规划问题。
考虑问题
min
f
(
x
)
s.t.
{
g
i
(
x
)
⩽
0
,
i
=
1
,
⋯
,
r
h
j
(
x
)
⩾
0
,
j
=
1
,
⋯
,
s
k
m
(
x
)
=
0
,
m
=
1
,
⋯
,
t
\begin{array}{l} \min f(\bm{x}) \\ \text { s.t. }\left\{\begin{array}{ll} g_{i}(\bm{x})\leqslant 0, \quad i=1, \cdots, r \\ h_{j}(\bm{x}) \geqslant 0, \quad j=1, \cdots, s \\ k_{m}(\bm{x})=0, \quad m=1, \cdots, t \end{array}\right. \end{array}
minf(x) s.t. ⎩⎨⎧gi(x)⩽0,i=1,⋯,rhj(x)⩾0,j=1,⋯,skm(x)=0,m=1,⋯,t取一个充分大的数
M
>
0
,
M>0,
M>0, 构造函数
P
(
x
,
M
)
=
f
(
x
)
+
M
∑
i
=
1
r
max
(
g
i
(
x
)
,
0
)
−
M
∑
j
=
1
s
min
(
h
j
(
x
)
,
0
)
+
M
∑
m
=
1
t
∣
k
m
(
x
)
∣
P(\bm{x}, M)=f(\bm{x})+M \sum_{i=1}^{r} \max \left(g_{i}(\bm{x}), 0\right)-M \sum_{j=1}^{s} \min \left(h_{j}(\bm{x}), 0\right)+M \sum_{m=1}^{t}\left|k_{m}(\bm{x})\right|
P(x,M)=f(x)+Mi=1∑rmax(gi(x),0)−Mj=1∑smin(hj(x),0)+Mm=1∑t∣km(x)∣或
P
(
x
,
M
)
=
f
(
x
)
+
M
sum
(
max
(
G
(
x
)
0
)
)
−
M
sum
(
min
(
H
(
x
)
0
)
)
+
M
∣
∣
K
(
x
)
∣
∣
P(\bm{x}, M)=f(\bm{x})+M \operatorname{sum}\left(\max \left(\begin{array}{l}G(\bm{x}) \\0\end{array}\right)\right)-M \operatorname{sum}\left(\min \left(\begin{array}{l}H(\bm{x}) \\0\end{array}\right)\right)+M|| K(\bm{x}) ||
P(x,M)=f(x)+Msum(max(G(x)0))−Msum(min(H(x)0))+M∣∣K(x)∣∣其中
G
(
x
)
=
[
g
1
(
x
)
,
⋯
,
g
r
(
x
)
]
,
H
(
x
)
=
[
h
1
(
x
)
,
⋯
,
h
s
(
x
)
]
,
K
(
x
)
=
[
k
1
(
x
)
,
⋯
,
k
t
(
x
)
]
G(\bm{x})=\left[g_{1}(\bm{x}), \cdots, g_{r}(\bm{x})\right], H(\bm{x})=\left[h_{1}(\bm{x}), \cdots, h_{s}(\bm{x})\right], K(\bm{x})=\left[k_{1}(\bm{x}), \cdots, k_{t}(\bm{x})\right]
G(x)=[g1(x),⋯,gr(x)],H(x)=[h1(x),⋯,hs(x)],K(x)=[k1(x),⋯,kt(x)]Matlab 中可以直接利用 max,min,sum 函数,则以增广目标函数
P
(
x
,
M
)
P(\bm{x}, M)
P(x,M) 为目标函数的无约束极值问题
min
P
(
x
,
M
)
\min P(\bm{x}, M)
minP(x,M) 的最优解
x
x
x 也是原问题的最优解。
若非线性规划问题要求实时算法,则可使用罚函数方法,但计算精度较低。若不要求实时算法,但要求精度较高,可使用Lingo软件求解或使用MATLAB的fmincon命令求解。
3.3.3 MATLAB求约束极值问题
在MATLAB优化工具箱中,用于求解约束优化问题的函数除了已经介绍的fmincon和quadprog,还有fminbnd、fseminf、fminimax。
- fminbnd函数:求解单变量非线性函数在区间上的最小值 min x f ( x ) , x ∈ [ x 1 , x 2 ] \min_x f(x)\ ,x\in[x_1,x_2] xminf(x) ,x∈[x1,x2]
[x,fval]=fminbnd(fun,x1,x2,options) %fun为用M文件定义的函数、匿名函数或MATLAB中的单变量数学函数
- fseminf函数:求解 min f ( x ) s.t. { A ⋅ x ⩽ b A e q ⋅ x = b e q c ( x ) ⩽ 0 c e q ( x ) = 0 l b ⩽ x ⩽ u b K i ( x , w i ) ⩽ 0 , 1 ⩽ i ⩽ n \min f(\bm{x})\\ \text{s.t.}\begin{cases} \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\c(\bm{x})\leqslant0\\ceq(\bm{x})=0\\ lb \leqslant\bm{x}\leqslant ub\\ K_i(\bm{x},w_i)\leqslant0\ ,1\leqslant i\leqslant n \end{cases} minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧A⋅x⩽bAeq⋅x=beqc(x)⩽0ceq(x)=0lb⩽x⩽ubKi(x,wi)⩽0 ,1⩽i⩽n式中 K i ( x , w i ) K_i(\bm{x},w_i) Ki(x,wi)为标量函数, w 1 , ⋯ , w n w_1,\cdots,w_n w1,⋯,wn为附加的变量。
[x,fval]=fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
%ntheta为半无穷约束Ki的个数,函数seminfcon用于定义函数c,ceq,Ki
- fminimax函数:求解 min x max i F i ( x ) s.t. { A ⋅ x ⩽ b A e q ⋅ x = b e q c ( x ) ⩽ 0 c e q ( x ) = 0 l b ⩽ x ⩽ u b \min_x \max_i\ F_i(\bm{x})\\ \text{s.t.}\begin{cases} \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\c(\bm{x})\leqslant0\\ceq(\bm{x})=0\\ lb \leqslant\bm{x}\leqslant ub \end{cases} xminimax Fi(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧A⋅x⩽bAeq⋅x=beqc(x)⩽0ceq(x)=0lb⩽x⩽ub
[x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
3.3.4 MATLAB优化工具箱的用户图形界面
MATLAB的optimtool命令提供了优化问题的图形界面解法,可应用到所有优化问题的求解,计算结果可以输出到MATLAB工作空间中。
4. 目标规划
线性规划只能解决一组线性约束条件下,一个目标的最大值或最小值问题。在实际决策中,衡量方案优劣要考虑多个目标。目标规划的求解思路有两种:
- 加权系数法:为每一个目标赋一个权系数,把多目标模型转化成单一目标的模型。
- 优先等级法:将各目标按其重要程度不同的优先等级,转化为单目标模型。
目标规划中没有最优解的概念,只有满意解,由决策者来确定选取哪一个解,若满意解数目太多则难以全部求出。
4.1 目标规划的数学模型
目标规划用于解决多目标决策问题,其数学模型有关的概念如下。
4.1.1 正、负偏差变量
设
f
i
(
i
=
1.
⋯
,
l
)
f_i(i=1.\cdots,l)
fi(i=1.⋯,l)为第i个目标函数,它的正偏差变量
d
i
+
=
max
(
f
i
−
d
i
0
,
0
)
d_i^+=\max(f_i-d_i^0,0)
di+=max(fi−di0,0)表示决策值超过目标值的部分,负偏差变量
d
i
+
=
−
min
(
f
i
−
d
i
0
,
0
)
d_i^+=-\min(f_i-d_i^0,0)
di+=−min(fi−di0,0)表示决策值未达到目标值的部分,其中
d
i
0
d_i^0
di0表示
f
i
f_i
fi的目标值。决策值不可能既超过目标值又未达到目标值,即恒有
d
i
+
×
d
i
−
=
0
d_i^+\times d_i^-=0
di+×di−=0。
4.1.2 绝对约束和目标约束
绝对约束指必须严格满足的等式约束和不等式约束,如线性规划问题的多有约束条件,不能满足这些约束条件的解称为非可行解,又称硬约束。目标约束是目标规划特有的,可把约束右端项看作要追求的目标值,在达到此目标值时允许发生正负偏差,因此在这些约束中加入正负偏差变量,又称软约束。
4.1.3 优先因子与权系数
一个规划问题常常有若干个目标,决策者在要求达到这些目标时,是有主次之分的。要求第一位达到的目标赋予优先因子
P
1
P_1
P1,依次赋予
P
2
,
⋯
P_2,\cdots
P2,⋯,并规定
P
k
⩾
P
k
+
1
P_k\geqslant P_{k+1}
Pk⩾Pk+1。若要区别具有相同优先因子的两个目标的差别,可分别赋予它们不同的权系数
w
j
w_j
wj。
4.1.4 目标规划的目标函数
目标规划的目标函数是按各自目标约束的正负偏差变量和赋予相应优先因子而构造的。当每一目标值确定后,决策者的要求是尽可能缩小偏离目标值。因此目标规划的目标函数只能是所有偏差变量的加权和,其基本形式有三种:
- 第i个目标要求恰好达到目标值,即正负偏差变量都要尽可能地小,此时 min w i − d i − + w i + d i + \min w_i^-d_i^-+w_i^+d_i^+ minwi−di−+wi+di+
- 第i个目标要求不超过目标值,即允许达不到目标值,就是正偏差变量要尽可能地小,此时 min w i + d i + \min w_i^+d_i^+ minwi+di+
- 第i个目标要求超过目标值,即超过量不限,但必须是负偏差变量要尽可能地小,此时 min w i − d i − \min w_i^-d_i^- minwi−di−
4.1.5 目标规划的一般数学模型
设
x
j
(
j
=
1
,
⋯
,
n
)
x_j(j=1,\cdots,n)
xj(j=1,⋯,n)是目标规划的决策变量,共有m个约束是刚性约束,可能是等式约束也可能是不等式约束。设有l个柔性目标约束,其目标约束的偏差为
d
i
+
,
d
i
−
(
i
=
1
,
⋯
,
l
)
d_i^+,d_i^-(i=1,\cdots,l)
di+,di−(i=1,⋯,l)。设有q个优先级别,分别为
P
1
,
⋯
,
P
q
P_1,\cdots,P_q
P1,⋯,Pq。在同一个优先级
P
k
P_k
Pk中有不同的权重,分别记为
w
k
i
+
,
w
k
i
−
(
i
=
1
,
⋯
,
l
)
w_{ki}^+,w_{ki}^-(i=1,\cdots,l)
wki+,wki−(i=1,⋯,l)。目标规划的一般数学表达式为
min
z
=
∑
k
=
1
q
P
k
(
∑
i
=
1
l
w
k
i
−
d
i
−
+
w
k
i
+
d
i
+
)
s. t.
{
∑
j
=
1
n
a
t
j
x
j
⩽
(
=
,
⩾
)
b
t
,
t
=
1
,
⋯
,
m
∑
j
=
1
n
c
i
j
x
j
+
d
i
−
−
d
i
+
=
d
i
0
,
i
=
1
,
2
,
⋯
,
l
x
j
⩾
0
,
j
=
1
,
2
,
⋯
,
n
d
i
−
,
d
i
+
⩾
0
,
i
=
1
,
2
,
⋯
,
l
\begin{array}{l} \min z=\mathop{\sum}\limits_{k=1}^{q} P_{k}\left(\mathop{\sum}\limits_{i=1}^{l} w_{k i}^{-} d_{i}^{-}+w_{k i}^{+} d_{i}^{+}\right) \\ \text { s. t. }\left\{\begin{array}{l}\mathop{\sum}\limits_{j=1}^{n} a_{t j} x_{j} \leqslant(=, \geqslant) b_{t}, \quad t=1, \cdots, m\\ \mathop{\sum}\limits_{j=1}^{n} c_{i j} x_{j}+d_{i}^{-}-d_{i}^{+}=d_{i}^{0}, \quad i=1,2, \cdots, l \\ x_{j} \geqslant 0, \quad j=1,2, \cdots, n \\ d_{i}^{-}, d_{i}^{+} \geqslant 0, \quad i=1,2, \cdots, l \end{array}\right. \end{array}
minz=k=1∑qPk(i=1∑lwki−di−+wki+di+) s. t. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧j=1∑natjxj⩽(=,⩾)bt,t=1,⋯,mj=1∑ncijxj+di−−di+=di0,i=1,2,⋯,lxj⩾0,j=1,2,⋯,ndi−,di+⩾0,i=1,2,⋯,l
4.2 求解目标规划的序贯算法
序贯算法的核心是根据优先级的先后次序,将目标规划问题分解成一系列的单目标规划问题,然后以此求解。对于
k
=
1.
⋯
,
q
k=1.\cdots,q
k=1.⋯,q,求解单目标规划
min
z
=
∑
i
=
1
l
(
w
k
i
−
d
i
−
+
w
k
i
+
d
i
+
)
s. t.
{
∑
j
=
1
n
a
t
j
x
j
⩽
(
=
,
⩾
)
b
t
,
t
=
1
,
⋯
,
m
∑
j
=
1
n
c
i
j
x
j
+
d
i
−
−
d
i
+
=
d
i
0
,
i
=
1
,
2
,
⋯
,
l
∑
i
=
1
l
(
w
s
i
−
d
i
−
+
w
s
i
+
d
i
+
)
⩽
z
s
∗
,
s
=
1
,
2
,
⋯
,
k
−
1
(
4
)
x
j
⩾
0
,
j
=
1
,
2
,
⋯
,
n
d
i
−
,
d
i
+
⩾
0
,
i
=
1
,
2
,
⋯
,
l
\begin{array}{l} \min z=\mathop{\sum}\limits_{i=1}^{l} (w_{k i}^{-} d_{i}^{-}+w_{k i}^{+} d_{i}^{+}) \\ \text { s. t. }\left\{\begin{array}{l}\mathop{\sum}\limits_{j=1}^{n} a_{t j} x_{j} \leqslant(=, \geqslant) b_{t}, \quad t=1, \cdots, m\\ \mathop{\sum}\limits_{j=1}^{n} c_{i j} x_{j}+d_{i}^{-}-d_{i}^{+}=d_{i}^{0}, \quad i=1,2, \cdots, l \\ \mathop{\sum}\limits_{i=1}^{l} (w_{s i}^{-} d_{i}^{-}+w_{s i}^{+} d_{i}^{+})\leqslant z_s^*, \quad s=1,2, \cdots, k-1\quad(4)\\ x_{j} \geqslant 0, \quad j=1,2, \cdots, n \\ d_{i}^{-}, d_{i}^{+} \geqslant 0, \quad i=1,2, \cdots, l \end{array}\right. \end{array}
minz=i=1∑l(wki−di−+wki+di+) s. t. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧j=1∑natjxj⩽(=,⩾)bt,t=1,⋯,mj=1∑ncijxj+di−−di+=di0,i=1,2,⋯,li=1∑l(wsi−di−+wsi+di+)⩽zs∗,s=1,2,⋯,k−1(4)xj⩾0,j=1,2,⋯,ndi−,di+⩾0,i=1,2,⋯,l其最优目标值为
z
k
∗
z_k^*
zk∗,当k=1是,式(4)为空约束。当k=q时,
z
q
∗
z_q^*
zq∗所对应的解
x
∗
x^*
x∗为目标规划的解。
若求解到
k
=
k
∗
<
q
k=k^*<q
k=k∗<q时,解集就为空集,说明第
k
∗
k^*
k∗个目标时无法实现的。