Dinkelbach算法

问题描述

N 个物体中选择 K 个物体,使得​​总收益与总代价比最大化​​:

maxS{1,...,N},|S|=KiSviiSci

问题转化思路

  1. ​目标函数调整
    令最优比值为
r=iSviiSci

则有

iSviriSci=0
  1. ​构造函数​
    定义辅助函数:F(r)=iSviriSci,|S|=K则该函数满足:f(0)0,f(rmax)0
    由于仅 r 一个变量因此 F(r) 在平面坐标系上体现为一条直线,每组 S 都分别唯一地对应一条直线,这些直线的截距均 0、斜率均 0。而截距的最大值就是我们要求的 R=max|S|=Kr
    ../../PHOTO/Dinkelbach算法/Dinkelbach算法-2.png|400

因此可以通过 maxF(r) 判定,若大于 0 说明 r<R 反之说明 r>R,且 maxF(R)=0

如何求 maxF(r)

那么首要的问题便是如何在给定 r 时求出

maxSF(r)s.t.|S|=K

因为 r 已知所以 virci 其实已经确定了,那么可以记 ui=virci,则选取 K 个最大的 ui 即为 maxSF(r)

二分法

../../PHOTO/Dinkelbach算法/Dinkelbach算法-3.png|400
../../PHOTO/Dinkelbach算法/Dinkelbach算法-4.png|400

Dinkelbach算法

传统二分法仅用 F(r)>0 条件调整搜索区间,但忽略了关键信息:当 F(r)>0 时,其对应的零点值本身就是更优解。
../../PHOTO/Dinkelbach算法/Dinkelbach算法-5.png|400

如图随意选取一个 r,找到当前的 maxF(r) 所在的直线,移动到 r,r 上面去,这样做甚至只要2步即可到位)

【优势】

参考

Dinkelbach是什么算法? - 知乎


© 2024 LiQ :) 由 Obsidian&Github 强力驱动