OSDN Git Service

feat: add fractional programming
authorIr1d <sirius.caffrey@gmail.com>
Sun, 26 Aug 2018 13:10:49 +0000 (21:10 +0800)
committerIr1d <sirius.caffrey@gmail.com>
Sun, 26 Aug 2018 13:10:49 +0000 (21:10 +0800)
docs/basic/binary.md

index 620d1b7..905a862 100644 (file)
@@ -60,4 +60,36 @@ else
 那么由于单调性,一定是二者中较大(小)的那个离最值近一些,较远的那个点对应的区间不可能包含最值,所以可以舍弃。
 
 - 如果在两侧:
-由于最值在二者中间,我们舍弃两侧的一个区间后,也不会影响最值,所以可以舍弃。
\ No newline at end of file
+由于最值在二者中间,我们舍弃两侧的一个区间后,也不会影响最值,所以可以舍弃。
+
+## 分数规划
+
+分数规划是这样一类问题,每个物品有两个代价 $c_i$,$d_i$,要求通过某种方式选出若干个,使得 $\frac{\sum{c_i}}{\sum{d_i}}$ 最大或最小。
+
+经典的例子是 最优比率环、最优比率生成树 等等。
+
+### 二分法
+
+记 $L$ 为上式的值,对这个式子做一些变换:
+
+$$L = \frac{\sum{c_i}}{\sum{d_i}}$$
+
+把分母乘过去,把一侧化为 $0$:
+
+$${\sum{d_i}} \times L - {\sum{c_i}} = 0$$
+
+即:
+
+$${\sum_{i=1}^N{d_i}} \times L - {\sum_{i=1}^N{c_i}} = 0$$
+
+$$\sum_{i=1}^N{d_i \times L - c_i} = 0$$
+
+比如说我们要求最小的 $L$,不难发现,如果 $L'$ 比 $L$ 要小,上式左端的值会更大一些。
+
+所以要求得最小的 $L$,我们要求的就变成了让上式左端最接近 $0$ 的 $L$。
+
+不难发现左端的式子是随 $L$ 变化而单调变化的,所以可以通过二分法来解决。
+
+### Dinkelbach 算法
+
+Dinkelbach 算法是每次用上一轮的答案当做新的 $L$ 来输入,不断地迭代,直至答案收敛。
\ No newline at end of file