列生成算法在电信网络中的QoS路由优化问题中的应用示例
1. 问题背景与描述
在现代电信网络中,数据流(如视频、语音通话)需要在多个节点(路由器/交换机)组成的网络中,从源节点传输到目标节点。
不同数据流对服务质量(Quality of Service, QoS)有严格要求,例如:
- 带宽限制:每条链路有最大传输容量。
- 时延限制:端到端总时延不能超过阈值。
- 丢包率限制:路径丢包率需低于一定比例。
问题抽象:
网络用有向图 \(G = (V, E)\) 表示,其中 \(V\) 是节点集,\(E\) 是链路集。
- 每条边 \(e \in E\) 有属性:带宽容量 \(c_e\)、时延 \(d_e\)、丢包率 \(l_e\)。
- 现有 \(K\) 个数据流请求,第 \(k\) 个请求需从源节点 \(s_k\) 到目标节点 \(t_k\),要求带宽 \(b_k\)、最大时延 \(D_k\)、最大丢包率 \(L_k\)。
- 目标:为所有请求选择路径,满足各链路容量和 QoS 约束,并最小化总网络负载(或最大化网络利用率)。
2. 数学模型构建
2.1 集合与参数
- 边集合 \(E\),节点集合 \(V\)。
- 请求集合 \(K = \{1,2,\dots,|K|\}\)。
- 对请求 \(k\),其候选路径集合 \(P_k\) 包含所有从 \(s_k\) 到 \(t_k\) 的可行路径(满足 QoS 约束的简单路径)。
- 对路径 \(p \in P_k\):
- 若边 \(e\) 在路径 \(p\) 上,则指示系数 \(a_{e,p} = 1\),否则为 0。
- 路径时延 \(d(p) = \sum_{e \in p} d_e\)。
- 路径丢包率 \(l(p) = 1 - \prod_{e \in p} (1 - l_e)\)(近似为 \(\sum_{e \in p} l_e\) 若 \(l_e\) 很小)。
- 带宽需求 \(b_k\)。
2.2 决策变量
- \(x_{p}\):二进制变量,若请求 \(k\) 使用路径 \(p \in P_k\) 则为 1,否则为 0。
2.3 整数规划模型
\[\min \sum_{e \in E} y_e \]
\[ \text{s.t.} \quad \sum_{p \in P_k} x_{p} = 1, \quad \forall k \in K \]
\[ \sum_{k \in K} \sum_{p \in P_k} a_{e,p} b_k x_{p} \le c_e, \quad \forall e \in E \]
\[ x_{p} \in \{0,1\}, \quad \forall p \in P_k, \forall k \in K \]
\[ y_e \ge 0 \text{ 表示边 } e \text{ 上的总负载(可省略,此处仅为目标函数)} \]
实际上,目标可设为最小化最大链路利用率,但为简化,我们先最小化总负载。
3. 直接求解的困难
- 候选路径集合 \(P_k\) 可能指数级庞大(因为网络路径数量随节点数指数增长)。
- 无法显式列出所有变量 \(x_p\) 来求解整数规划。
列生成思想:
只考虑一部分路径(初始列),求解受限主问题(RMP),然后通过定价子问题(即寻找负检验数的列)动态生成新路径加入 RMP,迭代直至最优。
4. 列生成算法步骤
4.1 构造初始受限主问题(RMP)
初始时,为每个请求 \(k\) 选择一条最短路径(如时延最小)作为初始列,构成初始 \(P_k' \subset P_k\)。
RMP 是上述模型的线性松弛(将 \(x_p \in \{0,1\}\) 松弛为 \(x_p \ge 0\)),只包含 \(P_k'\) 中的列。
4.2 求解 RMP 并获得对偶变量
设 RMP 的约束与对偶变量对应:
- 每个请求 \(k\) 的流守恒约束 \(\sum_{p \in P_k'} x_p = 1\) 对应对偶变量 \(\mu_k\)(无约束)。
- 每条边 \(e\) 的容量约束 \(\sum_{k, p} a_{e,p} b_k x_p \le c_e\) 对应对偶变量 \(\pi_e \ge 0\)。
求解 RMP(线性规划),得到最优对偶值 \((\mu_k^*, \pi_e^*)\)。
4.3 定价子问题(寻找检验数为负的列)
在单纯形法中,一列(变量 \(x_p\))的检验数(reduced cost)为:
\[\bar{c}_p = 0 - \mu_k - \sum_{e \in E} a_{e,p} b_k (-\pi_e) \]
因为目标函数系数为 0(我们只关心可行性,目标是最小化负载,但这里可以设为 0,检查是否有更优路径)。更准确地说,我们想找检验数为负的列,即:
\[\bar{c}_p = -\mu_k + \sum_{e \in p} b_k \pi_e < 0 \]
等价于对每个请求 \(k\):
\[\min_{p \in P_k} \left\{ \sum_{e \in p} b_k \pi_e \right\} < \mu_k \]
如果上式成立,则对应路径 \(p\) 的检验数为负,应加入 RMP。
子问题:对每个请求 \(k\),在图上求从 \(s_k\) 到 \(t_k\) 的路径,使得路径权重 \(\sum_{e \in p} (b_k \pi_e)\) 最小。
这是一个最短路径问题,边权重为 \(w_e = b_k \pi_e\),可用 Dijkstra 算法求解。
4.4 检查最优性与迭代
- 对每个 \(k\),求最短路径 \(p_k^*\) 及其权重 \(W_k^* = \sum_{e \in p_k^*} b_k \pi_e\)。
- 若对所有 \(k\),有 \(W_k^* \ge \mu_k\),则无负检验数列,当前 RMP 解即原线性松弛最优解。
- 否则,将满足 \(W_k^* < \mu_k\) 的路径 \(p_k^*\) 加入对应 \(P_k'\),返回步骤 4.2。
4.5 获得整数解
列生成结束时,得到线性松弛的最优解。
但变量是分数(一个请求的流量可能拆分到多条路径),而实际中常要求单路径路由。
此时可:
- 将 RMP 限制为当前生成的列,用整数规划求解器(如分支定界)求解整数解。
- 或采用舍入启发式:选择每个请求 \(k\) 的 \(x_p\) 中最大的一个置为 1,其余为 0,再检查容量可行性。
5. 实例演示(小型网络)
考虑一个 4 节点网络:
- 边:\((1,2), (1,3), (2,3), (2,4), (3,4)\)。
- 容量 \(c_e = 10\),时延 \(d_e = 1\),丢包率 \(l_e = 0.001\)。
- 2 个请求:
\(k=1: s_1=1, t_1=4, b_1=4, D_1=3, L_1=0.01\)
\(k=2: s_2=1, t_2=4, b_2=5, D_2=3, L_1=0.01\)
步骤 1:初始路径。
- 请求 1:路径 \(p_1: 1-2-4\)(时延 2,可行)。
- 请求 2:路径 \(p_2: 1-3-4\)(时延 2,可行)。
RMP 初始列只有这两条。
步骤 2:求解 RMP 线性松弛。
约束:
- \(x_{p_1} = 1\)(请求 1 流守恒)。
- \(x_{p_2} = 1\)(请求 2 流守恒)。
- 边容量:
- 边 (1,2):\(4x_{p_1} \le 10\)(松)
- 边 (1,3):\(5x_{p_2} \le 10\)(松)
- 边 (2,4):\(4x_{p_1} \le 10\)(松)
- 边 (3,4):\(5x_{p_2} \le 10\)(松)
- 边 (2,3):0。
显然可行,最优解 \(x_{p_1}=1, x_{p_2}=1\),目标值 0。
对偶变量:设容量约束的 \(\pi_e = 0\)(因为约束不紧),流守恒约束的 \(\mu_1, \mu_2\) 任意?实际上,此时 RMP 是退化的,可固定 \(\mu_1 = \mu_2 = 0\) 作为一组最优对偶解。
步骤 3:定价子问题。
对请求 1:边权重 \(w_e = 4\pi_e = 0\),所有路径权重 0,\(W_1^* = 0\),与 \(\mu_1=0\) 相等,无负检验数。
对请求 2 类似。
因此算法终止,当前解即为线性松弛最优解。
步骤 4:整数解。
当前解已整数,且满足容量约束(链路负载分别为 4 和 5),因此得到最终解。
6. 算法扩展与注意事项
-
QoS 约束处理:
在定价子问题中,不仅要找权重最小的路径,还要满足时延、丢包约束。这变为受约束最短路径问题(CSP),可用动态规划(如 Lagrange 松弛或标签设置法)求解。 -
多商品流整合:
如果允许流量拆分,列生成后直接得到线性规划最优解。若要求单一路径,需在列生成后解整数规划。 -
加速技巧:
- 一次迭代中可为多个请求添加多条负检验数路径。
- 可结合启发式初始列生成,避免早期退化。
-
实际应用:
在软件定义网络(SDN)中,集中控制器可用列生成在线计算路由,适应动态请求。
7. 总结
列生成在该问题中:
- 主问题:分配流量到路径,满足容量约束。
- 子问题:对每个请求,在 QoS 约束下找权重最小路径(权重 = 需求 × 链路对偶价格)。
- 将大规模路径选择问题分解为“主问题分配” + “子问题寻路”,有效处理指数级变量。