列生成算法在分布式计算任务分配问题中的应用示例
题目描述:
考虑一个分布式计算系统,有 \(m\) 台异构服务器(资源不同),需要处理 \(n\) 个独立计算任务。每个任务只能分配给一台服务器,但一台服务器可处理多个任务。任务 \(j\) 在服务器 \(i\) 上的处理时间 \(p_{ij}\) 和能耗 \(e_{ij}\) 已知。目标是分配所有任务,最小化总能耗,同时满足每台服务器的总处理时间不超过其最大可用时间 \(T_i\)。该问题可建模为整数规划,但变量规模随任务数增长而爆炸式增加,适合用列生成算法求解。
解题步骤
1. 问题建模
- 主问题(Restricted Master Problem, RMP):
设 \(x_{ij}\) 为二进制变量,表示任务 \(j\) 是否分配给服务器 \(i\)。直接建模为:
\[ \min \sum_{i=1}^m \sum_{j=1}^n e_{ij} x_{ij} \]
约束:
- 每个任务必须被分配:\(\sum_{i=1}^m x_{ij} = 1, \quad \forall j=1,\dots,n\)。
- 服务器时间限制:\(\sum_{j=1}^n p_{ij} x_{ij} \leq T_i, \quad \forall i=1,\dots,m\)。
- \(x_{ij} \in \{0,1\}\)。
- 列生成重构:
将问题转化为集合划分模型:- 每一列对应一个“任务分配模式”,即一台服务器 \(i\) 上的一组任务分配方案。
- 设 \(\lambda_k\) 为二进制变量,表示是否选择第 \(k\) 个分配模式。
- 主问题变为:
\[ \min \sum_k c_k \lambda_k \]
约束:
1. 每个任务被分配一次:$\sum_k a_{jk} \lambda_k = 1, \quad \forall j$($a_{jk}=1$ 表示模式 $k$ 包含任务 $j$)。
2. 每台服务器最多选一个模式:$\sum_{k \in K_i} \lambda_k \leq 1, \quad \forall i$($K_i$ 是服务器 $i$ 的模式集合)。
3. $\lambda_k \in \{0,1\}$。
但模式数量巨大,因此仅保留部分模式构建 RMP,通过子问题动态生成新模式。
2. 列生成流程
步骤 1:初始化 RMP
为每台服务器 \(i\) 生成初始可行模式(例如,只分配一个任务),构建 RMP 的线性松弛(允许 \(\lambda_k \geq 0\))。
步骤 2:求解 RMP 线性松弛
得到最优解和对偶变量:
- \(\pi_j\):对应任务约束 \(\sum_k a_{jk} \lambda_k = 1\) 的对偶值。
- \(\mu_i\):对应服务器约束 \(\sum_{k \in K_i} \lambda_k \leq 1\) 的对偶值。
步骤 3:子问题(定价问题)
为每台服务器 \(i\) 求解一个子问题:
找到减少成本最小的新模式(即任务子集 \(S \subseteq \{1,\dots,n\}\)),其成本为:
\[\text{减少成本} = \sum_{j \in S} e_{ij} - \sum_{j \in S} \pi_j - \mu_i \]
约束:\(\sum_{j \in S} p_{ij} \leq T_i\)。
这等价于一个背包问题:任务 \(j\) 的价值为 \(\pi_j - e_{ij}\),重量为 \(p_{ij}\),容量为 \(T_i\),目标是最大化总价值(因为最小化减少成本等价于最大化 \(\sum_{j \in S} (\pi_j - e_{ij}) + \mu_i\))。
步骤 4:终止条件
若所有服务器的减少成本均非负(即无改进模式),则当前 RMP 线性松弛已最优。否则,将减少成本为负的模式加入 RMP,返回步骤 2。
步骤 5:整数解处理
得到线性松弛最优解后,若 \(\lambda_k\) 不全为整数,需结合分支定界法(生成整数解),此时称为分支定价。
3. 实例演示
假设 \(m=2\) 台服务器,\(n=3\) 个任务,数据如下:
- 服务器时间限制:\(T_1=10, T_2=8\)。
- 处理时间 \(p_{ij}\) 和能耗 \(e_{ij}\):
\[ p_{ij} = \begin{bmatrix} 3 & 4 & 5 \\ 2 & 3 & 6 \end{bmatrix}, \quad e_{ij} = \begin{bmatrix} 2 & 3 & 4 \\ 1 & 2 & 3 \end{bmatrix}. \]
具体步骤:
- 初始模式:为每台服务器生成单任务模式(共6个),例如模式1:服务器1仅处理任务1(成本2),模式2:服务器1仅处理任务2(成本3),依此类推。
- 第一次 RMP 求解:
- 得到对偶值 \(\pi_1=2, \pi_2=2, \pi_3=3, \mu_1=0, \mu_2=0\)。
- 子问题求解:
- 服务器1的背包问题:任务价值为 \(\pi_j - e_{1j} = [0, -1, -1]\),无正价值,无新模式。
- 服务器2的背包问题:任务价值为 \([1, 0, 0]\),最优模式为仅任务1(价值1),减少成本 = \(1 - \mu_2 = 1 > 0\),无需添加。
- 终止:无负减少成本,线性松弛最优值为总能耗下限。
- 整数化:通过分支定界枚举分配方案,最终得最优解:任务1、2分配给服务器2,任务3分配给服务器1,总能耗 = \(1+2+4=7\)。
4. 关键点总结
- 列生成通过分解问题,将指数级变量转化为主问题+子问题的迭代求解。
- 子问题通常是背包问题或最短路径问题,需高效算法(如动态规划)。
- 实际应用中,需处理退化问题(如对偶值震荡)和整数解收敛挑战。