Knapsack Problem
摘自:https://zhuanlan.zhihu.com/p/136244119
1. Greedy Algorithm
- 每个问题都有多种贪婪算法
- 在遇到一个新问题时,可首先采用贪婪算法作为Baseline。
2. Modeling
(1)决策变量 (Decision Variables)
Xi定义为第 i 个物品是否被选择
- 当 Xi = 1时,代表物品被选择
- 当 Xi = 0 时,代表物品不被选择
(2)问题限制(Problem Constraint)
物品的重量不能够超过背包所能承受的重量。
$$ \sum_{i \in I} w_ix_i < K $$
(3)目标函数(Objective Function)
目标为:所有物品的总价值
$$ \sum_{i \in I} v_ix_i $$ 综上,问题定义如下:
$$ maximize \sum_{i \in I} v_ix_i $$
$$ subject\ to \sum_{i \in I} w_ix_i < K $$
$$ x_i \in \{0,1\} ( i \in I) $$
3. 动态规划(Dynamic Programming)
基本原则:
- 分而治之
- 自下而上的计算
4. 分支定界(Branch and Bound)
可将计算过程展开为一颗二叉树,每个i节点由三个元素组成:
分别是:(1)总价值。(目标)(2)总重量。(约束)(3)价值估计。
以上三者可以结合应用于剪枝过程,大幅减少计算量。其中最重要的是价值估计,这对应于松弛概念(Relaxation),松弛得越好,剪枝越有效。
搜索策略:
- depth-first, best-first, least-discrepancy
- many others
松弛和搜索是分支定界算法中最重要的主题。
打赏作者以资鼓励:
![]() | ![]() |