Example 1 (Stone Problem)
Example 2 背包问题 (Knapsack Problem)
一个窃贼有一个大小为\(b\)的背包。他闯入一家商店,里面有\(n\)件物品。每件物品都有价值\(c_j\)和大小\(a_j\)。窃贼应该选择哪些物品来优化其盗窃行为?
令\(x_j = \begin{cases} 1,\ \text{选了第} j \text{个物品} \\ 0,\ \text{otherwise} \end{cases}\),问题可以建模为0-1整数规划模型:
\[\begin{array}{ll} \max & \sum_{j=1}^{n} c_{j} x_{j} \\ \text { s.t. } & \sum_{j=1}^{n} a_{j} x_{j} \leq b \\ & x_{j} \in\{0,1\}, j=1, \ldots, n \end{array}\]Example 3 指派问题 (Assignment Problem)
\(n\)个人可以做\(n\)项工作,每个人可以被指派去做一个工作,每个人\(i\)做工作\(j\)的成本为\(c_{ij}\)。问题是找到一个分配方法使成本最低。
令\(x_{ij} = \begin{cases} 1,\ \text{如果第} j \text{个人做工作}j \\ 0,\ \text{Otherwise} \end{cases}\),问题可以表述为
\[\begin{array}{ll} \min & \sum_{i=1}^{n}\sum_{j=1}^{n} c_{ij} x_{ij} \\ \text { s.t. } & \sum_{i=1}^{n} x_{ij}=1 ,\ i=1,\ldots,n \\ & \sum_{i=1}^{n} x_{ij}=1 ,\ j=1,\ldots,n,\ x_{ij} \in \{0,1\} \end{array}\]整数线性规划 Pure Integer Linear Programming:
\[\text{(IP)} \quad \min \{ \mathbf{c}^T \mathbf{x} \mid \mathbf{Ax \leq b, x} \in \mathbb{Z}_+^n \}\]混合0-1规划 Mixed 0-1 Programming:
\[\text{(MIP)} \quad \min \{ \mathbf{c}^T \mathbf{x} + \mathbf{h}^T \mathbf{y} \mid \mathbf{Ax + Gy \leq b}, \mathbf{x} \in \mathbb{B}^{n}, \mathbf{y} \in \mathbb{R}_{+}^{p} \}\]非线性整数规划 General (Nonlinear) Integer Programming:
\[\begin{array}{lll} \text{(NLIP)} \quad & \min f(x) \\ & \text { s.t. } g_{i}(x) \leq b_{i}, i=1, \ldots, m, \\ & \qquad x \in \mathcal{X}, \end{array}\]其中\(f\)和\(g_i, i=1, \ldots, m\)为\(\mathbb{R}^n\)上的实值函数,\(\mathcal{X}\)是\(\mathbb{Z}^n\)(\(\mathbb{R}^n\)中所有整数点的集合)的一个有限子集。
混合整数非线性规划 Mixed-Integer Nonlinear Programming:
\[\begin{array}{lll} \text{(MNLIP)} \quad & \min f(x, y) \\ & \text { s.t. } g_{i}(x, y) \leq b_{i}, i=1, \ldots, m, \\ & \qquad x \in \mathcal{X}, y \in \mathcal{Y} \end{array}\]其中\(f\)和\(g_i, i=1, \ldots, m\)为\(\mathbb{R}^{n+q}\)上的实值函数,\(\mathcal{X}\)是\(\mathbb{Z}^n\)的一个有限子集,\(\mathcal{Y}\)是\(\mathbb{R}^q\)的一个连续子集。
尽管线性规划的可行解有无数个,但是最优解只会出现在顶点上,所以单纯形法在实际应用中是有效的。
整数规划的可行解是有限个,那它的求解过程有多难呢?
一个简单直观的想法:穷举
对于石头问题和0-1背包问题,列出所有可行的点,用一个每秒能计算\(10^8\)次的超级计算机需要:
\(n=30, 2^{30} \approx 10^9, 10 \text{秒}\)
\(n=60, 2^{60} \approx 10^18, 360 \text{年}\)
\(n=100, 2^{100} \approx 10^30, 4 \times 10^{14} \text{年}\)
……
四舍五入:求解连续优化并将解四舍五入到最近的整数点。
启发式算法:贪心和局部搜索算法。
对于0-1背包问题,将利润与重量的比值排序为:\(\frac{c_{j1}}{a_{j1}} \geq \frac{c_{j2}}{a_{j2}} \geq \cdots \geq \frac{c_{jn}}{a_{jn}} \geq\),按\(j1, \ldots, jn\)的顺序选择物品,直到再加下一个物品会超过背包的总容量\(b\)。
最优解?(如果不是,则构建反例)
这不仅仅是些经验之谈,有一个完整的理论围绕着它。
Example 1 集合覆盖问题 (Set Covering Problem)
考虑一定数量的地区,问题是决定在哪里安装一套应急服务中心。对于每个可能的中心,安装服务中心的成本以及可以服务的地区都是已知的。目标是选择一组成本最低的服务中心,以便覆盖每个地区。
令\(M={1, \ldots, m}\)为地区的集合,\(N={1, \ldots, n}\)为可能的中心的集合。令\(S_j \subseteq M\)为位于\(j \in N\)的中心可以服务到的地区,\(c_j\)为它的建造费用。定义一个0-1关联矩阵\(\mathbf{A}\),其中如果\(i \in S_j\)则\(a_{ij} = 1\),否则\(a_{ij} = 0\)。令\(x_j = \begin{cases} 1, \text{ if 选了中心}j \\ 0, \text{ otherwise} \end{cases}\)。
问题可以表述为
是一个NP-hard问题。
Example 2 设施选址问题 (Facility Location Problem)
给定一组\(N = \{1, \ldots, n\}\)的潜在设施位置和一组客户\(M = \{1, \ldots, m\}\)。位于\(j\)处的设施成本为\(f_j, \text{ for} j \in N\),位于\(j\)处的设施满足客户\(i\)的需求得到利润\(c_{ij}\)。问题是选择放置设施的位置子集,然后将客户分配到这些设施,以使总利润最大化。
令\(x_j=1\),如果有一个设施在\(j\)处,否则\(x_j=0\)。令\(y_{ij}\)为客户\(i\)的需求中由j处的设施满足的比例。
问题可以表述为
Example 3 旅行商问题 (Traveling Salesman Problem, TSP)
旅行商在回家之前必须访问\(n\)个城市中的每一个。他知道每个城市之间的距离,并希望在访问所有城市时尽量减少总行程。问:他应该以什么顺序访问这些城市?
令从城市\(i\)到城市\(j\)的距离为\(c_{ij}\),令\(x_{ij} = \begin{cases} 1, \text{ 如果直接从} i \text{到} j \\ 0, \text{otherwise} \end{cases}\)。
约束:
问题可以表述为
\[\begin{array}{lllll} \min & \sum_{i=1}^n \sum_{j=1}^n c_{ij} x_{ij} \\ \text {s.t.} & \sum_{j \neq i} x_{ij} = 1, i = 1,\ldots,n \\ & \sum_{i \neq j} x_{ij} = 1, j = 1,\ldots,n \\ & \sum_{i \in S}\sum_{j \in S} x_{ij} \le |S| - 1, \forall S \subset N, 2 \le |S| \le n-1 \\ & x \in \{ 0, 1 \}^n \end{array}\]与TSP相关的一个问题是车辆路由问题(vehicle routing problem):位于中央仓库的许多车辆必须服务于地理上围绕仓库的一组客户。每辆车都有一个给定的容量,每个客户都有一个给定的需求。目标是最小化总旅行距离。
Example 4 一般指派问题 (Generalized Assignment Problem)
给定\(m\)台机器和\(n\)个作业,找到不超过机器容量最小成本分配。每个作业\(j\)需要\(a_{ij}\)单位的机器\(i\)容量\(b_i\)。
该问题可以建模为
是一个NP-hard问题。
Example 5 最小网络流 (Minimum Cost Network Flows)
Example 6 最短路径问题 (Shortest Path Problem)
Example 7 最大流问题 (Maximum Flow Problem)
Example 1 投资组合优化 (Portfolio Optimization)
Example 2 最大割 (Maximum Cut)