我不是那么精通分配问题并试图找到Munkres的替代方法/匈牙利方法,该方法适用于分配问题的变化,其中:
我已经能够修改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
答案 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的算法中得到答案时,扔掉所有不允许的作业。