并行与分布式系统中的并行图匹配:并行化稳定匹配(Gale-Shapley)算法
字数 3698 2025-12-24 20:54:36

并行与分布式系统中的并行图匹配:并行化稳定匹配(Gale-Shapley)算法

题目描述
在分布式计算环境中,稳定匹配问题(Stable Matching Problem)是经典的两方匹配问题:给定两组元素集合(例如求职者与公司、学生与学校),每个元素对另一组的所有元素都有一个严格的偏好排序,目标是找到一个“稳定”的匹配,使得不存在两个元素互相更偏好对方而不是当前匹配对象的情况。Gale-Shapley算法(也称为延迟接受算法)是一个串行算法,可以找到一个稳定匹配(在求职者最优或公司最优的意义下)。本题要求你设计一个并行化版本的Gale-Shapley算法,使其能够在分布式或多核环境下高效运行,同时保持算法的正确性(即输出仍是稳定匹配)。

解题过程循序渐进讲解


1. 回顾串行Gale-Shapley算法

在串行Gale-Shapley算法(以求职者最优为例)中:

  • 有两组:求职者集合 \(A\) 和公司集合 \(B\)
  • 每个求职者对所有公司有一个偏好列表(从最喜欢到最不喜欢),每个公司对所有求职者也有一个偏好列表。
  • 算法过程:
    1. 所有求职者初始状态为“自由”。
    2. 当一个自由求职者 \(a\) 还没有被所有公司考虑过时,它向其偏好列表中尚未拒绝过它的最高排名的公司 \(b\) 发送申请。
    3. 公司 \(b\) 收到申请后,如果它当前是自由的,则接受 \(a\) 并与之临时匹配;如果它已经与某个求职者 \(a'\) 匹配,则比较对 \(a\)\(a'\) 的偏好,保留更喜欢的求职者,并拒绝另一个(被拒绝的求职者回到自由状态)。
    4. 重复步骤2-3,直到所有求职者都匹配(且没有拒绝可能发生)。

该算法的串行复杂度为 \(O(n^2)\)(其中 \(n\) 是每组的元素数量)。


2. 并行化的挑战与思路

  • 主要挑战:串行算法中,每一步只有一个求职者向一个公司申请,并且公司的决策依赖于当前匹配状态,这本质上是顺序过程。
  • 并行化思路:允许多个自由求职者同时向其首选公司发送申请,并让公司同时处理多个申请。但必须处理冲突:一个公司可能同时收到多个申请,必须根据其偏好列表选择最佳者,并可能需要拒绝多个申请者。
  • 关键观察:在一个并行轮次中,每个公司可以独立地处理收到的所有申请,根据偏好选择最佳者(就像同时考虑多个申请)。被拒绝的求职者在下一轮继续申请下一个偏好公司。

因此,我们可以设计一个多轮迭代的并行算法,每轮中所有自由求职者同时申请,所有公司同时决策。


3. 并行算法设计(以求职者最优为例)

假设在共享内存多核或分布式系统中,每个求职者和每个公司可以有一个处理单元(线程/进程)模拟其行为,或者由中央调度器批量处理。

数据结构

  • pref_A[a][i]:求职者 \(a\) 的第 \(i\) 偏好公司。
  • pref_B[b][i]:公司 \(b\) 的第 \(i\) 偏好求职者。
  • next_proposal[a]:求职者 \(a\) 将要申请的下一个偏好公司的索引(初始为0)。
  • current_match[b]:公司 \(b\) 当前匹配的求职者(初始为NULL)。
  • free_A:当前自由求职者的集合。

并行轮次迭代算法

  1. 初始化:所有求职者为自由,next_proposal[a]=0current_match[b]=NULL
  2. 当存在自由求职者时,执行一轮:
    a. 并行申请阶段:每个自由求职者 \(a\) 读取 next_proposal[a],得到其当前首选公司 \( b = pref_A[a][next_proposal[a]]\),并向 \(b\) 发送申请(在实际实现中,可以记录到申请列表 applications[b])。
    b. 并行决策阶段:对于每个公司 \(b\),并行处理其收到的申请列表 applications[b]
    • 如果 applications[b] 为空,则跳过。
    • 否则,从 applications[b] 中选出在公司 \(b\) 偏好列表中最靠前的求职者 \(a_{best}\)(即偏好排名最高)。
    • 比较 \(a_{best}\) 与当前匹配的求职者 current_match[b](如果存在):
      • 如果 \(a_{best}\) 更受偏好,则拒绝 current_match[b](将其标记为自由),并与 \(a_{best}\) 匹配(更新 current_match[b]=a_{best},标记 \(a_{best}\) 为已匹配)。
      • 如果 current_match[b] 更受偏好或相等(不可能相等),则拒绝 \(a_{best}\)(及其它所有申请者)。
    • 清空 applications[b] 以供下一轮使用。
      c. 更新状态:被拒绝的求职者将其 next_proposal[a]++,如果尚未穷尽所有公司,则保持自由状态;否则,算法应终止(但根据Gale-Shapley性质,不会出现这种情况,因为匹配必存在)。
  3. 输出匹配结果 current_match

