#algorithm #assignment #kuhn-munkres #munkres

hungarian

匈牙利算法(Kuhn-Munkres)的一个简单、快速的实现

4 个版本 (稳定)

使用旧的 Rust 2015

1.1.1 2020年6月15日
1.1.0 2018年3月16日
1.0.0 2018年3月15日
0.1.0 2018年3月14日

#988算法

Download history 79/week @ 2024-03-11 48/week @ 2024-03-18 111/week @ 2024-03-25 135/week @ 2024-04-01 234/week @ 2024-04-08 51/week @ 2024-04-15 20/week @ 2024-04-22 4/week @ 2024-04-29 106/week @ 2024-05-06 28/week @ 2024-05-13 29/week @ 2024-05-20 30/week @ 2024-06-03 46/week @ 2024-06-10 27/week @ 2024-06-17 40/week @ 2024-06-24

143 每月下载量

MIT 许可证

33KB
538

hungarian

Build Status License Crates.io Rustdoc Crates.io

重要:由 pathfinding 包提供此算法的显著更快的实现(以下为基准测试),使用特质来抽象成本矩阵,并且维护得更好。我推荐使用它。

这是匈牙利算法(或Kuhn-Munkres算法)的一个简单的Rust实现。给定一个 m * n 矩阵(以一维切片表示),应在 O(n^3) 时间内运行,并占用 O(m*n) 空间。

来源于并修改自 这个出色的解释

使用方法

将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
hungarian = "1.1.1"

将以下内容添加到您的二进制文件或库的顶部

extern crate hungarian;

use hungarian::minimize;

然后您就可以开始使用了! 更多信息请参阅文档。

近期更改

  • 1.1.1
    • 版本号增加,以便在 crates.io 上显示 pathfinding 重定向。
  • 1.1.0
    • 性能大幅优化(在5x5到100x100矩阵的基准测试中提高了2-4倍)
    • 现在使用 num-trait 来处理泛型整数权重
    • 现在由 ndarray 支持,以更好地处理更大的输入
  • 1.0.0
    • 源代码文档得到大幅改进
    • hungarian 函数重命名为 minimize
    • 现在可以处理任意矩形矩阵
    • 添加了更多测试用例以覆盖非正方形矩阵
    • 现在返回 Vec<Option<Usize>> 来处理不是所有列都被分配给行的情况
  • 0.1.0
    • 初始发布
    • 基础算法正在工作,但仅适用于正方形矩阵。
    • 文档不足

备注

为了避免在多个文件和辅助函数中重复拆分逻辑,我尝试将上述解释简化并压缩成一个单一、简单的函数,同时保持其正确性。在网上搜索了多个测试用例后,我相当自信我的实现是正确的,尽管最终的结果看起来相当不同。

如果您发现任何错误,请告诉我!

性能

使用 Criterion.rs 获得了以下两种类型的成本矩阵的基准测试结果:

     Worst Case           |       Generic Case
                          |
   -------------          |       -------------
   | 1 | 2 | 3 | ...      |       | 1 | 2 | 3 |
   -------------          |       -------------
   | 2 | 4 | 6 | ...      |       | 4 | 5 | 6 |
   -------------          |       -------------
   | 3 | 6 | 9 | ...      |       | 7 | 8 | 9 |
   -------------          |       -------------
     .   .   .            |
     .   .   .            |
     .   .   .            |
                          |
C(i, j) = (i + 1)(j + 1)  |  C(i, j) = (i * width) + j

基准测试结果

成本矩阵 矩阵大小 hungarian 平均运行时间 pathfinding 平均运行时间
最坏情况 5 x 5 2.42 us 1.19 us
最坏情况 10 x 10 20.38 us 4.24 us
最坏情况 25 x 25 546.88 us 59.66 us
最坏情况 50 x 50 6.97 ms 422.05 us
通用 5 x 5 1.75 us 871.24 ns
通用 10 x 10 7.49 us 3.50 us
通用 25 x 25 86.33 us 33.91 us
通用 50 x 50 556.48 us 285.69 us
通用 100 x 100 3.97 ms 1.93 ms

在四核 2.6GHz Intel(R) i7-6700HQ 处理器和 16GB RAM 的系统上测量;使用 Ubuntu 16.04 Linux x86_64 4.8.0-53-generic

依赖项

~1.5MB
~27K SLoC