piapia123
zh

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

网络

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

给定一张代价矩阵(谁做哪个任务要花多少),算出总代价最小(或最大)的一一配对。用的是 O(n³) 的匈牙利算法(Kuhn–Munkres / Jonker–Volgenant),不做阶乘枚举 —— 10×10 就已经是 360 万种排列。输入支持纯数字矩阵(行列自动命名为 R1…、C1…)和带标签写法(第一行是列名、之后每行首个字段是行名)。行数与列数不等也能处理:多出来的行自动留下不派、多出来的任务自动没人做,各自在结果里标出来。结果给出最优指派(每个指派项单独一行、便于复制)与总代价。全部在浏览器本地完成,数据不出这台设备。

功能

  • 匈牙利算法求最优解,不做全排列枚举
  • 最小化与最大化都支持
  • 行数与列数不等自动处理,并列出未指派的行 / 任务
  • 纯数字矩阵与带标签矩阵两种输入,自动判断
  • 每个指派项单独一行,可单独复制
  • 给出总代价(最大化时显示为总收益)
  • 可要求方阵,非方阵时明确报错
  • 结果是可证明的最优解,算法有已知最优解的断言把关

使用方法

  1. 把代价矩阵粘进输入框(纯数字或带行 / 列名都行)
  2. 选择问题类型:最小化或最大化
  3. 非方阵时选择自动处理或要求方阵
  4. 结果实时出现,逐行复制需要的指派

常见问题

输入的矩阵格式是什么?
两种都可以。① 纯数字:每行是同一行的一组代价,用空格或逗号分隔,行列自动命名为 R1…、C1…。② 带标签:第一行是列名,其后每行的第一个字段是行名,剩下的是该行的代价。判断规则是「第一行只要有一个字段不是数字就按带标签解析」,所以纯数字的表不会被误判。
行数和列数不一样怎么办?
在「自动处理」模式下,行多于列时会补上代价为 0 的虚拟列,最后把没人派到的行标出来;列多于行时同理补虚拟行,把没人做的任务标出来。这样每一行、每一列的约束都得到满足,同时总代价仍然是最优的。若你希望严格方阵,把选项改成「要求方阵」即可。
这个最优解可靠吗?
可靠。用的是标准的最短增广路匈牙利算法,复杂度 O(n³),对任意实数代价矩阵都能求到全局最优。仓库里有一条测试用 5×5 的已知最优矩阵(最优 13)钉住结果,另有一条用 4×4 的暴力枚举做交叉验证。
最大化是怎么处理的?
把代价取负后求最小 —— 数学上等价于求最大。结果里显示的是原始的收益值之和,并标成「总收益」,不会让你看到一堆负数。

相关工具