0/1分数与最优比率生成树
分数问题为
m
i
n
λ
=
f
(
x
)
=
a
(
x
)
b
(
x
)
(
x
ϵ
S
)
min\lambda=f(x)=\frac{a(x)}{b(x)}(x\epsilon S)
minλ=f(x)=b(x)a(x)(xϵS)
其中 x是向量。
我们需要求向量X以使得
λ
\lambda
λ最小。
现在看这样一个问题,一个图中,每个边都由两个权值分别是cost花费和value收益,我们现在需要让
∑
i
ϵ
V
v
a
l
u
e
i
∑
i
ϵ
V
c
o
s
t
i
=
λ
\frac{\sum_{i\epsilon V}{value_i}}{\sum_{i\epsilon V}{cost_i}}=\lambda
∑iϵVcosti∑iϵVvaluei=λ
最小(最小一样)
其中V是图中一个生成树的点的集合
现在设
x
i
x_i
xi取值为0和1,代表第i个边选择与不选,一会我们所求的所有i共同构成一个生成树,所以简化下,去掉公式中的
i
ϵ
V
i\epsilon V
iϵV变成
(1)
∑
v
a
l
u
e
i
∗
x
i
∑
c
o
s
t
i
∗
x
i
=
λ
\frac{\sum{value_{i}*x_i}}{ \sum{cost_i*x_i}}=\lambda \tag{1}
∑costi∗xi∑valuei∗xi=λ(1)
现在设函数
f
(
r
)
=
∑
v
a
l
u
e
i
∗
x
i
−
r
∗
∑
c
o
s
t
i
∗
x
i
f(r) = \sum{value_i*x_i}-r*\sum{cost_i}*x_i
f(r)=∑valuei∗xi−r∗∑costi∗xi
自变量为r
其中函数
f
(
x
)
f(x)
f(x)单调递减
现在我们令
f
(
x
)
=
0
f(x)=0
f(x)=0此时r就是我们希望求得
λ
\lambda
λ
所以现在我们考虑,给定一组
x
i
x_i
xi总能找到一个
r
r
r使得
f
(
r
)
=
0
f(r)=0
f(r)=0(一次函数嘛,很容易理解),那么此时得
r
r
r就是我们希望求得
λ
\lambda
λ,当然此时得
λ
\lambda
λ不一定满足最小条件,但最起码它符合等式(1),那么我们如何求使得
r
r
r最小呢,(已下得
λ
\lambda
λ和
r
r
r是一回事儿)考虑使用二分问题求解,我们可以想到如果我们给定一个
λ
\lambda
λ太小,比
λ
m
i
n
\lambda_{min}
λmin都小(尽管我们没有求出来
λ
m
i
n
\lambda_{min}
λmin,但它一定存在),那么无论
x
i
x_i
xi集合如何取值,
f
(
f(
f(\lambda
)
>
0
)>0
)>0恒成立,所以此时我们要让
λ
\lambda
λ变大一些,如果
λ
>
λ
m
a
x
\lambda> \lambda_{max}
λ>λmax,那么无论
x
i
x_i
xi取什么集合,f(
λ
\lambda
λ)<0恒成立,此时很显然要让
λ
\lambda
λ变小一些,如果
λ
\lambda
λ正好使得使得
f
(
λ
)
=
0
f(\lambda)=0
f(λ)=0,那么此时我们让
λ
\lambda
λ在变大一些,看看能不能新得
λ
\lambda
λ满足等式(1),如果满足就再增大,所以我们可以根据二分来求解此问题。
再看一个几何解释。我们任意给定一组
x
i
x_i
xi,那么原函数
f
(
x
)
f(x)
f(x)为一个一次函数,现在我们给定很多组
x
i
x_i
xi
如下图
现在我们知道每条直线与x轴得交点值即为每一个生成树得
∑
i
ϵ
V
v
a
l
u
e
i
∑
i
ϵ
V
c
o
s
t
i
=
λ
\frac{\sum_{i\epsilon V}{value_i}}{\sum_{i\epsilon V}{cost_i}}=\lambda
∑iϵVcosti∑iϵVvaluei=λ 值(也就是把相应得那个生成树的value相加除以cost相加)我们想要求得最大的
λ
\lambda
λ也就是图上最右边的那条直线与x轴的交点,现在我们令L=0,R=inf,mid=(L+R)/2,我们把mid带入到每条直线上去,也就是
f
(
m
i
d
)
f(mid)
f(mid),选择
f
(
m
i
n
)
f(min)
f(min)最大的那一条直线,然后看看
f
(
m
i
d
)
f(mid)
f(mid)是否大于0,
- 如果 f ( m i d ) > 0 f(mid)>0 f(mid)>0,说明此时mid有些小,存在更大的 λ > \lambda> λ>mid,令L=mid
- 如果 f ( m i d ) < 0 f(mid)<0 f(mid)<0,说明此时mid有些大,所有生成树集合的 λ \lambda λ值都不能达到这么大,令R=mid
- 若果 f ( m i d ) = 0 f(mid)=0 f(mid)=0,此时就是原问题的最优解
现在考虑给定一个mid,如何求得最大的那根直线的
f
(
m
i
n
)
f(min)
f(min),所以给定一个
λ
\lambda
λ我们要求最大的
f
(
λ
)
f(\lambda)
f(λ),也就是
m
a
x
(
f
(
λ
)
)
=
m
a
x
(
∑
v
a
l
u
e
i
∗
x
i
−
r
∗
∑
c
o
s
t
i
∗
x
i
)
max(f(\lambda))=max(\sum{value_i*x_i}-r*\sum{cost_i}*x_i)
max(f(λ))=max(∑valuei∗xi−r∗∑costi∗xi)
m
a
x
(
∑
v
a
l
u
e
i
∗
x
i
−
r
∗
∑
c
o
s
t
i
∗
x
i
)
=
m
a
x
(
∑
(
v
a
l
u
e
i
−
r
∗
c
o
s
t
i
)
∗
x
i
)
max(\sum{value_i*x_i}-r*\sum{cost_i}*x_i)=max(\sum{(value_i-r*cost_i)*x_i})
max(∑valuei∗xi−r∗∑costi∗xi)=max(∑(valuei−r∗costi)∗xi),因为每一组
x
i
x_i
xi都是一个最小生成树的集合,所以我们只需要设
w
i
−
v
a
l
u
e
i
−
r
∗
c
o
s
t
i
w_i-value_i-r*cost_i
wi−valuei−r∗costi,然后再用
w
i
w_i
wi当作图中边的权值构建最小生成树,最小生成树的权值和就是最后的
m
a
x
(
f
(
λ
)
)
max(f(\lambda))
max(f(λ))。
DinkelBach定理
我们现在考虑一种替代二分的方法,如果
m
a
x
f
(
λ
)
>
0
maxf(\lambda)>0
maxf(λ)>0,那么我我们直接将那条直线的横截距赋值给
λ
\lambda
λ是收敛速度更快呢?如果
m
a
x
f
(
λ
)
<
0
maxf(\lambda)<0
maxf(λ)<0,那么我们任何让横截据赋值给
λ
\lambda
λ,那么
λ
\lambda
λ仍然能够变小和二分的效果一样,所以我们可以考虑每次把横截据赋值给
λ
\lambda
λ直到
λ
\lambda
λ不变为止。