CXY-bzy 2021-10-31 21:11 采纳率: 66.7%
浏览 71
已结题

Python实现最大匹配算法-匈牙利算法 中遇到的问题

首先给大家看一下自己用的代码:

import copy
class DFS_hungarian_tree():
    def __init__(self, nx, ny, edge):
        self.nx, self.ny = nx, ny   # bipartite graph
        self.edge = edge            # adjacent matrix
        self.vertex_num = len(self.nx) + len(self.ny)
        self.cx, self.cy = {}, {}
        for key in nx:
            self.cx.update({key:0}) # 0->free other->matched
        for key in ny:
            self.cy.update({key:0}) # 0->free other->matched
        self.visited = copy.deepcopy(self.cy)   # 0->unvisited 1->visited
        self.M=[]                   # matching map

    def max_match(self):
        aug_num = 0                 # augment num
        for i in self.nx:
            if self.cx[i] == 0:     # if free
                for key in self.ny: # restore default value
                    self.visited[key] = 0
                aug_num += self.path(i)
        return aug_num

    def path(self, u):
        for v in self.ny:
            if self.edge[u][v] and (not self.visited[v]): # edge exist & unvisited
                self.visited[v] = 1   # prevent repeat visit
                if self.cy[v] == 0:  # if free
                    self.cx[u] = v
                    self.cy[v] = u
                    self.M.append((u,v))    # restore line
                    return 1
                else:               # if matched
                    self.M.remove((self.cy[v], v))  # remove conflict path
                    if self.path(self.cy[v]):       # draw another line if have another path
                        self.cx[u] = v
                        self.cy[v] = u
                        self.M.append((u, v))
                        return 1
        return 0

if __name__ == '__main__':
    nx = ['A', 'B', 'C', 'D', 'E']
    ny = ['F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']
    edge = {'A': {'F': 1, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 1, 'L': 0, 'M': 0, 'N': 0, 'O': 0},
            'B': {'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0},
            'C': {'F': 1, 'G': 1, 'H': 0, 'I': 1, 'J': 1, 'K': 0, 'L': 0, 'M': 1, 'N': 1, 'O': 0},
            'D': {'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 1, 'L': 0, 'M': 0, 'N': 0, 'O': 0},
            'E': {'F': 0, 'G': 1, 'H': 1, 'I': 1, 'J': 0, 'K': 1, 'L': 1, 'M': 1, 'N': 0, 'O': 1}}
    Hungrian = DFS_hungarian_tree(nx, ny, edge)
    print('ouput:')
    print('Hungrian.max_match', end = '->')
    print(Hungrian.max_match())
    print('Hungrian.M', end = '->')
    print(Hungrian.M)

输出结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe C:/Users/Administrator/Desktop/xyl.py
ouput:
Hungrian.max_match->4
Hungrian.M->[('C', 'I'), ('E', 'G')]

进程已结束,退出代码 0

问题来了:
Hungrian.max_match输出结果为4,也就是说应该有4个匹配结果,可是Hungrian.M输出的却只有两个,自己觉得也应该是四个,不知道为啥会有这种矛盾,处理别的数据有时候没问题,有时候也会有矛盾
希望可以得到大家的帮助!

  • 写回答

1条回答 默认 最新

  • 关注

    def path()方法中:

                    self.M.remove((self.cy[v], v))  # remove conflict path
                    if self.path(self.cy[v]):       # draw another line if have another path
                        self.cx[u] = v
                        self.cy[v] = u
                        self.M.append((u, v))
                        return 1
    

    有可能只执行了 self.M.remove((self.cy[v], v)) 从M列表中移除元素之后没有再执行 self.M.append((u, v))再添加,
    这种情况如果正常, 则应该return -1。
    这种情况如果不是正常就要调整下代码逻辑。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!