TOPIC 1: Load Balancing Problem(1)

使用贪心法求解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 minmaxMijMitj

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)

算法上确界

  1. 假设 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 TmaxjJobtj
    • 最优解大于等于所有任务的时间之和平摊到每台机器上的时间: T ∗ ≥ 1 m ∑ j ∈ J o b t j T^*\geq \frac {1}{m}\sum _{j \in Job} t_j Tm1jJobtj
  2. 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(k1)}
      • 根据贪心法,在指派任务 J i k J_{ik} Jik时,选择当前load balance最小的机器
      • 所以,该部分的时间为 T 1 = ∑ j = 1 k − 1 t j ≤ 1 m ∑ j = 1 n − 1 t j &lt; T ∗ T_1 = \sum _{j = 1}^{k-1} t_j \leq \frac {1}{m} \sum _{j=1}^{n-1} t_j &lt; T^* T1=j=1k1tjm1j=1n1tj<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=JikmaxjJobtjT
  3. 因此, T = T 1 + T 2 &lt; 2 T ∗ T = T_1 + T_2 &lt; 2T^* T=T1+T2<2T

例子

  1. T ≈ 2 T ∗ T \approx 2T^* T2T的例子
    考虑等号取到的情况,即,当分配最后一个任务时,所有机器的load是相同的,且最后一个任务时间等于 T ∗ T^* T,所以, T t o t a l = m ∗ t m i + T ∗ T_{total} = m*t_{m_i} + T^* Ttotal=mtmi+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^* &amp;\geq \frac{1}{m}T_{total} \\ mT^* &amp;\geq m*t_{m_i} + T^* \\ (m-1)T^* &amp;\geq m*t_{m_i} \\ \frac {m-1}{m}T^* &amp;\geq t_{m_i} \end{aligned} TmT(m1)Tmm1Tm1Ttotalmtmi+Tmtmitmi
    T ∗ = m T^* = m T=m,则 t m i ≤ m − 1 t_{m_i}\leq m-1 tmim1。即,假设有 m m m台机器, m ∗ ( m − 1 ) + 1 m*(m-1)+1 m(m1)+1项任务,所对应时间为 { 1 , 1 , . . . , m } \{1,1,...,m\} {1,1,...,m}
    • 贪心算法先对前 m ∗ ( m − 1 ) m*(m-1) m(m1)项任务进行分配,每台机子分得 1 ∗ ( m − 1 ) 1*(m-1) 1(m1)的load,再分配最后一项任务, T = m − 1 + m = 2 m − 1 T = m-1 + m = 2m - 1 T=m1+m=2m1
    • 最优解为: T ∗ = m T^* = m T=m
  2. T T T取决于任务分配的顺序的例子
    同上述例子,若贪心法先分配最后一项任务,则可获得最优解。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值