4. 算法正确性分析

  • 稳定性:与串行Gale-Shapley算法等价,因为每轮中公司总是选择当前收到申请中的最优者,且求职者按偏好顺序申请。假设最终匹配后存在不稳定对 \((a,b)\)(即 \(a\) 更喜欢 \(b\) 而非当前匹配公司,且 \(b\) 更喜欢 \(a\) 而非当前匹配求职者),那么 \(a\) 一定曾在某个轮次申请过 \(b\),但 \(b\) 拒绝了 \(a\) 或之后选择了更优者;当 \(b\) 最终匹配时,其匹配对象在 \(b\) 的偏好中比 \(a\) 更靠前,所以不稳定对不可能存在。
  • 终止性:每个求职者最多申请 \(n\) 次,因此总轮次最多 \(n\) 轮。每轮中申请和决策可以并行完成。
  • 求职者最优性:由于求职者按偏好顺序申请且公司决策规则不变,该并行版本输出的匹配与串行求职者最优Gale-Shapley算法相同(即每个求职者获得其可能的最佳稳定匹配对象)。

5. 并行实现细节

  • 同步:每轮需要同步屏障,确保所有申请发送完毕后,再进行公司决策;决策完毕后,再更新自由求职者列表。
  • 负载均衡:如果求职者和公司数量很大,可以将它们分组分配给不同的处理器。申请阶段,每个处理器负责其分配的求职者发送申请;决策阶段,每个处理器负责其分配的公司处理申请。但需注意公司决策需要全局偏好信息,因此偏好列表需要可访问(例如复制或分布式存储)。
  • 通信开销:在分布式内存系统中,申请消息需要在处理器间传递。可以按公司分组,将申请发送到负责该公司的处理器。

6. 复杂度分析

  • 时间复杂度:最多 \(n\) 轮,每轮中:
    • 申请阶段:每个自由求职者发送一条申请,可并行完成,理想时间 \(O(1)\)
    • 决策阶段:每个公司处理其申请列表,假设最多有 \(n\) 个申请,选择最佳者需要比较偏好排名(可以使用反向索引将偏好查询降至 \(O(1)\)),因此每个公司决策时间为 \(O(\text{申请数})\)
    • 最坏情况下,每轮所有 \(n\) 个求职者都申请同一个公司,导致该公司决策 \(O(n)\) 时间,但总体轮次仍为 \(n\),总串行时间 \(O(n^2)\)。然而在平均分布下,申请会分散,通过并行化可以加速。
  • 空间复杂度:需要存储偏好列表 \(O(n^2)\),以及申请列表等额外 \(O(n)\) 空间。

7. 扩展与优化

  • 多对一匹配:当公司可以匹配多个求职者(例如学校招生)时,只需修改公司决策规则:公司 \(b\) 可以接受最多 \(c_b\) 个申请者(\(c_b\) 为容量),从申请者中选择偏好排名最高的前 \(c_b\) 个。
  • 异步并行:可以不使用同步轮次,允许求职者在被拒绝后立即申请下一个公司,但需要更复杂的并发控制来保证公司决策的一致性(例如使用锁或原子操作)。
  • 分布式异步版本:每个求职者和公司作为独立节点,通过消息传递通信。需要处理消息顺序和并发决策的冲突,可以使用版本号或时间戳来协调。

8. 总结

并行化Gale-Shapley算法的核心思想是将串行中的逐个求职者申请改为批量申请与批量决策,通过多轮迭代逼近稳定匹配。尽管算法仍需多轮同步,但每轮内的申请发送和公司决策可以高度并行化。该算法适用于大规模稳定匹配问题(如全国性的医院-住院医师匹配),通过分布式计算加速匹配过程,同时保持匹配的稳定性和最优性。

