我正在寻找匈牙利算法的变体(我认为)会将 N 人与自己配对,不包括自我对和反对,其中 N < / em>是偶数。
E.g。给出 N 0 - N 6 和每对成本矩阵 C ,我如何获得3套成本最低的一对?
C = [ [ - 5 6 1 9 4 ]
[ 5 - 4 8 6 2 ]
[ 6 4 - 3 7 6 ]
[ 1 8 3 - 8 9 ]
[ 9 6 7 8 - 5 ]
[ 4 2 6 9 5 - ] ]
在此示例中,结果对将是:
N 0 , N 3
N 1 , N 4
N 2 , N 5
输入后我现在想知道我是否可以增加&#34;下半部分的成本值&#34;矩阵...或甚至更好,删除它们。
匈牙利语的变体是否适用于非方阵?
或者,是否有其他算法可以解决问题的这种变化?
答案 0 :(得分:0)
答案 1 :(得分:0)
增加下半部分的值可能会导致错误的解决方案。您可以看到它,因为上半部分的角坐标(在您的示例中为0,1和5,6)将始终被视为最小X对,其中X是矩阵的大小。
寻找最小X对的我的解决方案
采用标准的Hungarian algorithm
您可以将对角线设置为大于未更改矩阵中元素之和的值-根据您的实现处理空值的方式,此步骤可以使您加快实现速度。
1)标准算法的第一步是遍历每一行,然后遍历每一列,分别缩小每一行和每一列,以使每一行和每一列的最小值为零。这没有改变。
此解决方案的一般原理是将对角线周围的原始算法的每个后续步骤镜像。
2)算法的下一步是选择行和列,以便使用最少的行和列数将每个零都包括在选择中。 我对算法的更改意味着,当选择行/列时,还选择围绕该对角线镜像的列/行,但出于所有目的将其计为一个行或列选择,包括计算对角线(这将是这些对角线的交点)镜像的行/列选择对)只能被选中一次。
3)下一步是检查您是否具有正确的解决方案-在标准算法中这意味着检查选定的行和列数是否等于矩阵的大小-在您的示例中,如果有六行和列已被选中。 但是,对于此变体,在计算何时结束时,算法将每个行/列镜像对选择视为单个行或列选择。如果您有正确的解决方案,请在此处结束算法。
4)如果行和列的数量小于矩阵的大小,则找到最小的未选择元素,并将其称为k。从所有未发现的元素中减去k,并将其添加到覆盖两次的所有元素中(再次,将镜像的行/列选择作为一个选择进行计数)。
我对算法的更改意味着在更改值时,您将同样更改其镜像值(这应该是镜像选择过程的自然结果)。
然后返回步骤2并重复步骤2-4,直到步骤3指示算法已完成。
这将产生成对的镜像答案(它们是坐标,以使这些坐标的值返回原始矩阵),您可以安全地删除每对中的一半。
要更改此算法以找到最小的R对(其中R小于矩阵的大小),请将步骤3中的停止点减小为R。此更改对于回答您的问题至关重要。