Python中的Hungarian算法2025年1月5日 | 阅读6分钟 引言作为一名信息研究员或程序员,当需要以最佳方式分配资源给任务时,你经常会遇到优化困难。其中一个问题就是分配问题,我们需要根据成本或价值来决定如何最好地分配资源给任务。解决这个问题的流行方法之一是匈牙利算法。本文将探讨匈牙利算法,并在 Python 中进行实现。 什么是分配问题?你可以将分配问题定义如下:给定一组资源和一组任务,其中每个资源只能用于一项任务,每个任务也只需要一项资源,我们需要选择一个分配方案,使得总成本最小或总价值最大。这个问题出现在许多领域,包括匹配问题、工作调度和生产计划。 线性分配问题需要最大化可用的资源数量,同时最小化花费的金额。例如,考虑下面的 2D 网格,其中每一行代表一个特定的供应商,每一列代表聘请该供应商生产特定商品的成本。每个供应商仅限于专门生产其中一种产品。对于网格中的每个列和行,只能选择一个元素,并且所选元素的总成本应被最小化(最小成本使用)。 匈牙利算法:概述匈牙利算法(也称为 Kuhn-Munkres 算法)是一种强大的策略,可以在多项式时间内解决分配问题。它使用组合优化技术来识别最佳分配。该方法通过“对偶性”技术来简化问题,并依赖于在二分图中寻找增广路径。 匈牙利算法用于确定最佳分配的步骤如下:
Python 实现匈牙利算法SciPy 库中有一个名为 `linear_sum_assignment` 的函数,它实现了匈牙利算法来解决分配问题,允许我们在 Python 中实现匈牙利算法。以下是应用它的示例: 在此示例中,我们构建了一个成本矩阵来表示将三个资源分配给三个任务的成本。然后使用 `linear_sum_assignment` 函数找到最佳分配。该函数返回的两个数组 `row_indices` 和 `col_indices` 包含最佳分配的行和列索引。然后提取分配,并打印结果。 给定一个大小为 N*N 的二维数组 arr,其中 arr[i][j] 表示第 i 个工人完成第 j 项任务的成本。任何工人都可以被分配执行任何任务。目标是将任务分配出去,以便每个工人一次只能专注于一项任务,同时最小化分配的总成本。 示例在本文中,对该问题进行了多种解决方案的描述。 方法将使用匈牙利算法解决此问题。算法的工作原理如下:
为了理解该策略,请考虑以下示例: 设二维数组为: 步骤 1:从每行中减去最小值。分别从第 1、2 和 3 行中减去 2、3 和 2000。 步骤 2:从每列中减去最小值。分别从第 1、2 和 3 列中减去 0、1500 和 0。 步骤 3:用最少数量的水平线和垂直线覆盖所有零。 ![]() 步骤 4:发现最优分配,因为需要三条线来覆盖所有零。 因此,最佳成本为 4000 + 3500 + 2000 = 9500。 目标是使用 dlib 包中的 `max_cost_assignment()` 函数来构建过程。匈牙利算法,有时也称为 Kuhn-Munkres 算法,在该函数中实现,并需要 O(N^3) 的时间来完成。这样就解决了最佳分配问题。 上述策略的应用如下所示: 输出 5
结论匈牙利策略是一种快速解决分配问题的有效方法。该算法通过在二分图中寻找增广路径来确定最佳分配,以最小化成本或最大化价值。本文分析了匈牙利技术,并在 Python 中使用了 SciPy 包。作为一名信息研究员或程序员,您可以使用这项技能来利用匈牙利算法解决作业分配问题。 匈牙利策略只是可用的多种优化算法之一;在为特定情况选择最佳算法之前,理解约束和问题上下文至关重要。 |
? 任务自动化是编程中的一个典型需求。其中一项任务是管理文件和目录。Python,一种多功能且强大的编程语言,提供了各种模块和函数来高效地管理文件系统操作。一个常见的场景是创建一个...
阅读 4 分钟
简介:在本教程中,我们将学习 NumPy,这是一个广泛用于 Python 中数值运算的库,它提供了一种强大的插值方法,称为 numpy.interp()。此方法在估计已知数据点之间的值方面起着至关重要的作用,使其成为各种科学和数据分析应用中的宝贵工具。在本文中,... .
阅读 3 分钟
? 在 Python 函数中设置默认参数值是一种便捷的方式,可以为参数分配一个默认值,当调用函数时没有为该参数提供任何参数时,将使用该默认值。此功能通过允许……来增强代码的灵活性和可读性。
阅读 17 分钟
置信区间是一个统计学术语,它指定了最有可能包含未知参数真实值的数值范围。它计算与统计估计相关的误差范围或不确定性。在推断统计学中,置信区间被广泛使用……
7 分钟阅读
简介 处理日期是编程的重要组成部分,Python 提供了对日期和时间的有效操作。日期表示是其中一个重要部分,因为它有助于以人类理解的格式表示日期。这份全面的指南讨论了 python 的 datetime 模块...
阅读 3 分钟
引言:数据操作和分析是任何数据科学或机器学习项目的重要方面。在 Python 中,Pandas 库是一个强大的工具,可以高效地完成这些任务。数据操作中的一个关键操作是数据集的合并,Pandas 提供了...
阅读 3 分钟
为什么 C 代码比 Python 代码运行得快?了解 C 编程语言 C 是一种标准的、过程式的编程语言,由 Dennis Ritchie 于 20 世纪 70 年代初在贝尔实验室开发。它已成为有史以来使用最广泛的编程语言之一,尤其...
阅读 4 分钟
Weightipy:它是什么?在处理调查或普查数据时,Weightipy 库可用于对个人数据进行加权计算。它支持最新版本的 NumPy 和 Pandas,比 Quantipy 更有效地处理加权,并且运行速度更快。RIM...
7 分钟阅读
假设我们有一个字典。另外,我们还有两个词;让这些词是 A 和 B。在这个问题中,我们必须找到从 A 到 B 的最短链(如果存在),并返回这个最短链的长度。...
阅读9分钟
马尔可夫链简介 马尔可夫链,以俄罗斯数学家安德烈·马尔可夫命名,是一种数值框架,根据某些概率标准在状态之间进行转换。它们是概率论中的一个基本概念,在不同领域有着广泛的应用,...
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India