• 从匈牙利算法到Kuhn-Munkres算法


        匈牙利算法要解决的是这样的问题,比如一群男生女生,男生是否有缘可以跟自己喜欢的人在一起。

    当然我们简化成集合符号A和B, A和B的大小可以不同,我们只想知道最后按照喜欢的人在一起的话,最多有几对。

        匈牙利算法从0开始构建匹配的可能性。如果男生Ai喜欢女生Bj而且女生Bj未匹配,那么她当然可以跟男生Ai在一起了。

    但是不要慌,后面的情况还可能变化,Ai可能Bj+1在一起,但是我们保证结果是每次都比原来的成功数要大的。

        匈牙利算法当然是解决图论的问题,这里不用A,B了——X和Y两个

        从X开始,每次找到一个未配对的点u

        抽象的说,是我们在X这边保存了已经访问过的点S,在Y这边类似有T,从u点开始S和T都不断增大,每次只增大1,增大

    的规则是u的邻接点y如果已经匹配z,就把y加到T,z加到S,下一步的操作,是换个u, 再将T中没有访问过的点再次考查

    一遍。如果y没有匹配,那正好,根据你的访问规则,这个时候u和y肯定可以配对的,这样就可以增加配对了。

        我们的工作是为了让配对的个数越来越多,直到最后不能再配对。不能配对的判定就是Hall定理,S的邻接点刚好是T。

        由于这个问题实在太过常见,以至于很多人还是像我10分钟前想的例子一样老掉牙。我们还是想个其他的抽象吧。

        可能有人会希望说我们可以改成公司面试应聘者,多个公司跟多个应聘者匹配啊。对哦,前提是你们不要拿了offer就跑掉了。

     对了你有没有想到前面说的是男生喜欢女生?如果是这样的话说明什么?我们忽略了方向。如果只有男生喜欢女生,那这个也是一厢情愿的,单向的连接的说。那怎么解决呢?

     好了另外一个例子,如果东南亚n国希望出口椰子岛中国各y省,但是一个省只能跟一国签约(现实中没有的)。这个也是

    一种问题。那好的,我们现在定个价格,让总的价格最大(喂喂喂),这不是对我们来说的,是对东南亚各国来说的。

     这个就是可以抽象成Kuhn-Munkres算法了。

     对我来说这个问题比较好理解,但是算法比较难证明。看起来就是一个算法的问题。

     我们要设计一个给X,Y标号的函数l,比如 l(x) = 1,然后根据这个函数再多次应用匈牙利算法——多次是感觉得多大?

     当然,这个函数前人已经设计好了。在每次迭代的时候,我们要根据w(xy)跟l(x)+l(y)的关系得到一个生成子图G(就是满足条件的x和y和这些边),然后找最大匹配。当我们经过很多次的匈牙利算法就可以得到最终的结果了。

     文章需要配图吗?我随便写的。先这样吧。

        关于匈牙利算法,维基百科有很好的解释,离散数学的课本一般也有介绍。另外Byvoid刚好也有一篇博客。

  • 相关阅读:
    【Python】【文件】查找指定路径中是否存在目标文件(含此路径下的子文件夹)
    时隔一年的2020noip
    nacos 笔记
    webflux 小例子
    spring Initializr 笔记
    临时~spring启动过程
    Mac通过crontab设置定时任务报错Operation not permitted
    Isolation Forest Implementation(孤立森林)
    let arr=['a'] JSON.stringify(arr) 输出:“['a']” let arr2 = “['a']” JSON.parse(arr2) 输出: ['a']
    js对象中key值加引号和不加引号的区别
  • 原文地址:https://www.cnblogs.com/wangzming/p/7075018.html
Copyright © 2020-2023  润新知