zoukankan      html  css  js  c++  java
  • [学习笔记] 匈牙利匹配

    匈牙利匹配算法

    摘要

    匈牙利匹配算法可以用来做目标跟踪,根据预测算法预测box与上一帧box的iou关系可以确定是否是上一帧的目标。

    也是比较常用的二分图匹配算法。

    概念

    1. 图G的一个匹配是由一组没有公共端点的不是圈的边构成的集合。

    2. 完美匹配:考虑部集为X={x1 ,x2, ...}和Y={y1, y2, ...}的二部图,一个完美匹配就是定义从X-Y的一个双射,依次为x1, x2, ... xn找到配对的顶点

    3. 交错路:给定图G的一个匹配M,如果一条路径的边交替出现在M中和不出现在M中,我们称之为一条交错路

    4. 增广路:而如果一条M-交错路径,它的两个端点都不与M中的边关联,我们称这条路径叫做M-增广路

    匈牙利算法的实质是寻找增广路,通过找到目标后改变之前匹配的结果完成最终的匹配。

    算法

    ​ 1.置M为空

      2.找出一条增广路径P,通过取反操作获得更大的匹配M’代替M

      3.重复2操作直到找不出增广路径为止

    说穿了,就是你从二分图中找出一条路径来,让路径的起点和终点都是还没有匹配过的点,并且路径经过的连线是一条没被匹配、一条已经匹配过,再下一条又没匹配这样交替地出现。找到这样的路径后,显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找不到这样的路径为止。

    代码

    根据网上男女匹配的讲解理解后写出。

    '''
    @Descripttion: This is Aoru Xue's demo,which is only for reference
    @version: 
    @Author: Aoru Xue
    @Date: 2019-08-27 02:24:35
    @LastEditors: Aoru Xue
    @LastEditTime: 2019-08-27 02:29:26
    '''
    import numpy as np
    
    class Hungary():
        def __init__(self,graph):
            self.graph = graph
            self.n = len(graph)
            self.used = None
            self.nxt = None
        def find(self,x):
            for i in range(self.n): # 每个女生问一遍
                if self.graph[i][x] == 1 and self.used[i] == 0: # 如果对这个女生有好感,并且这个女生没有问过
                    self.used[i] = 1
                    if self.nxt[i] == -1 or self.find(self.nxt[i]): # 如果女生没有对象或者女生的对象还喜欢别人
                        self.nxt[x] = i
                        self.nxt[i] = x
                        return True
            return False
    
        def match(self):
            self.used = [False] * self.n
            self.nxt = [-1] * self.n
            sum = 0
            for i in range(self.n):
                if self.nxt[i] == -1:
                    self.used = [False] * self.n # 每个男生问之前肯定都没问过任何女生
                    self.find(i)
    if __name__ == '__main__':
        hungary = Hungary([[0,0,0,1,1,1],
        [0,0,0,1,0,1],
        [0,0,0,1,0,0],
        [1,1,1,0,0,0],
        [1,0,0,0,0,0],
        [1,1,0,0,0,0]])
        hungary.match()
        print(hungary.nxt)
        
    
    '''
    [4, 5, 3, 2, 0, 1]
    '''
    
  • 相关阅读:
    [HAOI2008]下落的圆盘
    10.2 上午 考试
    10.1 考试 ..........
    9.29 考试
    博弈论笔记
    bzoj_1022: [SHOI2008]小约翰的游戏John
    课程总结第十五周
    团队冲刺第二阶段09
    团队冲刺第二阶段08
    对搜狗输入法的评价
  • 原文地址:https://www.cnblogs.com/aoru45/p/11415984.html
Copyright © 2011-2022 走看看