「Algorithm」凸优化/带权二分学习笔记
理解图像意义理解了大半天
Brief Introduction
dp凸优化和带权二分实际上是一个东西,它用来解决一类恰好选k个某种物品的最优化问题
这个最优解
与选择的物品数量
之间的关系如果用一个函数图像表示,那么这个图像是凸的。换句话说,选的物品越多时,每多选一个物品,最优解增长的速度就越慢
一般而言,在具体题目中这个物品并不好直接选出(可能的状态太多或限制不好满足),但我们可以比较快速地求出没有选择物品数量的限制下的最优解
Algorithm
考虑这样一个模型:有个物品,每个物品有一个权值(可以为负),你需要从中选出恰好个,使得选出来的物品权值和尽量大
显然可以直接排序,但是这只是一个模型,真正题目中物品并不好直接选出。这里我们考虑一种另外的做法
假设没有选择物品的限制,当每个物品的价值越大时,最优情况下选出的物品就越多;每个物品价值越小时,最优情况下选出的物品越少
换句话说,把每个物品的权值都加上一个,那么越大,选出的物品就会越多;越小,选出的物品就越少
考虑这样一个做法:
二分,计算出此时无个数限制下的答案,以及得到这个答案选择了多少个物品
用此时选出来的物品数与实际需要的物品数做比较,调整二分的边界
以上基本把凸优化的做法讲完了,感性理解一下很有道理
但是,如果把问题抽象化,仅仅给出原函数是凸的这个条件,我们并不能严谨证明出当每个物品价值越大时,最优情况下选出的物品就越多
这一重要性质
其实单从这个角度考虑只能感性理解,严谨证明这个能够二分还需要从几何角度入手
几何意义
首先注意到一个显然的事情:把每个物品减去之后,在选择物品数目相同的情况下(假设为)的最优策略与原来的策略是一样的
在这个图像中,横坐标表示选出的物品个数,纵坐标表示最优策略下选出来的物品价值
绿色的函数是原函数,紫色的函数是原函数每个点减去之后的函数(即原函数减去一个正比例函数)
图中给出的是随便一个的情况
从图像上来看,点就是当前最优策略,也就是说
设,那么,即直线的斜率就等于!(注:这是一个语气助词,不是阶乘)
此外,还有一个特别妙的性质
考虑在不断移动时,直线的斜率都为,它是不会改变的
由前面的结论我们知道,当前策略最优时,是紫色函数的最高点,即点的纵坐标最大
整理一下信息,我们知道,最优策略下直线的斜率为,截距最大,且直线与原函数有交点
不难发现,直线就是过原函数点的切线斜率!
又因为原函数是凸的,所以我们可以二分!(注:这依旧不是阶乘)
直到这里,我们才严谨证明出前面的内容,这也就是原函数需要是凸的的原因
Problem & Code
咕咕咕