匈牙利方法,包含不允许的分配和无法解析的矩阵

时间:2017-02-18 05:58:43

标签: python algorithm matrix hungarian-algorithm

我不是那么精通分配问题并试图找到Munkres的替代方法/匈牙利方法,该方法适用于分配问题的变化,其中:

  1. 不允许某些作业
  2. 可能无法将每个人/行分配到作业/列(在这种情况下,我只想做尽可能多的作业 - 也许是通过查找和使用最大的可解决矩阵)
  3. 我已经能够修改Munkres实现以处理#1,但在以下情况下它会崩溃:

    [  D,   D,   1,   D,   D,   D,   D,   D]
    [  D,   D,   D,   D,   1,   D,   D,   D]
    [  1,   D,   D,   D,   D,   1,   1,   1]
    [  D,   D,   D,   D,   D,   2,   2,   2]
    [  D,   1,   D,   D,   D,   3,   3,   3]
    [  D,   D,   1,   2,   3,   D,   D,   D]
    [  D,   D,   1,   2,   3,   D,   D,   D]
    [  D,   D,   1,   2,   3,   D,   D,   D]
    
    # ("D" = disallowed)
    

    最终无法过去:

    [  D,  D,  0,  D,  D,  D,  D,  D]
    [  D,  D,  D,  D,  0,  D,  D,  D]
    [  0,  D,  D,  D,  D,  0,  0,  0]
    [  D,  D,  D,  D,  D,  0,  0,  0]
    [  D,  0,  D,  D,  D,  0,  0,  0]
    [  D,  D,  0,  0,  2,  D,  D,  D]
    [  D,  D,  0,  0,  2,  D,  D,  D]
    [  D,  D,  0,  0,  2,  D,  D,  D]
    

    我应该使用另一种算法来处理这个吗?或者一些算法方法在将其传递给算法之前检测不可解决的案例(如上所述)(如果我通过每次首次运行算法检测到这些情况,那将会相当昂贵)?

    供参考,这是我正在使用的代码(在Python中): https://github.com/knyte/munkres/blob/master/munkres.py

1 个答案:

答案 0 :(得分:1)

假设您正在最小化最大分配数量的成本,请修改Munkres算法以使用数字对 SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE); ,并使用以下算术和顺序规则:

(a, b)

使用(a, b) + (c, d) = (a + c, b + d) -(a, b) = (-a, -b) (a, b) < (c, d) if and only if a < c or (a = c and b < d). 代替(0, 0)

费用0的解释是(a, b)是不允许分配的数量,a是允许分配的总费用。因此,每个费用b都会映射到c,每个不允许的分配都会映射到(0, c)

当你从Munkres的算法中得到答案时,扔掉所有不允许的作业。