Python解决指派问题(匈牙利算法)

匈牙利算法指派问题的python程序实现 最近同样在备战数模,在算法相关的书籍中了解到匈牙利算法,心血来潮用python写了一个程序实现,固然有重复造轮子之嫌(已经有第三方库可以很方便地解决问题),但作为练手之作,姑且聊博大家一笑吧。也希望能给同样借用这个算法练手的其他人一个启发。 关于匈牙利算法,相信会点进这篇文章的各位都有所了解,但是以防万一,还是做一次赘述。 例如,对于一个n行n列的矩阵, ![如这个5行5列的矩阵,这张图是在另一篇文章中嫖的](https://img-blog.csdnimg.cn/2021020711090024.png# 阅读详情

指派问题也是0-1规划,线性规划用的也是scipy.optimize的库函数,查看scipy.optimize官网linear_sum_assignment。

示例:

开销矩阵
[ 4 1 3 2 0 5 3 2 2 ] \begin{bmatrix} 4 & 1 & 3\\ 2 & 0 & 5\\ 3 & 2 & 2 \end{bmatrix} ⎣⎡​423​102​352​⎦⎤​
选每行最小开销并求和,第一行[4 1 3]就选第二列的1,第二行[2 0 5]就选第一列的2,第三行[3 2 2]就选第三列的2,那么开销的和就是5。

上代码:

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

输出:

[0 1 2]
[1 0 2]
[1 2 2]
5
图解匈牙利算法(含python代码) 文章目录算法原理算法步骤算法实现 算法原理 匈牙利算法的问题描述: https://brc2.com/the-algorithm-workshop/ James Munkre在1950年代提出一种的分配问题的解法,时间复杂度在多项式级。 算法步骤 以下6步算法是原始Munkres分配算法(有时称为匈牙利算法)的修改形式。该算法描述了通过对零加星标和底注以及覆盖和揭示行和列来对二维矩阵进行手动操作的过程。这是因为,在出版时(1957年),很少有人可以使用计算机,而且算法是手动执行的。 步骤0: 创建一个称为 阅读详情

相关推荐

超详细!!!匈牙利算法流程以及Python程序实现!!!通俗易懂

前不久在无人机检测跟踪的项目中用到了多目标跟踪算法,其中需要涉及多个目标在两帧之间的匹配问题,最初使用的是最简单的距离最小化原则进行帧间多目标的匹配。后来通过实习和查阅论文等渠道了解到了多目标跟踪领域的Sort和DeepSort算法,其中都使用到了匈牙利算法解决匹配问题,因此开此贴记录一下算法的学习过程。 指派问题概述 首先,对匈牙利算法解决的问题进行概述:实际中,会遇到这样的问题,有n项不同的任...

tommy0095的博客 2万+

匈牙利算法python代码实现以及原理图解

匈牙利算法python代码实现以及原理图解

guoqingru0311的博客 3682

理解匈牙利算法

匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),用于求解指派问题(assignment problem),算法时间复杂度为。Harold Kuhn发表于1955年,由于该算法基于两位匈牙利数学家的早期研究成果,所以被称作“匈牙利算法”。 Python中的scipy.optimize.linear_sum_assignment可以很好的解决这个问题,这里用官方给的例子来讲一下对匈牙利算法的理解 ...

athrunsunny的博客 7589

匈牙利算法与python实现

