问题定义
平行机调度问题 (负载均衡问题):记机器数量为 \(m\) ,工件数量为 \(n\) ,\(x_{ij}\) 表示第 \(j\) 个工件是否安排在机器 \(i\) 上,\(P_{ij}\) 表示第 \(j\) 个工件在机器 \(i\) 上的负载。求完成所有工件需要的最少负载 \(T\) 。整数规划为:
\[ \begin{align*} \min \ &T\\\\ \sum_{j=1}^nP_{ij}x_{ij}\le T,&\ i=1,...,m\\\\ \sum_{i=1}^mx_{ij}= 1,&\ j=1,...,n\\\\ x_{ij} =& \{0,1\} \end{align*} \]
直接将整数规划转化为线性规划的结果并不好:
如: \(m\) 个机器, ⼀个工件,其⻓度为
\(m\) 则整数规划的解为,
这个工件放到⼀个机器上, \(T=m\);⽽线性规划的解为: 拆分工件到 \(m\) 个机器,$
T=1$。线性规划给出的下界太松。
参数修剪的线性规划
- 得到初始的负载 \(T_0\) :可以将所有工件放到⼀个机器上或者⽤ greedy 算法将每个工件放到 最⼩的机器,满足 \(T_0\le \sum_{i,j} P_{ij}\le mn P_\max\)
- 从 \(T_0\) 开始对 \(T\) 进行二分查找:若\(P_{ij} > T\),则加入 \(x_{ij} = 0\) 的约束【这个约束的含义是:当第
\(j\) 个工件在第 \(i\) 个机器上的负载大于总负载时,第 \(j\) 个工件不可能放在第 \(i\)
个机器上工作,从而去除一些整数规划中不可能成立的解】。等价的,定义 \(S_T = \{(i,j),\vert p_{ij}\le T\}\)
,加入新约束:\(x_{ij}\ge 0,\quad (i,j)\in
S_T\), 再解线性规划判断 \(T\)
是否有可⾏解【用解线性规划两阶段法的第一阶段即可】:
- 若有可行解:对 \(T\) ⼆分变⼩后继续迭代
- 若没有可行解:对 \(T\) ⼆分变⼤后继续迭代
- 二分查找的复杂度为 \(\log n\) ,由于 \(T_0\le mn P_\max\),只需查找 \(\log m + \log n + \log P_\max\) 次即可。得到的 \(T^*\) 构成了整数规划问题的下界: \(T^*\le T_{OPT}\) 。
接下来,可以得到一个负载 \(T\le 2T^*\) 的整数解,从而得到一个近似比为 2 的近似算法。
Rounding 算法
构造二分图 \(G=(J,M,E)\),左边表示 \(m\) 台机器,右边表示 \(n\) 个工件。\(x_{ij} >0\) 则在机器 \(i\) 和工件 \(j\) 之间有⼀条边。

