0x39_01分数规划

0x39 0/1 分数规划

0/1分数规划模型是指,给定整数 a1,a2,,ana_1,a_2,\dots ,a_n 以及 b1,b2,,bnb_{1},b_{2},\dots ,b_{n} ,求一组解 xix_{i} (1in,xi=0(1\leq i\leq n,x_{i} = 0 或1),使下式最大化:

i=1naixii=1nbixi\frac {\sum_ {i = 1} ^ {n} a _ {i} * x _ {i}}{\sum_ {i = 1} ^ {n} b _ {i} * x _ {i}}

通俗地说,就是给定 nn 对整数 ai,bia_{i}, b_{i} ,从中选出若干对,使选出的数对的 aa 之和与 bb 之和的商最大。

我们不妨随便猜测一个值 LL ,然后考虑这样一个问题:是否存在一组解 {x1,x2,,xn}\{x_{1}, x_{2}, \dots, x_{n}\} 满足 i=1n(aiLbi)xi0\sum_{i=1}^{n}(a_{i} - L * b_{i}) * x_{i} \geq 0

  1. 如果存在一组解,使得 i=1n(aiLbi)xi0\sum_{i=1}^{n}(a_i - L * b_i) * x_i \geq 0 ,那么变形得 (i=1naixi)L(i=1nbixi)0(\sum_{i=1}^{n} a_i * x_i) - L * (\sum_{i=1}^{n} b_i * x_i) \geq 0 。进一步可知:

{x1,x2,,xn},使 得i=1naixii=1nbixiL\exists \{x _ {1}, x _ {2}, \dots , x _ {n} \}, \text {使 得} \frac {\sum_ {i = 1} ^ {n} a _ {i} * x _ {i}}{\sum_ {i = 1} ^ {n} b _ {i} * x _ {i}} \geq L

也就是说, LL 比我们求的最大值要小。

  1. 如果对于任意一组解,都有 i=1n(aiLbi)xi<0\sum_{i=1}^{n}(a_i - L * b_i) * x_i < 0 ,那么同理可知

{x1,x2,,xn},都 有i=1naixii=1nbixi<L\forall \{x _ {1}, x _ {2}, \dots , x _ {n} \}, \text {都 有} \frac {\sum_ {i = 1} ^ {n} a _ {i} * x _ {i}}{\sum_ {i = 1} ^ {n} b _ {i} * x _ {i}} < L

也就是说, LL 比我们求的最大值要大。

这与“二分答案”的情形非常相似。虽然最终的答案是未知的,但是如果我们猜测一个值 LL ,就能通过判定“是否存在一组解满足 i=1n(aiLbi)xi0\sum_{i=1}^{n}(a_i - L * b_i) * x_i \geq 0 ”,得到 LL 应该变得更大还是更小。也就是说,这个 LL 关于“解的存在性”具有“单调性”。

如何判定“是否存在一组解满足 i=1n(aiLbi)xi0\sum_{i=1}^{n}(a_i - L * b_i) * x_i \geq 0 ”呢?我们考虑这样一个问题:给定整数 a1,a2,,an,b1,b2,,bna_1, a_2, \dots, a_n, b_1, b_2, \dots, b_n 以及 LL ,求一组解 xix_i1in1 \leq i \leq nxi=0x_i = 0 或 1),使 i=1n(aiLbi)xi\sum_{i=1}^{n}(a_i - L * b_i) * x_i 最大化。显然,只需判定这个最大值是否非负即可。

这个判定问题显然比原问题要简单得多——因为 aiLbia_{i} - L * b_{i} 可以直接被计算出来。这就等价于从 nn 个数里选出若干个,使它们的和最大。把所有的正数加起来就可以了。

综上所述,我们可以二分答案(实数)。当二分的值为 midmid 时,我们就计算 i=1n(aimidbi)xi\sum_{i=1}^{n}(a_i - mid * b_i) * x_i 的最大值,检查最大值是否非负。若非负,则令 l=midl = mid ,否则令 r=midr = mid 。当二分停止时,就得到了0/1分数规划问题的解。

0x3A节的练习中包含一道0/1分数规划的基本题目。另外,许多0/1分数规划题目与图论有所结合,0x62和0x65节还会继续探讨两道0/1分数规划的例题。

除了二分法外,0/1分数规划还有一种求解方法——Dinkelbach迭代法。学有余力的读者可以自行查阅相关资料。