指派问题求解(匈牙利算法)
网络所有处理都在浏览器本地完成,数据不上传服务器
输入
把文件拖到这里可直接载入
输出
给定一张代价矩阵(谁做哪个任务要花多少),算出总代价最小(或最大)的一一配对。用的是 O(n³) 的匈牙利算法(Kuhn–Munkres / Jonker–Volgenant),不做阶乘枚举 —— 10×10 就已经是 360 万种排列。输入支持纯数字矩阵(行列自动命名为 R1…、C1…)和带标签写法(第一行是列名、之后每行首个字段是行名)。行数与列数不等也能处理:多出来的行自动留下不派、多出来的任务自动没人做,各自在结果里标出来。结果给出最优指派(每个指派项单独一行、便于复制)与总代价。全部在浏览器本地完成,数据不出这台设备。
功能
- 匈牙利算法求最优解,不做全排列枚举
- 最小化与最大化都支持
- 行数与列数不等自动处理,并列出未指派的行 / 任务
- 纯数字矩阵与带标签矩阵两种输入,自动判断
- 每个指派项单独一行,可单独复制
- 给出总代价(最大化时显示为总收益)
- 可要求方阵,非方阵时明确报错
- 结果是可证明的最优解,算法有已知最优解的断言把关
使用方法
- 把代价矩阵粘进输入框(纯数字或带行 / 列名都行)
- 选择问题类型:最小化或最大化
- 非方阵时选择自动处理或要求方阵
- 结果实时出现,逐行复制需要的指派
常见问题
- 输入的矩阵格式是什么?
- 两种都可以。① 纯数字:每行是同一行的一组代价,用空格或逗号分隔,行列自动命名为 R1…、C1…。② 带标签:第一行是列名,其后每行的第一个字段是行名,剩下的是该行的代价。判断规则是「第一行只要有一个字段不是数字就按带标签解析」,所以纯数字的表不会被误判。
- 行数和列数不一样怎么办?
- 在「自动处理」模式下,行多于列时会补上代价为 0 的虚拟列,最后把没人派到的行标出来;列多于行时同理补虚拟行,把没人做的任务标出来。这样每一行、每一列的约束都得到满足,同时总代价仍然是最优的。若你希望严格方阵,把选项改成「要求方阵」即可。
- 这个最优解可靠吗?
- 可靠。用的是标准的最短增广路匈牙利算法,复杂度 O(n³),对任意实数代价矩阵都能求到全局最优。仓库里有一条测试用 5×5 的已知最优矩阵(最优 13)钉住结果,另有一条用 4×4 的暴力枚举做交叉验证。
- 最大化是怎么处理的?
- 把代价取负后求最小 —— 数学上等价于求最大。结果里显示的是原始的收益值之和,并标成「总收益」,不会让你看到一堆负数。
相关工具
矩阵转 JSON
转换在矩阵文本与 JSON 二维数组之间互转:数字保持数字类型,行长度不齐会指名道姓地报出来,全部在浏览器本地完成。
分数计算
转换分数约分、最大公约数与最小公倍数、小数转分数、分数四则运算。全程用 BigInt 计算,超大整数不会丢精度。
数学表达式计算
网络逐行求值数学表达式:优先级与括号、幂与开方、三角与对数函数,还能定义变量复用。不使用 eval。
URL 解析
网络在线 URL 解析:拆出协议、主机、端口、路径、查询参数与锚点,参数逐个解码并与原始值对照,缺协议自动补 https://。全部在浏览器本地完成。
UA 解析
网络在线 User-Agent 解析:识别浏览器、版本、操作系统、设备类型与渲染引擎,并列出命中的匹配规则。结果基于模式匹配,仅供参考。全部在浏览器本地完成。
HTTP 状态码
网络HTTP 状态码查询与速查:输入编号查含义、1xx 到 5xx 分类、常见场景与排查提示,也能用关键词反查编号。全部在浏览器本地完成。