基于线性规划的图最小权最大匹配问题的分数松弛与舍入算法求解示例
我将为您讲解一个线性规划在图论优化问题中的应用:最小权最大匹配问题,并重点介绍其分数松弛与舍入算法的求解过程。
一、 问题描述
想象一个任务分配场景:有若干工人和若干任务,但工人和任务的数量可以不相等。每个工人最多只能被分配一个任务,每个任务也最多只能被一个工人完成。工人i完成任务j需要一定的成本c_{ij}。我们的目标是:在保证被成功分配的“工人-任务”对数尽可能多(即匹配的基数最大)的前提下,最小化所有被选中的“工人-任务”对的总成本。
用图论语言建模:给定一个二分图G = (U, V, E),其中U是工人集合,V是任务集合,E是连接工人和任务的可能边。每条边e = (i, j) ∈ E有一个权重c_e(表示成本)。目标是找到一个匹配M ⊆ E(即一个边的子集,其中任意两条边不共享端点),使得:
- 最大化匹配的大小:
|M|尽可能大。 - 在满足1的条件下,最小化总权重:
Σ_{e∈M} c_e尽可能小。
这是一个组合优化问题,我们先将其表述为一个整数规划。
二、 整数规划建模
为每条边e ∈ E引入一个二进制决策变量x_e:
x_e = 1表示边e被选入匹配M。x_e = 0表示边e未被选中。
约束条件:
- 每个顶点最多关联一条匹配边:对于每个顶点(无论是工人还是任务),与其相连的所有边的
x_e之和不超过1。这保证了匹配的性质。- 对于
U中的每个工人i:Σ_{e 与 i 相连}} x_e ≤ 1。 - 对于
V中的每个任务j:Σ_{e 与 j 相连}} x_e ≤ 1。
- 对于
- 变量二进制约束:
x_e ∈ {0, 1}。
目标函数:由于问题要求先最大化匹配规模,再最小化总成本,我们可以用一个两阶段目标,或者用一个惩罚函数。更常见的处理是,假设我们知道最大匹配的基数k*(可以通过纯粹的最大匹配算法,如匈牙利算法,预先求出),然后将问题转化为:寻找一个大小为k*的匹配,并使其总成本最小。这样,目标就简化为单纯的最小化总成本。
修改后的目标与约束:
- 目标:
Minimize Σ_{e∈E} c_e * x_e。 - 约束:除了上述每个顶点至多关联一条边的约束外,增加一个基数约束:
Σ_{e∈E} x_e = k*。
这个整数规划模型是精确的,但当图很大时,直接求解整数规划计算代价高。我们采用经典的线性规划松弛 + 舍入近似算法。
三、 线性规划松弛与求解
我们将整数规划松弛为线性规划,这是算法的核心。
松弛模型 (LP):
- 目标:
Minimize Σ_{e∈E} c_e * x_e。 - 约束:
- 顶点约束:对于每个顶点
v ∈ U ∪ V,Σ_{e 与 v 相连}} x_e ≤ 1。 - 基数约束:
Σ_{e∈E} x_e = k*。 - 非负约束:
x_e ≥ 0。(注意,这里去掉了x_e ≤ 1,因为它已经被顶点约束Σ x_e ≤ 1和非负性蕴含了。x_e可以取0到1之间的分数值,例如0.5)。
- 顶点约束:对于每个顶点
这个线性规划可以在多项式时间内用内点法或单纯形法求解。设求出的最优解为向量x* = {x*_e},其最优目标值为OPT_f(即分数最优解的成本)。由于整数可行解是分数可行解的一个子集,所以OPT_f ≤ OPT_I(其中OPT_I是原整数问题的最优解成本)。x*通常被称为一个“分数匹配”。
四、 分数匹配的结构分析与分解
线性规划解x*是一个“分数匹配”。图论中有一个关键定理(Birkhoff-von Neumann定理的推广形式):任何二分图的分数匹配(即满足顶点约束的非负向量x),都可以表示为若干个整数的完美匹配(或更一般地,匹配)的凸组合。
具体来说,存在一组匹配M1, M2, ..., Mt和一组正的系数λ1, λ2, ..., λt,满足:
Σ_{i=1 to t} λ_i = 1。- 对于每条边
e,有x*_e = Σ_{i: e ∈ Mi} λ_i。
换句话说,x*可以看作是“按概率λ_i选择匹配Mi”的结果。这个分解可以通过多项式时间算法(如图的遍历和匹配的迭代提取)求得。
这个分解为我们提供了从分数解过渡到整数解的桥梁。
五、 舍入算法与近似性
由于我们的目标不是单纯的匹配,而是大小为k*的最小权最大匹配,分解出的匹配Mi的大小可能小于k*(即不是最大匹配)。我们需要一个巧妙的舍入策略。
算法步骤:
- 求解线性规划:求解上述LP松弛,得到分数最优解
x*及其目标值OPT_f。 - 分数匹配分解:对
x*应用分解算法,得到一组匹配M1, M2, ..., Mt及其系数λ1, λ2, ..., λt。注意,每个Mi是一个匹配(边集),但不一定是大小为k*的匹配。 - 计算期望大小和成本:
- 每个匹配
Mi有一个大小|Mi|和一个总成本c(Mi) = Σ_{e∈Mi} c_e。 - 根据分解的性质,分数匹配的总大小
Σ_e x*_e = k*。同时,k* = Σ_i λ_i * |Mi|(这是从分解定义推出的期望大小)。 - 分数匹配的总成本
OPT_f = Σ_i λ_i * c(Mi)。
- 每个匹配
- 输出选择:由于
Σ_i λ_i * |Mi| = k*,这意味着这些匹配的加权平均大小正好是k*。我们的目标是输出一个大小正好为k*的匹配。直接随机按系数λ_i选取一个匹配Mi,其大小可能偏离k*。- 一个简单的舍入策略是:输出分解中
c(Mi) / |Mi|(即单位大小的平均成本)最小的那个匹配Mi。 - 更严谨的理论保证通常需要证明,存在至少一个匹配
Mi,其大小至少为k*(或非常接近),且其总成本不超过OPT_f的某个倍数。对于最小权最大匹配问题,有一种著名的算法是:先求最小权完美匹配的分数松弛,其基本可行解是半整数的(即x*_e ∈ {0, 1/2, 1}),然后通过处理“奇圈”来得到一个整数解,并能证明这是精确最优解(Edmonds的算法)。 - 对于近似算法,我们常采用按概率舍入:以概率
λ_i独立地将匹配Mi中的边选入候选集,但这样可能导致冲突(一个顶点关联多条边)。因此,对于此问题,更标准的近似算法不是简单的独立舍入,而是基于分解后的匹配结构,构造一个大小正好为k*且成本有界的整数匹配。这通常涉及更复杂的组合论证,证明在分解出的匹配中,可以选取一个成本不超过OPT_f且大小至少为k*的匹配,然后从中删减一些边使其大小正好为k*而不显著增加“单位成本”。
- 一个简单的舍入策略是:输出分解中
六、 算法总结与要点
- 核心思想:将难解的最小权最大匹配整数规划问题,松弛为易解的线性规划问题。
- 关键工具:利用分数匹配可以表示为整数匹配的凸组合这一重要图论定理。
- 算法流程:求解LP松弛 → 分解分数解为整数匹配的凸组合 → 通过巧妙的选取或构造,从这些整数匹配中提取出一个大小恰好为
k*、且总成本与OPT_f(从而与OPT_I)可比的整数匹配。 - 性能保证:对于最小权最大匹配问题,基于上述LP松弛的算法通常可以得到一个最优解(利用半整数的性质),或者一个近似解(如果采用简化舍入策略)。对于更一般的带权匹配问题,这类方法是设计近似算法的基础。
这个方法展示了线性规划如何作为强大的工具,为组合优化问题提供最优或近似最优的解决方案思路。