这里的匈牙利算法的理论部分可见胡运权所著的《运筹学教程》,本文对于理论部分只是简单介绍,主要是针对python实现进行讲解。
一、指派问题
指派问题是一个特殊的0-1规划问题。
1.标准形式指派问题
有n个人和n件事,已知第i人做第j事的费用为,要求确定人和事之间的一一对应的指派方案,使完成这n件事的总费用最少。
2.非标准形式的指派问题
非标准的指派问题可以转化为标准形式。一般有一下几种非标准形式。
2.1.最大化指派问题
寻找系数矩阵中最大元素m,将m分别减去矩阵中的每个元素,对其系数矩阵求解就可以得到与原问题相同最优解。
2.2.人数和事数不等的指派问题
添加一些虚拟的人或事儿,并添加的系数全为0,保证系数矩阵为方阵
2.3.一个人可做几件事的指派问题
若某个人可以做几件事,则可以将该人化作几个相同的人来接受指派,这几个人费用都一样
2.4.某事一定不能由某人做的指派问题
若某事一定不能由某人做,则可将相应的费用系数取足够大的数M。
二、匈牙利算法
1.算法流程
对于标准的指派问题,匈牙利解法的一般步骤如下:
1、对系数矩阵行规约和列规约,保证每一行每一列都有零元素
2、确定系数矩阵中的独立零元素。若独立零元素的个数要小于系数矩阵的维度,则进行转到步骤三;若个数等于系数矩阵的维度,则已经找到最优解。
3、继续变换系数矩阵,方法是在未被直线覆盖的元素中找到一个最小的元素,对未被直线所覆盖的行中各元素都减去这一最小元素。这样的操作会产生负元素,因此需要进一步消除负元素,对负元素所在的列中加上这一最小元素,得到新的系数矩阵,返回步骤2.
若要实现匈牙利算法,比