匈牙利算法——二分图资源分配问题
import numpy as np
def hungarian_algorithm(graph):
def dfs(u):
for v in range(N):
# 如果两点之间有联系并且该点(列)未被访问
if graph[u][v] and not visited[v]:
# 记录状态为访问过
visited[v] = True
# 如果节点v尚未匹配,或者节点v已经匹配但可以找到一条从节点v出发的另外一条路径,
# 那么就说明节点u可以与节点v进行匹配。
if match[v] == -1 or dfs(match[v]):
match[v] = u
return True
return False
M, N = graph.shape
match = [-1] * N #-1代表两点之间没有匹配
max_matching = 0 #初始化max_matching
for i in range(M):
# 初始化访问数组
visited = [False] * N
# 调用深度优先搜索(DFS),有匹配的点就+1
if dfs(i):
max_matching += 1
# N代表列
matching_result = [-1] * N
for j in range(N):
# 检查其是否与某个左侧节点匹配
if match[j] != -1:
# 将matching_result中与该右侧节点匹配的左侧节点标记为j。
matching_result[match[j]] = j
return max_matching, matching_result
# 示例用法
graph = np.array([[0, 1, 0, 1],
[1, 0, 1, 0],
[0, 1, 0, 1],
[1, 0, 1, 0]])
matching_count, matching_result = hungarian_algorithm(graph)
print("最大匹配数量:", matching_count)
print("最大匹配结果:", matching_result)
实现结果:
参考学习链接:
算法学习笔记(5):匈牙利算法 - Pecco的文章 - 知乎
https://zhuanlan.zhihu.com/p/96229700