zoukankan      html  css  js  c++  java
  • 二分图与匈牙利算法,Python实现

    二分图定义

    二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。(摘自百度百科)

    边独立集(即匹配)的定义

    截图摘自:MOOC 集合论与图论(下)

    二分图(即偶图)的完全匹配和完美匹配

    截图摘自:MOOC 集合论与图论(下)

    二分图匹配的条件

    匈牙利算法

    匈牙利算法——最大匹配问题详解

    匈牙利算法-看这篇绝对就够了!

    匈牙利算法流程以及Python程序实现

    代码:

    from scipy.optimize import linear_sum_assignment
    import numpy as np
    
    cost = np.array([[4, 1, 3, 6], [2, 0, 5, 1], [3, 2, 2, 8], [4, 3, 2, 9]])
    row_ind, col_ind = linear_sum_assignment(cost)
    print('row_ind:')
    print(row_ind)   # 开销矩阵对应的行索引
    print('col_ind:')
    print(col_ind)   # 对应行索引的最优指派的列索引
    print('cost:')
    print(cost[row_ind, col_ind])   # 提取每个行索引的最优指派列索引所在的元素,形成数组
    print('cost_sum:')
    print(cost[row_ind, col_ind].sum())   # 最小开销

    运行结果:

    上述代码是把矩阵当做开销矩阵,希望求得最小开销;如果把矩阵当做收益矩阵,则希望得到最大收益,这时可以矩阵前面添加一个负号,以求得最大收益的分配。

    from scipy.optimize import linear_sum_assignment
    import numpy as np
    
    cost = np.array([[4, 1, 3, 6], [2, 0, 5, 1], [3, 2, 2, 8], [4, 3, 2, 9]])
    cost = -cost
    row_ind, col_ind = linear_sum_assignment(cost)
    print('row_ind:')
    print(row_ind)   # 收益矩阵对应的行索引
    print('col_ind:')
    print(col_ind)   # 对应行索引的最优指派的列索引
    print('benefit:')
    print(-cost[row_ind, col_ind])   # 提取每个行索引的最优指派列索引所在的元素,形成数组
    print('benefit_sum:')
    print(-cost[row_ind, col_ind].sum())   # 最大收益

    运行结果:

  • 相关阅读:
    i++与++i的区别和使用
    C++中函数返回引用
    ASP.NET金课设计(四)
    ASP.NET金课设计(三)
    ASP.NET金课设计(二)
    ASP.NET金课--课程大纲
    使用PagerTemplate实现GridView分页
    后台模块--订单管理
    前台模块--首页
    后台模块--公告管理
  • 原文地址:https://www.cnblogs.com/picassooo/p/13533433.html
Copyright © 2011-2022 走看看