这样设计的并行算法在理论上保持了串行Gale-Shapley算法的所有良好性质,并通过并行化显著减少了实际运行时间。

并行与分布式系统中的并行图匹配:并行化稳定匹配(Gale-Shapley)算法 题目描述 在分布式计算环境中,稳定匹配问题(Stable Matching Problem)是经典的两方匹配问题:给定两组元素集合(例如求职者与公司、学生与学校),每个元素对另一组的所有元素都有一个严格的偏好排序,目标是找到一个“稳定”的匹配,使得不存在两个元素互相更偏好对方而不是当前匹配对象的情况。Gale-Shapley算法(也称为延迟接受算法)是一个串行算法,可以找到一个稳定匹配(在求职者最优或公司最优的意义下)。本题要求你设计一个并行化版本的Gale-Shapley算法,使其能够在分布式或多核环境下高效运行,同时保持算法的正确性(即输出仍是稳定匹配)。 解题过程循序渐进讲解 1. 回顾串行Gale-Shapley算法 在串行Gale-Shapley算法(以求职者最优为例)中: 有两组:求职者集合 \( A \) 和公司集合 \( B \)。 每个求职者对所有公司有一个偏好列表(从最喜欢到最不喜欢),每个公司对所有求职者也有一个偏好列表。 算法过程: 所有求职者初始状态为“自由”。 当一个自由求职者 \( a \) 还没有被所有公司考虑过时,它向其偏好列表中尚未拒绝过它的最高排名的公司 \( b \) 发送申请。 公司 \( b \) 收到申请后,如果它当前是自由的,则接受 \( a \) 并与之临时匹配;如果它已经与某个求职者 \( a' \) 匹配,则比较对 \( a \) 和 \( a' \) 的偏好,保留更喜欢的求职者,并拒绝另一个(被拒绝的求职者回到自由状态)。 重复步骤2-3,直到所有求职者都匹配(且没有拒绝可能发生)。 该算法的串行复杂度为 \( O(n^2) \)(其中 \( n \) 是每组的元素数量)。 2. 并行化的挑战与思路 主要挑战 :串行算法中,每一步只有一个求职者向一个公司申请,并且公司的决策依赖于当前匹配状态,这本质上是顺序过程。 并行化思路 :允许多个自由求职者同时向其首选公司发送申请,并让公司同时处理多个申请。但必须处理冲突:一个公司可能同时收到多个申请,必须根据其偏好列表选择最佳者,并可能需要拒绝多个申请者。 关键观察 :在一个并行轮次中,每个公司可以独立地处理收到的所有申请,根据偏好选择最佳者(就像同时考虑多个申请)。被拒绝的求职者在下一轮继续申请下一个偏好公司。 因此,我们可以设计一个 多轮迭代的并行算法 ,每轮中所有自由求职者同时申请,所有公司同时决策。 3. 并行算法设计(以求职者最优为例) 假设在共享内存多核或分布式系统中,每个求职者和每个公司可以有一个处理单元(线程/进程)模拟其行为,或者由中央调度器批量处理。 数据结构 : pref_A[a][i] :求职者 \( a \) 的第 \( i \) 偏好公司。 pref_B[b][i] :公司 \( b \) 的第 \( i \) 偏好求职者。 next_proposal[a] :求职者 \( a \) 将要申请的下一个偏好公司的索引(初始为0)。 current_match[b] :公司 \( b \) 当前匹配的求职者(初始为NULL)。 free_A :当前自由求职者的集合。 并行轮次迭代算法 : 初始化:所有求职者为自由, next_proposal[a]=0 , current_match[b]=NULL 。 当存在自由求职者时,执行一轮: a. 并行申请阶段 :每个自由求职者 \( a \) 读取 next_proposal[a] ,得到其当前首选公司 \( b = pref_ A[ a][ next_ proposal[ a]]\),并向 \( b \) 发送申请(在实际实现中,可以记录到申请列表 applications[b] )。 b. 并行决策阶段 :对于每个公司 \( b \),并行处理其收到的申请列表 applications[b] : 如果 applications[b] 为空,则跳过。 否则,从 applications[b] 中选出在公司 \( b \) 偏好列表中最靠前的求职者 \( a_ {best} \)(即偏好排名最高)。 比较 \( a_ {best} \) 与当前匹配的求职者 current_match[b] (如果存在): 如果 \( a_ {best} \) 更受偏好,则拒绝 current_match[b] (将其标记为自由),并与 \( a_ {best} \) 匹配(更新 current_match[b]=a_{best} ,标记 \( a_ {best} \) 为已匹配)。 如果 current_match[b] 更受偏好或相等(不可能相等),则拒绝 \( a_ {best} \)(及其它所有申请者)。 清空 applications[b] 以供下一轮使用。 c. 更新状态 :被拒绝的求职者将其 next_proposal[a]++ ,如果尚未穷尽所有公司,则保持自由状态;否则,算法应终止(但根据Gale-Shapley性质,不会出现这种情况,因为匹配必存在)。 输出匹配结果 current_match 。 4. 算法正确性分析 稳定性 :与串行Gale-Shapley算法等价,因为每轮中公司总是选择当前收到申请中的最优者,且求职者按偏好顺序申请。假设最终匹配后存在不稳定对 \( (a,b) \)(即 \( a \) 更喜欢 \( b \) 而非当前匹配公司,且 \( b \) 更喜欢 \( a \) 而非当前匹配求职者),那么 \( a \) 一定曾在某个轮次申请过 \( b \),但 \( b \) 拒绝了 \( a \) 或之后选择了更优者;当 \( b \) 最终匹配时,其匹配对象在 \( b \) 的偏好中比 \( a \) 更靠前,所以不稳定对不可能存在。 终止性 :每个求职者最多申请 \( n \) 次,因此总轮次最多 \( n \) 轮。每轮中申请和决策可以并行完成。 求职者最优性 :由于求职者按偏好顺序申请且公司决策规则不变,该并行版本输出的匹配与串行求职者最优Gale-Shapley算法相同(即每个求职者获得其可能的最佳稳定匹配对象)。 5. 并行实现细节 同步 :每轮需要同步屏障,确保所有申请发送完毕后,再进行公司决策;决策完毕后,再更新自由求职者列表。 负载均衡 :如果求职者和公司数量很大,可以将它们分组分配给不同的处理器。申请阶段,每个处理器负责其分配的求职者发送申请;决策阶段,每个处理器负责其分配的公司处理申请。但需注意公司决策需要全局偏好信息,因此偏好列表需要可访问(例如复制或分布式存储)。 通信开销 :在分布式内存系统中,申请消息需要在处理器间传递。可以按公司分组,将申请发送到负责该公司的处理器。 6. 复杂度分析 时间复杂度 :最多 \( n \) 轮,每轮中: 申请阶段:每个自由求职者发送一条申请,可并行完成,理想时间 \( O(1) \)。 决策阶段:每个公司处理其申请列表,假设最多有 \( n \) 个申请,选择最佳者需要比较偏好排名(可以使用反向索引将偏好查询降至 \( O(1) \)),因此每个公司决策时间为 \( O(\text{申请数}) \)。 最坏情况下,每轮所有 \( n \) 个求职者都申请同一个公司,导致该公司决策 \( O(n) \) 时间,但总体轮次仍为 \( n \),总串行时间 \( O(n^2) \)。然而在平均分布下,申请会分散,通过并行化可以加速。 空间复杂度 :需要存储偏好列表 \( O(n^2) \),以及申请列表等额外 \( O(n) \) 空间。 7. 扩展与优化 多对一匹配 :当公司可以匹配多个求职者(例如学校招生)时,只需修改公司决策规则:公司 \( b \) 可以接受最多 \( c_ b \) 个申请者(\( c_ b \) 为容量),从申请者中选择偏好排名最高的前 \( c_ b \) 个。 异步并行 :可以不使用同步轮次,允许求职者在被拒绝后立即申请下一个公司,但需要更复杂的并发控制来保证公司决策的一致性(例如使用锁或原子操作)。 分布式异步版本 :每个求职者和公司作为独立节点,通过消息传递通信。需要处理消息顺序和并发决策的冲突,可以使用版本号或时间戳来协调。 8. 总结 并行化Gale-Shapley算法的核心思想是将串行中的逐个求职者申请改为批量申请与批量决策,通过多轮迭代逼近稳定匹配。尽管算法仍需多轮同步,但每轮内的申请发送和公司决策可以高度并行化。该算法适用于大规模稳定匹配问题(如全国性的医院-住院医师匹配),通过分布式计算加速匹配过程,同时保持匹配的稳定性和最优性。 这样设计的并行算法在理论上保持了串行Gale-Shapley算法的所有良好性质,并通过并行化显著减少了实际运行时间。