【ICO 组合与整数优化笔记】Introduction 导论 1
组合最优化(Combinatorial Optimization)是应用数学的一个领域,融合了组合数学、线性规划和算法理论中的方法。它一般被应用于解决离散结构(Discrete Structure)中的最优化问题。在组合最优化问题中,我们想要在有限的可行方案中找到最佳的组合方案,这样的最优解可以用图像或者表格的形式,具体地表现出来。但是,组合优化问题的难点通常在于,可行方案的数量过于庞大,简单粗暴的枚举法通常不适用。整数规划(Integer Programming)是其中一个行之有效的方法,它通过建立含有整数变量的数学模型来描述并解决组合问题。当然,整数规划问题的解决难度远远在线性规划(Linear Programming)之上,直接用优化解算器(Optimization Solver)来解决并不容易,所以在整数规划问题上,我们也需要寻求更有效率的方法。
本篇文章作为导论,将介绍几个组合与整数优化领域比较经典的实际问题,带领读者对组合优化问题有一个具体的认识。
- 背包问题 Knapsack Problem
- 旅行商问题 Traveling Salesman Problem
- 分配问题 Assignment Problem
背包问题 Knapsack Problem
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。—— [Wikipedia]
一个具体的例子:假设一个游客到某地观光,他只背了一个最大承重为3kg的背包,准备在当地的市场买一些特产回家后在自己的店内转卖,他需要在10样特产里做选择,以求转卖后的利润最大化。特产信息如下:
特产编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
利润(元) | 160 | 150 | 100 | 90 | 95 | 105 | 65 | 50 | 80 | 75 |
重量(kg) | 1 | 0.9 | 0.8 | 0.75 | 0.7 | 0.5 | 0.8 | 0.5 | 0.6 | 0.55 |
由于每件特产的利润都是正的,我们希望可以买回所有的特产,但是10件特产的总重量为7.1kg,远远超过了背包的3kg容量;单买任意一件特产则背包内仍有剩余空间可用。所以我们的最佳特产采购方案是在所有都买和只买一件的两个极端情况中间。如何确定最佳方案呢?
最直接的方法是列举出所有的可行方案,比较它们的利润大小,在其中选择最优。假设我们买与不买一件特产的决定都是互相独立的,那么我们一共有 210=1024 2 10 = 1024 种可能的方案。如果我们使用枚举法,列举出1024种方案,剔除其中总重量超过3kg的方案,在剩下的方案中选择利润最大的一个,就可以得到最优解。但是,这样简单的计算和筛选仍然有一定的成本,并且随着特产数量的增加,总方案的数量也成爆炸式的指数增长,如果我们用枚举法从50种特产中进行选择,就需要分析 250≈1.13×1015 2 50 ≈ 1.13 × 10 15 种可能方案。显然,我们需要寻找更加高效的方法来解决背包问题。
假设每件特产的重量为 wi w i ,每件特产对应的利润为 pi p i ,对于每一件特产而言,我们要做的判断是:买或不买,这是一个二选一的决定,所以我们可以引入一个二元变量(Binary Variable) xi x i ,