考虑二分图连通的情况:如果不连通,则对各连通分量分别进行算法,可以得到结果【证明见下】。
- 先考虑只分配到一个机器的工件 \(x_{ij} =
1\),将那个工件 \(j\) 分配给机器
\(i\) ,并删除工件 \(j\) 的点与 \((i,j)\) 这条边。二分图的连通性不变。
- 图中只剩下在 \(T^*\)
中分配到多个机器上的工件,考虑度为 1 的机器 \(i\), 假设唯⼀连的边为 \((i,j)\) , 那么就将整个工件 \(j\) 分配给机器 \(i\) 然后去掉机器 \(i\), 工件 \(j\) 以及 \(j\) 连的所有边。二分图连通性不变。
- 剩下的图只能有偶环 ,可以得到一个完美匹配:⼀个
工件匹配到⼀台机器
这样,每台机器除了分配到的完整工件外,最多分配到⼀个原解中拆分到包括自身在内的多个机器的工件。而根据 \(T^*\) 的求法,拆分的工件在自身的负载一定小于等于 \(T^*\) 。因此,每台机器的总负载最多为 \(2T^*\) 。
证明
记可行解 \(x\) 为 \(T^*\) 中的极点的解,\(x\) 对应的二分图为 \(G=(J,M,E)\)
\(LP(T)\) 问题的极点中最多有 \(n+m\) 个非零变量
分析问题\(LP(T)\) :
\[ \begin{align*} \sum_{j=1}^nP_{ij}x_{ij}\le T,\ i=1,...,m\\\\ \sum_{i=1}^mx_{ij}= 1,\ j=1,...,n\\\\ x_{ij}\ge 0,\quad (i,j)\in S_T \end{align*} \]
有 \(r = \vert S_T\vert\) 个变量。可行解 \(x\) 是问题的极点,当且仅当有至少 \(r\) 个线性独立约束取等号 【在 \(r\) 维线性空间中, \(r\) 个线性无关的方程才能确定一个点】。则在第三种约束中,至少有 \(r-(n+m)\) 个约束取等号。因此,\(LP(T)\) 问题的极值点最多有 \(n+m\) 个非零变量。
\(x\) 中最多有 \(m\) 个工件被拆开
记 \(x\) 为 \(T^*\) 中的极点,在 \(x\) 中,\(n\) 个工件有 \(n_1\) 个工件没有拆分 [对应 1 个非零变量], \(n_2\) 个工件拆分到不同机器上 [对应 2 个及以上非零变量]。由于最多有 \(n+m\) 个非零变量,有:
\[ \begin{cases} n_1+2n_2\le m+n \\\\ n = n_1+n_2 \end{cases} \Rightarrow n_2\le m \]
图 \(G=(J,M,E)\) 是伪森林 (pseudo-forest)
- 伪树 (pseudo-tree):一个连通图中,边的数量少于等于顶点的数量,则成图为伪树。也就是树或者树加上一条边。一棵伪树中最多只有一个环
- 伪森林 (pseudo-forest):图中每个连通分量都是伪树,则称它是伪森林
考虑 \(G\) 中的连通分量 \(G_c\) 。将 \(LP(T)\) 和 \(x\) 限制在 \(G_c\) 中的机器和工件上,得到新的问题与极点 \(LP_c(T)\) 和 \(x_c\) 。令 \(x_\bar{c}\) 代表 \(x\) 的其余部分。则,\(x_c\) 必须是 \(LP_c(T)\) 的极点: 否则,\(x_c\) 是 \(LP_c(T)\) 的两个可行解的凸组合。两个可行解分别与 \(x_\bar{c}\) 一起构成 \(LP(T)\) 的可行解。则 \(x\) 是 \(LP(T)\) 的两个可行解的凸组合,矛盾。
由于\(LP(T)\) 问题的极点中最多有 \(n+m\) 个非零变量,因此\(LP_c(T)\) 的极点形成的二分图边数少于等于顶点数。 \(G_c\) 是伪树。
将分配到一个机器的工件 (\(x_{ij} = 1\)) \(j\) 分配给机器 \(i\) ,并删除工件 \(j\) 的点与 \((i,j)\) 这条边。设当前的图为 \(H\) 【步骤1】
图 \(H\) 有一个完美匹配
由于删除了相等数量的边和顶点,因此 \(H\) 也是伪森林。
在 \(H\) 中,工件的度至少为 2。因此, \(H\) 的叶节点都是机器。接着进行步骤 2,将叶节点的机器匹配一个工件后删除机器,工件以及工件连着的所有边。此时,叶节点依然只能是机器,且图依然是伪森林。由于是二分图,最后只会剩下偶环【也有可能没有剩】。
对于偶环,可以找到一个完全匹配,将一个工件匹配到一个机器。

图源:Vijay Vazirani, Approximation Algorithms, Chapter 17,Springer Verlag, 2001.
参考文献:
- Vijay Vazirani, Approximation Algorithms, Springer Verlag, 2001.
- https://courses.engr.illinois.edu/cs598csc/sp2011/Lectures/lectures_10-11.pdf
- mcl 的笔记 : )