匈牙利算法 原理 python实现

  • 例子

用男女配对问题来解释,背景是:你是一个红娘,需要对图中的男女进行配对,其中男女之间有线就表示他们之间有暧昧,可以牵红线。

  • 算法流程

  • B1,他与G2有暧昧,那我们就先暂时把他与G2连接(此时的安排都是暂时的,不一定是最终的结果)
  • B2,B2也喜欢G2,这时G2已经“名花有主”了(虽然只是我们设想的),那怎么办呢?我们倒回去看G2目前被安排的是B1,B1有没有别的选项呢?有的,是G4,G4还没有被安排,那我们就给B1安排上G4。
  • B3,B3直接配上G1就好了,按理说G3也可以,但是只能安排一个
  • B4,他只钟情于G4,G4目前配的是B1。B1除了G4还可以选G2,但是呢,如果B1选了G2,G2的原配B2就没得选了。我们绕了一大圈,发现B4只能注定单身了,可怜。(其实从来没被考虑过的G3更可怜)

                

  • Python代码

import numpy as np
def match(i,mapArray,vis,p):
    M,N = mapArray.shape[0:2]
    for j in range(N):
        if mapArray[i][j] and vis[j]==0:
            vis[j]=1
            if p[j]==-1 or match(p[j],mapArray,vis,p):
                p[j] = i
                return 1
    return 0


def Hungarian(mapArray):
    cnt = 0
    
    M,N = mapArray.shape[0:2]
    p=np.zeros(N,dtype=np.int8)
    p[:]=-1 #//记录当前右侧元素所对应的左侧元素
    for i in range(M):
        vis=np.zeros(N,dtype=np.int8)#//记录右侧元素是否已被访问过
        if match(i,mapArray,vis,p):
            cnt+=1
    xCoord = np.where(p!=-1)[0].tolist()
    pos = [[i,p[i]]for i in xCoord]
    return cnt,pos
    
if __name__ == "__main__":
    mapArray = np.zeros((4,4))
    # 0,1,0,1
    # 0,1,0,0
    # 1,0,1,0
    # 0,0,0,1
    data = [[0,1,0,1],[0,1,0,0],[1,0,1,0],[0,0,0,1]]
    mapArray = np.array(data)#//邻接矩阵存图
    res = Hungarian(mapArray)
    print(res)    # 3, [[0, 2], [1, 1], [3, 0]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/342291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《WebKit 技术内幕》学习之五(2): HTML解释器和DOM 模型

2.HTML 解释器 2.1 解释过程 HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。 这一过程中,WebKit 内部对网页内容在各个阶段的结构表示。 WebKit 中这一过程如下:首先是字节流,经过解码之…

大数据学习之Flink,Flink的安装部署

Flink部署 一、了解它的关键组件 客户端(Client) 作业管理器(JobManager) 任务管理器(TaskManager) 我们的代码,实际上是由客户端获取并做转换,之后提交给 JobManger 的。所以 …

计算机网络 第2章(物理层)

系列文章目录 计算机网络 第1章(概述) 计算机网络 第2章(物理层) 文章目录 系列文章目录1. 物理层的基本概念2. 物理层下面的传输媒体2.1 导引型传输媒体2.2 非导引型传输媒体 3. 传输方式3.1 串行传输和并行传输3.2 同步传输和异…

控制项目进展

优质博文 IT-BLOG-CN 假如一个项目准备工作做的非常周详,现在要做的就是监督项目的进展情况,理想状况下事情应当进展的很顺利,但实际上我们会发现项目永远不会完全按照经计划执行,我们必须进行项目控制。也就是我们需要不断进行调…

AI创作之旅:探索提示工程的奇妙世界

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在当今信息爆炸的时代,人工智能的发…

开源的测试平台快2千星了,能带来多少收益呢

