使用贪心法求解LOAD BALANCING问题
复习高级算法,顺便写个博客记录一下。
问题定义
- INPUT
- m m m 台不同的机器 M a c h i n e = { M 1 , M 2 , M 3 . . . , M m } Machine = \{M_1,M_2,M_3...,M_m\} Machine={M1,M2,M3...,Mm}
-
n
n
n 项任务
J
o
b
=
{
J
1
,
J
2
,
J
3
.
.
.
,
J
n
}
Job = \{J_1,J_2,J_3...,J_n\}
Job={J1,J2,J3...,Jn}
- 每项任务所对应的时间 { t j 1 , t j 2 , t j 3 , . . . , t j n } \{t_{j1},t_{j2},t_{j3},...,t_{jn}\} {tj1,tj2,tj3,...,tjn}
- OBJECTIVE
- 使完成所有任务的总时间最小: min max M i ∑ j ∈ M i t j \min \max _{M_i} \sum_{j \in M_i}t_j minmaxMi∑j∈Mitj
Greedy Algorithm
- 思路: 将任务指派给当前load最少的机器
- 代码:
def greedy():
# Assign job
for job in Job.jobs:
smallest = sys.maxint
chosen = None
# Chose the machine with least load
for machine in Machine.machines:
load = machine.cal_time()
if load < smallest:
smallest = load
chosen = machine
# Assign the job to the machine
chosen.assigned_jobs.append(job)
算法上确界
- 假设
T
∗
T^*
T∗是最优解,
T
T
T是由贪心算法所得到的解。令机器
M
i
M_i
Mi为运行时间是
T
T
T的机器,共执行了
k
k
k项任务。(即,
M
i
M_i
Mi是执行任务时间最长的机器)对于最优解
T
∗
T^*
T∗有如下两个不等式成立:
- 最优解大于等于所需时间最长的任务所花费的时间: T ∗ ≥ max j ∈ J o b t j T^* \geq \max _{j \in Job} t_j T∗≥maxj∈Jobtj
- 最优解大于等于所有任务的时间之和平摊到每台机器上的时间: T ∗ ≥ 1 m ∑ j ∈ J o b t j T^*\geq \frac {1}{m}\sum _{j \in Job} t_j T∗≥m1∑j∈Jobtj
- 将
M
i
M_i
Mi的任务分成两个部分:
- 除去最后一个任务的任务集合:
{
J
i
1
,
J
i
2
,
.
.
.
,
J
i
(
k
−
1
)
}
\{J_{i1},J_{i2},...,J_{i(k-1)}\}
{Ji1,Ji2,...,Ji(k−1)}
- 根据贪心法,在指派任务 J i k J_{ik} Jik时,选择当前load balance最小的机器
- 所以,该部分的时间为 T 1 = ∑ j = 1 k − 1 t j ≤ 1 m ∑ j = 1 n − 1 t j < T ∗ T_1 = \sum _{j = 1}^{k-1} t_j \leq \frac {1}{m} \sum _{j=1}^{n-1} t_j < T^* T1=∑j=1k−1tj≤m1∑j=1n−1tj<T∗.
- 最后一个任务: T 2 = J i k ≤ max j ∈ J o b t j ≤ T ∗ T_2 = J_{ik} \leq \max _{j \in Job} t_j \leq T^* T2=Jik≤maxj∈Jobtj≤T∗
- 除去最后一个任务的任务集合:
{
J
i
1
,
J
i
2
,
.
.
.
,
J
i
(
k
−
1
)
}
\{J_{i1},J_{i2},...,J_{i(k-1)}\}
{Ji1,Ji2,...,Ji(k−1)}
- 因此, T = T 1 + T 2 < 2 T ∗ T = T_1 + T_2 < 2T^* T=T1+T2<2T∗
例子
-
T
≈
2
T
∗
T \approx 2T^*
T≈2T∗的例子
考虑等号取到的情况,即,当分配最后一个任务时,所有机器的load是相同的,且最后一个任务时间等于 T ∗ T^* T∗,所以, T t o t a l = m ∗ t m i + T ∗ T_{total} = m*t_{m_i} + T^* Ttotal=m∗tmi+T∗, T = t m i + T ∗ T=t_{m_i}+T^* T=tmi+T∗。因此,有如下关系,
T ∗ ≥ 1 m T t o t a l m T ∗ ≥ m ∗ t m i + T ∗ ( m − 1 ) T ∗ ≥ m ∗ t m i m − 1 m T ∗ ≥ t m i \begin{aligned} T^* &\geq \frac{1}{m}T_{total} \\ mT^* &\geq m*t_{m_i} + T^* \\ (m-1)T^* &\geq m*t_{m_i} \\ \frac {m-1}{m}T^* &\geq t_{m_i} \end{aligned} T∗mT∗(m−1)T∗mm−1T∗≥m1Ttotal≥m∗tmi+T∗≥m∗tmi≥tmi
令 T ∗ = m T^* = m T∗=m,则 t m i ≤ m − 1 t_{m_i}\leq m-1 tmi≤m−1。即,假设有 m m m台机器, m ∗ ( m − 1 ) + 1 m*(m-1)+1 m∗(m−1)+1项任务,所对应时间为 { 1 , 1 , . . . , m } \{1,1,...,m\} {1,1,...,m}。- 贪心算法先对前 m ∗ ( m − 1 ) m*(m-1) m∗(m−1)项任务进行分配,每台机子分得 1 ∗ ( m − 1 ) 1*(m-1) 1∗(m−1)的load,再分配最后一项任务, T = m − 1 + m = 2 m − 1 T = m-1 + m = 2m - 1 T=m−1+m=2m−1
- 最优解为: T ∗ = m T^* = m T∗=m。
-
T
T
T取决于任务分配的顺序的例子
同上述例子,若贪心法先分配最后一项任务,则可获得最优解。