第一章: 介绍
优化的主要流程:
- 确定优化目标 (可以是利润、时间、能量或任何可用数表示的量)
- 确定约束条件 (可以是无约束, 可以是有约束)
- 根据模型选取或构建算法
- 实施算法并检验是否满足最优性条件
- 改进模型并重复前述直至满意 (灵敏度分析、对之前解的解释说明)
1. 符号规定
- x x x 为变量构成的向量, 也称为未知量或参数;
- f f f 为目标函数, 为 x x x的(标量)函数, 我们的目的在于最大或最小化 f f f;
- c i c_i ci为约束函数, 为 x x x的标量函数, 定义 x x x必须满足的等式或不等式
从而一个优化问题可以写成
min
x
∈
R
n
f
(
x
)
s
u
b
j
e
c
t
  
t
o
c
i
(
x
)
=
0
,
i
∈
E
,
c
i
(
x
)
≥
0
,
i
∈
I
.
\min_{x\in\mathbb{R}^n}f(x)\quad\mathrm{subject\,\,to}\begin{array}{ll} c_i(x)=0, & i\in\Epsilon,\\ c_i(x)\ge0, & i\in I. \end{array}
x∈Rnminf(x)subjecttoci(x)=0,ci(x)≥0,i∈E,i∈I.
其中
I
I
I和
E
\Epsilon
E分别代表等式约束和不等式约束的指标集.
例. 运输问题. 化学用品公司有两所工厂
F
1
,
F
2
F_1,F_2
F1,F2和十二个零售商
R
1
,
R
2
,
…
,
R
12
R_1,R_2,\ldots,R_{12}
R1,R2,…,R12. 工厂
F
i
F_i
Fi每周可以生产化学用品
a
i
a_i
ai吨, 而零售商
R
j
R_j
Rj每周需要
b
j
b_j
bj吨化学用品. 从
F
i
F_i
Fi运一吨化学用品到
R
j
R_j
Rj的花费为
c
i
j
c_{ij}
cij. 我们的目标是在满足所有零售商的需求后, 最小化运输成本. 引入变量
x
i
j
,
i
=
1
,
2
,
j
=
1
,
…
,
12
x_{ij},i=1,2,j=1,\ldots,12
xij,i=1,2,j=1,…,12, 其中
x
i
j
x_{ij}
xij为从
F
i
F_i
Fi运至
R
j
R_j
Rj的运输量(吨). 于是问题可写作
min
∑
i
j
c
i
j
x
i
j
s
u
b
j
e
c
t
  
t
o
∑
j
=
1
12
x
i
j
≤
a
i
,
i
=
1
,
2
,
∑
i
=
1
2
x
i
j
≥
b
j
,
j
=
1
,
…
,
12
,
x
i
j
≥
0
,
i
=
1
,
2
,
j
=
1
,
…
,
12.
\begin{array}{rll} \min & \sum\limits_{ij}c_{ij}x_{ij} & \\ \mathrm{subject\,\,to} & \sum\limits_{j=1}^{12}x_{ij}\le a_i, & i=1,2,\\ & \sum\limits_{i=1}^2x_{ij}\ge b_j, & j=1,\ldots,12,\\ & x_{ij}\ge0, & i=1,2,\quad j=1,\ldots,12. \end{array}
minsubjecttoij∑cijxijj=1∑12xij≤ai,i=1∑2xij≥bj,xij≥0,i=1,2,j=1,…,12,i=1,2,j=1,…,12.
上面的问题为典型的线性规划问题 (目标函数和约束都是线性的). 当然对于实际情景下, 还可能涉及到生产和仓储的费用, 以及运输可能存在打折. 此时将可能得到非线性规划问题.
2. 问题分类
- 连续优化 & 离散优化: 后者决定性的特征就是未知量 x x x可取自有限集. 例如整数型变量、二值变量, 甚至可能是集合的排序作为未知量 (比如会议安排问题).
- 约束优化 & 无约束优化.
- 全局优化 & 局部优化: 前者对于一般的问题难以做到, 全局最优点也难以识别.
- 随机优化 & 确定性优化.
- 凸优化 & 非凸优化: 前者指的是, 目标函数
f
f
f为凸函数, 且可行域为凸集的情形, 此时任一局部最优解都是全局最优解. 具体说来需要
- 等式约束函数 c i ( ⋅ ) , i ∈ E c_i(\cdot), i\in\Epsilon ci(⋅),i∈E线性, 以及
- 不等式约束函数 c i ( ⋅ ) , i ∈ I c_i(\cdot),i\in I ci(⋅),i∈I为凹函数.
3. 优化算法
优化算法是迭代进行的.
算法的差别在于产生新的迭代点的策略. 大多数策略会使用目标函数 f f f的值, 约束函数 c i c_i ci的值, 以及可能会用到这些函数的一阶导和二阶导. 有些算法会积攒之前迭代所获得的信息, 其他的算法可能就只使用当前迭代点上得到的信息. 当然对于算法好坏与否, 我们有如下判定准则:
- 鲁棒性 (Robustness). 这点可使得算法得以广泛使用.
- 高效性 (Efficiency). 这里考虑时间复杂度和空间复杂度.
- 准确性 (Accuracy). 对各类误差 (如舍入误差、测量误差)不会过于敏感.
这些目标看上去可能会互相矛盾. 比如说, 收敛速度很快的算法可能需要较大的内存支撑 (比如Newton法). 再比如, 最强健的算法可能是收敛最慢的. 我们可根据问题来选择算法, 找出自己的侧重点. 算法没有绝对的好与坏.