负载均衡问题
问题描述:有
m
m
m个机器,
n
n
n个任务,任务
j
j
j的处理时间为
t
j
t_j
tj,每个任务只能在一台机器上连续工作,一台机器同一时间只能处理一个任务。
机器
i
i
i的负载:
L
[
i
]
=
∑
j
∈
S
[
i
]
t
j
L[i] = \sum_{j\in S[i]}t_j
L[i]=∑j∈S[i]tj,
S
[
i
]
S[i]
S[i]为分配给机器
i
i
i的任务集合
工期:
L
=
m
a
x
i
L
[
i
]
L=max_iL[i]
L=maxiL[i]
优化问题:寻找一个分配方案最小化工期
决策问题:是否存在一个分配方案使工期为
L
L
L
负载均衡问题是NPH问题,让分割问题
≤
p
\leq_p
≤p负载均衡问题
构造思路:
任给分割问题的实例
v
1
,
v
2
,
…
,
v
n
v_1,v_2,\dots,v_n
v1,v2,…,vn,我们构造3负载均衡的实例,即共有3台机器工作。任务
t
1
=
v
1
,
t
2
=
v
2
,
…
,
t
n
=
v
n
,
t
n
+
1
=
1
2
∑
i
v
i
t_1 = v_1,t_2=v_2,\dots,t_n=v_n,t_{n+1} = \frac{1}{2}\sum_iv_i
t1=v1,t2=v2,…,tn=vn,tn+1=21∑ivi。分割问题有解当且仅当3-负载均衡问题存在工期为
1
2
∑
i
v
i
\frac{1}{2}\sum_iv_i
21∑ivi的分配方案。
①负载均衡的2倍近似算法
贪心思路:不用排序,将任务分配给当前工期最小的机器上
两个结论
- 最优工期 L ∗ ≥ m a x j t j L^*\geq max_jt_j L∗≥maxjtj(总有一个机器要处理这个最大时间的任务)
- 最优工期 L ∗ ≥ 1 m ∑ j t j L^*\geq \frac{1}{m}\sum_jt_j L∗≥m1∑jtj(最优工期大于等于绝对平衡工期)
2倍近似度证明:
设机器
i
i
i是瓶颈机器(则
L
[
i
]
L[i]
L[i]为贪心解),任务
j
j
j是最后一个在机器
i
i
i上调度的任务(在调度前,机器
i
i
i的工期是最小的)
L
[
i
]
−
t
j
≤
L
[
k
]
L[i] -t_j \leq L[k]
L[i]−tj≤L[k],对任意
1
≤
k
≤
m
1\leq k \leq m
1≤k≤m
L [ i ] − t j ≤ 1 m ∑ k L [ k ] = 1 m ∑ j t j ≤ L ∗ L[i] -t_j \leq \frac{1}{m}\sum_kL[k] = \frac{1}{m}\sum_jt_j\leq L^* L[i]−tj≤m1∑kL[k]=m1∑jtj≤L∗
L = L [ i ] = ( L [ i ] − t j ) + t j ≤ 2 L ∗ L = L[i] = (L[i]-t_j)+t_j\leq 2L^* L=L[i]=(L[i]−tj)+tj≤2L∗
2倍界是紧的,我们可以构造一个例子,最大极限为2。
如:
m
m
m个机器,m(m-1)个长度为1的任务,1个长度为
m
m
m的任务
极限:
l
i
m
m
→
∞
2
m
−
1
m
=
2
lim_{m\rightarrow \infty}\frac{2m-1}{m}=2
limm→∞m2m−1=2
②负载均衡的
4
3
\frac{4}{3}
34倍近似算法
贪心思路:按照处理时长由大到小排序,将排序后的任务依次分配给当前工期最小的机器上。
我们只证明该算法是
3
2
\frac{3}{2}
23倍近似的
- 如果瓶颈机器只有一个任务,那么我们的算法得到的分配方案是最优的
- 如果瓶颈机器有两个及以上个任务(说明每个机器都至少有一个任务,不然需把瓶颈机器最后一个任务安排到空机器上),则 L ∗ ≥ 2 t m + 1 L^*\geq 2t_{m+1} L∗≥2tm+1(瓶颈机器至少要做两个任务,两个任务的时间总和 ≥ 2 t m + 1 \geq 2t_{m+1} ≥2tm+1)
于是我们只需证明在瓶颈机器有两个及以上个任务时,得到的解是
3
2
\frac{3}{2}
23倍近似的即可
仍设任务
j
j
j是瓶颈机器
i
i
i最后处理的任务,在瓶颈机器有两个及以上个任务时,
t
j
≤
t
m
+
1
t_j\leq t_{m+1}
tj≤tm+1,
L
∗
≥
2
t
m
+
1
≥
2
t
j
L^*\geq 2t_{m+1}\geq 2t_j
L∗≥2tm+1≥2tj,
t
j
≤
1
2
L
∗
t_j\leq\frac{1}{2}L^*
tj≤21L∗
因此: L = L [ i ] = ( L [ i ] − t j ) + t j ≤ 3 2 L ∗ L=L[i]=(L[i]-t_j)+t_j\leq \frac{3}{2}L^* L=L[i]=(L[i]−tj)+tj≤23L∗
3
2
\frac{3}{2}
23倍近似不是紧的,
4
3
\frac{4}{3}
34倍近似才是紧的,例子如下:
m
m
m个机器,
n
=
2
m
+
1
n=2m+1
n=2m+1个任务,长度为
m
,
m
+
1
,
…
,
2
m
−
1
m,m+1,\dots,2m-1
m,m+1,…,2m−1的任务各两个,长度为
m
m
m的任务1个。
L
L
∗
=
4
m
−
1
3
m
,
l
i
m
m
→
∞
4
m
−
1
3
m
=
4
3
\frac{L}{L^*} = \frac{4m-1}{3m},lim_{m\rightarrow\infty} \frac{4m-1}{3m}=\frac{4}{3}
L∗L=3m4m−1,limm→∞3m4m−1=34
中心选择问题
问题描述:给定 n n n个站点,寻找 k k k个中心,每个站点距自身最近中心的距离为 d i s t ( s i , C ) dist(s_i,C) dist(si,C),问一种中心选择方案,使最大的 d i s t ( s i , C ) dist(s_i,C) dist(si,C)尽可能的小。
几个符号标注:
d
i
s
t
(
x
,
y
)
dist(x,y)
dist(x,y):站点
x
x
x和
y
y
y之间的距离
d
i
s
t
(
s
i
,
C
)
=
m
i
n
c
∈
C
d
i
s
t
(
s
i
,
c
)
dist(s_i,C) = min_{c\in C}dist(s_i,c)
dist(si,C)=minc∈Cdist(si,c):
s
i
s_i
si到其最邻近中心的距离
r
(
C
)
=
m
a
x
i
d
i
s
t
(
s
i
,
C
)
r(C) = max_i dist(s_i,C)
r(C)=maxidist(si,C):最小覆盖半径
贪心策略:选择与当前存在的一系列中心最远的站点作为下一个中心(一开始随机选一个站点作为中心集合的第一个点)
启发式思想:每个站点尽可能分离,覆盖范围尽可能的分离,有效利用覆盖半径。
证明该算法是一个二倍近似算法,即
r
(
C
)
≤
2
r
(
C
∗
)
r(C)\leq 2r(C^*)
r(C)≤2r(C∗)
反证法,假设
r
(
C
∗
)
<
1
2
r
(
C
)
r(C^*)<\frac{1}{2}r(C)
r(C∗)<21r(C)
- 对于贪心选择的中心 c i ∈ C c_i\in C ci∈C,考虑其半径为 1 2 r ( C ) \frac{1}{2}r(C) 21r(C)的区域
- 在每个区域中有且仅有一个最优中心 c i ∗ c_i^* ci∗(若区域中不存在最优中心,则找到一个站点与最优站点距离大于 1 2 r ( C ) \frac{1}{2}r(C) 21r(C),与假设矛盾;若存在两个以上,则一定有一个区域不存在最优中心),令贪心解 c i c_i ci与 c i ∗ c_i^* ci∗对应。
- 取任意站点 s s s, c i ∗ c_i^* ci∗为站点 s s s在最优解中的最近中心, d i s t ( s , C ) ≤ d i s t ( s , c i ) ≤ d i s t ( s , c i ∗ ) + d i s t ( c i , c i ∗ ) ≤ 2 r ( C ∗ ) dist(s,C)\leq dist(s,c_i)\leq dist(s,c_i^*)+dist(c_i,c_i^*)\leq 2r(C^*) dist(s,C)≤dist(s,ci)≤dist(s,ci∗)+dist(ci,ci∗)≤2r(C∗)
因此:
r
(
C
)
≤
2
r
(
C
∗
)
r(C)\leq 2r(C^*)
r(C)≤2r(C∗)
除非
P
=
N
P
P = NP
P=NP,否则中心选择问题不存在2倍近似度以下的算法
带权顶点覆盖问题
问题描述:在顶点覆盖的条件下,满足所选顶点总权重之和最小
①竞价法
给每个边赋予一个价格
p
e
≥
0
p_e\geq0
pe≥0,任意顶点的权重大于等于与其邻接的所有边价格总和:
∑
e
=
(
i
,
j
)
p
e
≤
w
i
\sum_{e=(i,j)}p_e\leq w_i
e=(i,j)∑pe≤wi
公平引理:对于任意顶点覆盖集合
S
S
S和任意公平价格
p
e
p_e
pe,有
∑
e
p
e
≤
w
(
S
)
\sum_e p_e\leq w(S)
∑epe≤w(S)
贪心策略:只要存在一条边
e
(
i
,
j
)
e(i,j)
e(i,j)其两个端点都未饱和,则增加该边的价格,直到其中一个端点饱和为止。重复上述操作,直到找不到满足上述的边为止。
证明竞价法是一个二倍近似算法:
令
S
S
S为贪心算法终止时,所有饱和顶点的集合,易得
S
S
S为一个顶点覆盖(反证,如果某条边没有被覆盖到,则其两个端点都未饱和,算法不会终止)
证明关键:
∑
e
∈
E
p
e
≤
w
(
S
∗
)
\sum_{e\in E}p_e\leq w(S^*)
∑e∈Epe≤w(S∗)
②线性规划方法近似
带权顶点覆盖问题可以转化为整数线性规划问题
顶点覆盖问题
⇔
\Leftrightarrow
⇔带权顶点覆盖(权重设为1)
⇔
\Leftrightarrow
⇔整数线性规划(
w
i
=
1
w_i=1
wi=1)
如果我们能多项式时间解整数线性规划,则我们能多项式时间解带权顶点覆盖问题,但是整数线性规划是
N
P
H
NPH
NPH的,而一般线性规划可以多项式时间求解,因此我们用一般线性规划去近似整数线性规划的解。
证明线性规划的解取整是2倍近似的
设
x
x
x是线性规划的最优解,集合
S
=
{
i
∈
V
:
x
i
≥
1
2
}
S=\{i\in V:x_i\geq \frac{1}{2}\}
S={i∈V:xi≥21}是一个顶点覆盖,且权重不超过最优顶点覆盖权重的2倍
- 证明集合 S S S是一个顶点覆盖:对任意一条边 ( i , j ) (i,j) (i,j),由于 x i + x j ≥ 1 x_i+x_j\geq 1 xi+xj≥1,因此至少有一个值 ≥ 1 2 \geq\frac{1}{2} ≥21,即至少有一个端点在集合 S S S中,因此集合 S S S是一个顶点覆盖。
- 集合
S
S
S权重不超过最优顶点覆盖权重的2倍:
∑ i ∈ S ∗ w i x i ∗ ≥ ∑ i ∈ S w i x i ≥ 1 2 ∑ i ∈ S w i \sum_{i\in S^*}w_ix_i^*\geq \sum_{i\in S}w_ix_i\geq\frac{1}{2}\sum_{i\in S}w_i i∈S∗∑wixi∗≥i∈S∑wixi≥21i∈S∑wi
中间项为没有整数限制的一般线性规划的解(没有近似的),最后一项表示近似后的权重和
除非
P
=
N
P
P=NP
P=NP,不然没有近似度<1.3606的算法,即使所有权重都设为1
一般化的负载均衡
问题描述:增加了任务只能在授权机器上进行处理,仍然是一个任务只能在一台机器上连续工作,求最小化工期的任务分配方案
一般化的负载均衡可以与整数线性规划等价,当用一般线性规划近似时,问题含义会发生变化,即一个任务可以分成多片在不同授权机器上运行
x
i
j
x_{ij}
xij表示机器
i
i
i处理任务
j
j
j所用的时间
根据上述一般线性规划的解
x
x
x,我们可以构造一个无环图
G
G
G。如果
G
G
G有环,我们也可以通过流转换的形式,将其转换成一个等价的无环图的形式。
构造思路:选任意一个机器作为根节点,若
x
i
j
>
0
x_{ij}>0
xij>0,则机器
i
i
i和任务
j
j
j之间存在一条边。
从上述无环图中,我们按照以下规则得到近似的分配方案(相当于线性规划的取整操作):
- 如果任务 j j j是叶子节点,则将其分配给父亲节点的机器 i i i(相当于单授权节点)
- 如果任务 j j j是非叶子节点,则将其分配给它随机的一个孩子节点机器(相当于可多授权节点)
两个事实:
- 任意一个任务的处理时长小于等于最优工期,即
t
j
≤
L
∗
t_j\leq L^*
tj≤L∗,因为
t
j
≤
m
a
x
j
t
j
≤
L
∗
t_j\leq max_jt_j\leq L^*
tj≤maxjtj≤L∗
因为最大时间的任务总要被某个机器处理,工期至少为最大时间的任务 - 叶子节点,表示能够处理该任务的机器只有一台,因此线性规划对应的解 x i j = t j x_{ij}=t_j xij=tj,因为需要满足 ∑ i x i j = t j \sum_i x_{ij} = t_j ∑ixij=tj,且只有一项参与求和。
对于叶子结点:
对于非叶子节点:
综上全局负载:
L
i
≤
2
L
∗
L_i \leq 2L^*
Li≤2L∗
补充:通过流思想将有环图转化成无环图
将
x
i
j
x_{ij}
xij看成任务
j
j
j流向机器
i
i
i的流,任务指向机器的链路容量设置为
∞
\infty
∞,机器节点到宿点的链路容量设置为
L
L
L,即最大工期。每个任务节点
j
j
j的出口流量之和为
t
j
t_j
tj,最终流入宿点的总流量为
∑
j
t
j
\sum_jt_j
∑jtj
如果存在环,则删除环中的一条边,调整流量(二部图抵消原则)依然满足原线性规划的约束,知道图中不存在环为止。
运行时间:
对于线性规划而言,我们需要
x
i
j
x_{ij}
xij和
L
L
L,因此一共
m
n
+
1
mn+1
mn+1个变量。
对于流网络而言,我们需要
m
+
n
+
1
m+n+1
m+n+1个节点,然后运行流算法
01背包问题
两种思路:
- 枚举物品集合、重量上限下的最大价值,一直枚举到 n n n个物品和最大重量,此时对应的最大价值为目标解
- 枚举物品集合、价值下限下的最小重量,一直枚举到 n n n个物品和满足重量约束下的最小价值,此时对应的价值为目标解
①状态转移方程
最大能达到的重量为
W
W
W,最优的时间复杂度为
O
(
n
W
)
O(nW)
O(nW)
②状态转移方程
最大能达到的价值数为
n
v
m
a
x
nv_{max}
nvmax,因此计算复杂度为
O
(
n
2
v
m
a
x
)
O(n^2v_{max})
O(n2vmax)
针对目标②我们给出相应的近似算法:
近似原则:
- 0 < ϵ < 1 0<\epsilon<1 0<ϵ<1:定义为近似程度
- v m a x v_{max} vmax是 n n n个物品中最大的价值
- θ \theta θ是放缩因子,是跟近似程度正相关的参数,定义为 θ = ϵ v m a x 2 n \theta = \frac{\epsilon v_{max}}{2n} θ=2nϵvmax,形象理解为含 k k k个0近似的大整数, k k k越大越粗糙,精度损失越大。
- 若原物品价值为 v i v_i vi,则近似价值为 v i ‾ = ⌈ v i θ ⌉ θ \overline{v_i} = \lceil\frac{v_i}{\theta}\rceil \theta vi=⌈θvi⌉θ,缩小相同倍数得到等价价值 ⌈ v i θ ⌉ \lceil\frac{v_i}{\theta}\rceil ⌈θvi⌉
我们的近似算法相当于对大价值数进行向上凑整,因此恰好等于重量约束时,会比最优解的价值总和大一些,当然比非最优解大更多。大的程度跟凑整时的近似程度有关。下式非常直观:表示近似物品价值向上凑整后大于任意可行解(最优解是可行解中最大的那个,可以直接替换成最优解)。其中的价值都是没有近似的价值,近似算法得到的只是一个物品集合,不修改原价值:
(
1
+
ϵ
)
∑
i
∈
S
v
i
≥
∑
i
∈
S
∗
v
i
(1+\epsilon)\sum_{i\in S}v_i \geq \sum_{i\in S^*}v_i
(1+ϵ)i∈S∑vi≥i∈S∗∑vi
证明过程关键步骤在如何替换
θ
\theta
θ(
θ
\theta
θ的定义)以及如何替换
v
m
a
x
v_{max}
vmax(任意解集合只放最大价值物品带入不等式)
近似算法时间复杂度
原先复杂度为
O
(
n
2
v
^
m
a
x
)
O(n^2\widehat{v}_{max})
O(n2v
max),又
v
^
m
a
x
=
⌈
v
m
a
x
θ
⌉
=
⌈
2
n
ϵ
⌉
\widehat{v}_{max} = \lceil \frac{v_{max}}{\theta}\rceil = \lceil\frac{2n}{\epsilon} \rceil
v
max=⌈θvmax⌉=⌈ϵ2n⌉,因此最优的时间复杂度为
O
(
n
3
ϵ
)
O(\frac{n^3}{\epsilon})
O(ϵn3)