You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改基于二分图的男性至多四配偶Gale Shapley匹配算法并添加节点权重

如何修改基于二分图的男性至多四配偶Gale-Shapley匹配算法

我希望根据年龄、身高、学历等特定标准为二分图的每个节点添加权重,在所有节点分配权重后执行算法,以根据男女双方的优先级推荐最优的稳定匹配。

规则条件

  • 一名男性可娶1名、2名、3名女性,但同一时间不得超过4名
  • 若配偶离婚或离世,男性可再娶一名女性
  • 若男性离世,其所有配偶需等待3个月后方可再婚
  • 一名女性同一时间只能嫁给一名男性
  • 女性离婚后需等待3个月后方可再婚

导入Python库

import networkx as nx
import matplotlib.pyplot as plt

3名男性和3名女性的偏好列表示例

men_prefs = {
    'm1': ['w2', 'w1', 'w3'],
    'm2': ['w1', 'w2', 'w3'],
    'm3': ['w1', 'w3', 'w2']
}
women_prefs = {
    'w1': ['m3', 'm1', 'm2'],
    'w2': ['m2', 'm1', 'm3'],
    'w3': ['m1', 'm3', 'm2']
}

创建二分图

B = nx.Graph()
B.add_nodes_from(men_prefs.keys(), bipartite=0)
B.add_nodes_from(women_prefs.keys(), bipartite=1)
for man, prefs in men_prefs.items():
    for woman in prefs:
        B.add_edge(man, woman)

运行Gale-Shapley算法

free_men = set(men_prefs.keys())
engaged = {}
while free_men:
    man = free_men.pop()
    woman = men_prefs[man][0]
    if woman in engaged:
        current_man = engaged[woman]
        if women_prefs[woman].index(man) < women_prefs[woman].index(current_man):
            engaged[woman] = man
            free_men.add(current_man)
        else:
            free_men.add(man)
    else:
        engaged[woman] = man

绘制匹配后的图

pos = nx.bipartite_layout(B, men_prefs.keys())
plt.figure(figsize=(6, 4))
nx.draw_networkx_nodes(B, pos, node_color=['lightblue'])
nx.draw_networkx_edges(B, pos, edgelist=engaged.items(), edge_color='red', width=2)
nx.draw_networkx_labels(B, pos, font_size=12, font_family='sans-serif')
plt.axis('off')
plt.show()

内容的提问来源于stack exchange,提问作者comsian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:47:47