我看了几篇关于匈牙利算法解决分配问题的解释,其中绝大多数只涵盖了非常简单的情况。
我找到的最易懂的解释是一个YouTube视频。
我能编写算法,但我担心有一个特殊情况。如果你观看视频,相关情况从31:55到37:42进行了解释,但我会在下面解释一下。
首先,我要提到我将处理一个300 x 300矩阵,因此无法进行视觉检查。此外,我需要找到所有最小分配。换句话说,如果有多个分配产生相同的最小值,我需要找到它们所有。
这是我担心的特定情况。你可以在YouTube视频中看到这个解释,但我会在这里解释一下。我们从这个矩阵开始:
当我们减少行和列时,我们得到这个:
(Let me mention that I can visually see there are 4 solutions to this matrix and the total score is 13.)
给定上述简化矩阵,任何行或列中都没有唯一的零元素,因此根据视频中描述的算法,我可以任意选择任何一个零元素进行分配,所以我选择(1,1)。
我将已分配的零用星号标记,并在不再考虑的行和列中的零旁边放置“x”。现在我们有这个:
接下来,我们继续检查具有唯一零点的行。我们在(3,2)处找到了一个,因此我们用星号标记它,并用"x"标记不可用的零点。
接下来,我们开始在列中寻找独特的零(因为所有行都已经遍历完)。我们发现第三列在(2,3)处有一个独特的零,因此我们标记它:
此时,没有更多可用的零,并且第4行未被分配。(此YouTube视频现在使用“打勾过程”,这是一种确定覆盖所有零所需的最小行数的常见技术。如果您不熟悉此技术,请参见14:10到16:00的解释,尽管演示者使用的矩阵与此处显示的不同)。“打勾过程”如下:
我可以采取的一种方法(我不确定是否最好),当面临任意分配时,是从可用任意选择最少的行或列中进行分配。在这个例子中,这意味着我会从只有两个任意选择的第3行或第4行进行任意分配,而不是从有四个任意选择的第1行或第2行进行分配。当然,由于我需要所有正确的解决方案,每当进行任意分配时,都必须遍历所有可用的任意分配。例如,如果我选择(3,1)作为任意分配,我还必须稍后分配(3,2)。
我的问题是,在面临任意选择零进行分配的选择时,最好的方法是什么?是我在前面提到的方法吗?如何消除像所示的死胡同解决方案?请记住,我仍然需要枚举所有具有相同最小分数的解决方案。
我找到的最易懂的解释是一个YouTube视频。
我能编写算法,但我担心有一个特殊情况。如果你观看视频,相关情况从31:55到37:42进行了解释,但我会在下面解释一下。
首先,我要提到我将处理一个300 x 300矩阵,因此无法进行视觉检查。此外,我需要找到所有最小分配。换句话说,如果有多个分配产生相同的最小值,我需要找到它们所有。
这是我担心的特定情况。你可以在YouTube视频中看到这个解释,但我会在这里解释一下。我们从这个矩阵开始:
3 1 1 4
4 2 2 5
5 3 4 8
4 2 5 9
当我们减少行和列时,我们得到这个:
0 0 0 0
0 0 0 0
0 0 1 2
0 0 3 4
(Let me mention that I can visually see there are 4 solutions to this matrix and the total score is 13.)
给定上述简化矩阵,任何行或列中都没有唯一的零元素,因此根据视频中描述的算法,我可以任意选择任何一个零元素进行分配,所以我选择(1,1)。
我将已分配的零用星号标记,并在不再考虑的行和列中的零旁边放置“x”。现在我们有这个:
0* 0x 0x 0x
0x 0 0 0
0x 0 1 2
0x 0 3 4
接下来,我们继续检查具有唯一零点的行。我们在(3,2)处找到了一个,因此我们用星号标记它,并用"x"标记不可用的零点。
0* 0x 0x 0x
0x 0x 0 0
0x 0* 1 2
0x 0x 3 4
接下来,我们开始在列中寻找独特的零(因为所有行都已经遍历完)。我们发现第三列在(2,3)处有一个独特的零,因此我们标记它:
0* 0x 0x 0x
0x 0x 0* 0x
0x 0* 1 2
0x 0x 3 4
此时,没有更多可用的零,并且第4行未被分配。(此YouTube视频现在使用“打勾过程”,这是一种确定覆盖所有零所需的最小行数的常见技术。如果您不熟悉此技术,请参见14:10到16:00的解释,尽管演示者使用的矩阵与此处显示的不同)。“打勾过程”如下:
- 打勾所有没有分配零的行(第4行)。
- 对于每个被打勾的行,在该行中包含零的列也打勾。
- 对于步骤2中打勾的每个列,打勾具有已分配零的相应行。
- 重复步骤2和3,直到无法再打勾为止。
- 通过所有打勾的列和未打勾的行画线。
我可以采取的一种方法(我不确定是否最好),当面临任意分配时,是从可用任意选择最少的行或列中进行分配。在这个例子中,这意味着我会从只有两个任意选择的第3行或第4行进行任意分配,而不是从有四个任意选择的第1行或第2行进行分配。当然,由于我需要所有正确的解决方案,每当进行任意分配时,都必须遍历所有可用的任意分配。例如,如果我选择(3,1)作为任意分配,我还必须稍后分配(3,2)。
我的问题是,在面临任意选择零进行分配的选择时,最好的方法是什么?是我在前面提到的方法吗?如何消除像所示的死胡同解决方案?请记住,我仍然需要枚举所有具有相同最小分数的解决方案。