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]
    '''
    
  • 相关阅读:
    day 66 crm(3) 自创组件stark界面展示数据
    day 65 crm(2) admin源码解析,以及简单的仿造admin组件
    用 Python+nginx+django 打造在线家庭影院
    django -admin 源码解析
    day 64 crm项目(1) admin组件的初识别以及应用
    云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
    day 56 linux的安装python3 ,虚拟环境,mysql ,redis
    day55 linux 基础以及系统优化
    Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
    Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
  • 原文地址:https://www.cnblogs.com/aoru45/p/11415984.html
Copyright © 2011-2022 走看看