最近看了下自己去年初开源的测试平台,star一起算的话也到1.7k了: 做开源的初心一方面是想把自己的理解和思想展示出来,另一方面是想进一步打造个人IP,提升影响力(其实这个想法很早之前就有了,计划过无数次但…

图灵日记之java奇妙历险记--异常包装类泛型

目录 异常概念与体系结构异常的分类异常的处理防御式编程异常的抛出异常的捕获异常声明throwstry-catch捕获并处理 自定义异常类 包装类基本数据类型及其对应包装类装箱和拆箱 泛型泛型使用类型推导 裸类型说明 泛型的编译机制泛型的上界语法 异常概念与体系结构 在java中,将程…

【JavaEE进阶】MyBatis⼊⻔

文章目录 🌲什么是MyBatis?🌳准备⼯作🚩创建⼯程🚩数据准备🚩配置数据库连接字符串🚩 在项⽬中,创建持久层接⼝UserInfoMapper 🍃单元测试🚩使⽤Idea⾃动⽣成测试类 🍀打…

LabVIEW电路板插件焊点自动检测系统

LabVIEW电路板插件焊点自动检测系统 介绍了电路板插件焊点的自动检测装置设计。项目的核心是使用LabVIEW软件,开发出一个能够自动检测电路板上桥接、虚焊、漏焊和多锡等焊点缺陷的系统。 系统包括成像单元、机械传动单元和软件处理单元。首先,利用工业相…

nvm切换node版本报错

1. 问题描述 使用 nvm use (node版本号) 命令时报错 2. 解决方法 权限不够,以管理员身份运行cmd 具体操作: (1)点击电脑左下方搜索 命令提示符 ,点击 以管理员身份运行 (2)重新输入nvm use …

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…

基于jQuery与Spring MVC实现用户密码异步修改的实战演示

文章目录 一、实战概述二、实战步骤(一)创建表单1、表单界面2、表单代码3、脚本代码 (二)后端控制器(三)测试代码,查看效果1、弹出更改密码表单2、演示更改密码操作 三、实战总结 一、实战概述 …

如何正确判断一个字符串是数值

在网页中,我们从用户输入的内容中获取的值通常是字符串,但是有时候我们希望用户输入的内容一定要能转成数值: userInput.addEventListener(change, (e) > {const value e.target.value;console.log(typeof value); // stringconsole.ass…

健康成长的基石:新生儿补充镁的关键

引言: 镁是人体内的重要矿物质之一,对于新生儿的生长发育和健康维护至关重要。在新生儿期间,适量补充镁有助于促进神经、骨骼和心血管系统的健康发展。然而,在进行镁的补充时,家长需要特别注意一系列事项,…

Android 通过adb命令查看应用流量

一. 获取应用pid号 通过adb shell ps -A | grep 包名 来获取app的 pid号 二. 查看应用流量情况 使用adb shell cat /proc/#pid#/net/dev 命令 来获取流量数据 备注: Recevice: 表示收包 Transmit: 表示发包 bytes: 表示收发的字节数 packets: 表示收发正确的…

move_base+自己的定位程序(攻略篇) --- 成功实现ESKF的lidar+imu以及move_base的路径规划

临近放假,老板要求回去之前找其汇报进展,无奈近几月忙于毕业论文的编写,实在是没有多少可以汇报的内容,想来自己弄得定位程序只能实现定位,要不自己再加一个路径规划,直接干! 本文的文字量较大…

centos 7.6 进入单用户模式

1、重启服务器,在选择内核界面使用上下箭头移动 2、选择内核并按“e” 将“RO”改成 rw ,删除 rhgb quiet 添加 init/bin/bash Ctrl X 进入单用户模式 为防止乱码,修改语言为英语 修改完密码建议输入:touch /.autorelabel 更新系统信…

websocket服务端本地部署

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

Unity3d引擎中使用AIGC生成的360全景图(天空盒)

前言 在这里与Skybox AI一起,一键打造体验无限的360世界,这是这个AIGC一键生成全景图的网站欢迎语。 刚使用它是23年中旬,在没有空去给客户实地拍摄全景图时,可以快速用它生成一些相关的全景图,用作前期沟通的VR de…

因谷歌Play Store审核超过7天和联系他们的方式

三种联系他们的方式 1.让他们打电话过来 英语好不好没关系,主要是他们讲着一口浓厚的印度口音英语,很难听懂 2.在线实时聊天沟通 可以选择英文、中文、但是英文肯定容易约上 3.发送邮件 回复太慢了,1-2天回复你一次 传送门&#xff1…