匈牙利算法 0 引出 最近看DETR论文,发现其通过匈牙利算法来进行预测和ground truth匹配,从而实现set prediction。这个思路很有意思,并且该匹配算法能适用多种问题,因此,对其进行详细记录,便于后续回顾。 首先来看,匈牙利算法能够解决什么问题。不妨以宝可梦作为例子引入。 现在有五个工作(搬砖、送快递、洗衣服、打扫、做饭)需要安排给有5个宝可梦(皮卡丘、杰尼龟、喷火龙、小拳石、妙蛙草)。每个宝可梦对每一项工作收费标准不同。如何安排工作使得成本最低。 (注:①每个宝可梦只能做一项工作;②

weixin_40779727的博客 4530

指派问题 匈牙利算法实现

若能在系数矩阵(bij)中找出n个独立的0元素;则令解矩阵(xij)中对应这n个独立的0元素取值为1,其它元素取值为0。将其代入目标函数中得到zk=0,它一定是最小。这就是以(bij)为系数矩阵的指派问题的最优解。也就得到了问题的最优解。

7.3指派问题及其解法.xmind

运筹学课程总结之后绘制的思维导图

数学建模--整数规划匈牙利算法的Python实现

数学建模--整数规划匈牙利算法的Python实现

m0_71819746的博客 926

指派问题的求解

主要利用了匈牙利算法对运筹学当中的指派问题进行了求解

利用python解决指派问题(匈牙利算法)

利用python解决指派问题(匈牙利算法):https://blog.youkuaiyun.com/your_answer/article/details/79160045

weixin_44021967的博客 664

指派问题,解决原理及示例代码

指派问题,解决原理及示例代码,指派问题也是0-1规划问题,典型的就是工作分配,目标是优化

蓝桥杯单片机开发实战:Keil环境配置与IAP15F2K61S2头文件设置详解

本文详细讲解了为蓝桥杯单片机竞赛配置Keil开发环境的关键步骤,重点解析了IAP15F2K61S2专用头文件的获取与设置方法。通过使用STC-ISP工具添加芯片型号和头文件,确保编译器能正确识别寄存器,是成功进行单片机编程和竞赛备赛的基础。文中还提供了从软件安装、工程创建到常见问题排查的完整实战指南。

soda5的博客 886

python的scipy(匈牙利算法)解决教学任务指派问题

python的scipy(匈牙利算法)解决教学任务指派问题问题简介算法教师与课程一样多 参考资料: 匈牙利算法求解教学任务指派问题 指派问题 问题简介 在生活中经常遇到这样的问题,某单位需完成n项任务,恰好有n个人可承担这些任务。由于每人的专长不同,各人完成任务不同(或所费时间),效率也不同。于是产生应指派哪个人去完成哪项任务,使完成n项任务的总效率最高(或所需总时间最小)。这类问题称为指派问题或...

weixin_42353399的博客 8176

华为路由器静态路由配置实战:从零搭建企业级网络环境(含常见错误排查)

本文以真实企业组网案例为基础,详细解析华为路由器静态路由的实战配置流程。内容涵盖从网络拓扑规划、IP地址分配到具体的`ip route-static`命令配置,并重点讲解了缺省路由、浮动路由等进阶应用。文章还提供了系统化的排错指南,帮助网络工程师规避回程路由缺失、子网掩码错误等常见问题,是掌握企业级网络搭建与维护的实用指南。

weixin_29313817的博客 88

从数学建模到Python实现:匈牙利算法解决指派问题实战

在组合优化与运筹学领域,指派问题是一类经典的整数规划问题,其目标是在满足一对一约束的前提下,实现总成本最小化或总收益最大化。匈牙利算法作为解决该问题的高效专门算法,其核心原理基于矩阵变换与图论中的König定理,通过行列归约、试指派与矩阵调整等步骤,在多项式时间内找到最优匹配。该算法在资源分配、任务调度、运输规划等工程实践中具有重要价值。本文以数学建模赛题为引,深入剖析了匈牙利算法的Python实现细节,涵盖了非方阵处理、浮点数精度以及最大化问题转化等常见工程挑战,并提供了完整的代码实现与性能分析,帮助读者

weixin_34050005的博客 416

Kali使用Metasploit内、外网渗透windows系统

Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具。当H.D. Moore在2003年发布Metasploit时,计算机安全状况也被永久性地改变了。 一、(内网渗透)内网英文缩写WAN;内网又称局域网 局域网的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局域网可以实现文件管理、应用软件共享、打印机共享等功能,在使用过程当中,通过维护局域网网...

QQ670663的博客 2万+

【EMC电磁兼容】02.04——原理图的实战落地细节

原理图上的关于EMC的落地体现一、元器件的选型二、原理图上的EMC体现在哪里?1.芯片电源管脚滤波去耦:2.时钟电路滤波设计3.低速电路滤波抗干扰设计4.通讯接口电路的防护滤波5.系统输入电源端口电路的防护滤波6.系统接地的定义7.芯片软件功能的审查 一、元器件的选型 ​ 原理图最初设计涉及到选型元器件方面: 元器件选型 不仅仅功能需要满足要求,还需要考虑其它细节参数在不同应力下的反应,封装的不同也会产生不同的变化。 元器件替代 常常因为成本原因进行器件替代,除了要考虑功能参数相同时也要考虑系统参数

Time to Forget 2242

关于数学建模中的指派问题总结(匈牙利算法)

前言:匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 其实算法的主要核心在于先到先得,但是后到的是,能抢就抢。 大家这里可能开起来一脸懵逼,但实际上其实没有这么难理解 ...

qq_52528413的博客 1999

8.5华为OD机试真题 新系统 - IPv4 等长子网划分与自动分配系统 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - IPv4 等长子网划分与自动分配系统 (Java/Py/C/C++/Js/Go)

算法大师! 524

匈牙利算法的实现

问题出在:在进行“指派”的时候,方案有很多种,一般来说,先指派0最少的行,输入矩阵的每一行可以理解成一个工人做不同任务的时间,每一列则是每一项任务,不同工人来做需要的时间。遵循选择多的“礼让”选择少的的原则,先指派0最少的行,再指派0多的行,我们将此指派策略为策略A;我想的办法是,当按照“优先指派0少的行”进行指派,得不到完美匹配的时候,穷举所有的指派(当然,可以提前结束穷举,当指派的行数跟策略A有增加的时候可提前结束穷举指派的情况),然后再往下走。

不甘平凡的小鸟的专栏 980

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-知识图谱制作、使用、dify集成

本文探讨了在构建本地RAG(Retrieval-Augmented Generation)系统时,如何通过引入知识图谱来增强系统的知识理解能力。传统的向量数据库和嵌入模型虽然能处理语义匹配,但无法有效捕捉知识间的关联性。知识图谱通过“实体-关系-属性”的结构化表示,能够更好地支持推理、推荐和多跳问答等高级功能。文章详细介绍了知识图谱的基本概念、制作思路,以及如何使用Neo4j图数据库进行知识图谱的构建和查询。通过实例展示了从PDF文件解析到知识图谱入库的全过程,强调了知识图谱在提升RAG系统性能中的重要作用

少说,多做 560

计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽(WidthWidthWidth)和高(HeightHeightHeight)是按同比例缩放的,那么 srcXsrcWidth=dstXdstWidth\frac{srcX}{srcWidth}= \frac{dstX}{dstWidth}srcWidthsrcX​=dstWidthdstX​ ...

FRIGIDWINTER的博客 7280

jonker-volgenant(lapjv:Linear Assignment Problem solver using Jonker-Volgenant algorithm)算法求解指派问题

github工具:https://github.com/src-d/lapjv这个算法用于指派问题,求最小代价,时间复杂度O(n3)在书本上我们学过用匈牙利解法,jonker-volgenant算法(也称lapjv算法)是一个比匈牙利解法更快的算法,算法流程学习中,这里是使用示例

呆萌的代Ma 2830

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

模拟退火算法求解指派问题

模拟退火算法模拟退火算法(Simulated Annealing)求解工作指派问题(Assignment Problem)的Python实现1 简单指派问题nn个工作可以由nn个工人分别完成。工人ii完成工作jj的时间为dijd_{ij}。如何安排可使总工作时间达到极小?2 Python实现# -*- coding: utf-8 -*- ''' basic SA algorithm on assig

一蓑烟雨 4559

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

运筹说 第62期 | 算法介绍之整数规划(二)

本期我们继续进行运筹学之整数规划算法的讲解,我们将对整数规划的基础知识进行一个简单的回顾,并介绍求解隐枚举法和指派问题的MATLAB和Python相关代码,以帮助大家利用工具快速求解整数规划问题,做到事半功倍。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹说”公众号→后台回复“隐枚举法之MATLAB”、“隐枚举法之Python”、“指派问题之MATLAB”、“指派问题之Python”分别获取对应的完整代码。话不多说,我们一起来看看吧! 一、基础知识 1、...

YUNCHOUSHUO的博客 1242

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: ubuntu安装glibc
下一篇: Markdown写矩阵
wq_0708
博客等级 码龄6年 2万+粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值