Java 匈牙利算法-从中选择0的最后一步,以便每行和每列只选择一个0
我试图用Java实现匈牙利算法。我有一个NxN成本矩阵。我正在一步一步地遵循指南,并已达到步骤9- “通过选择一组零来选择匹配项,以便每一行或 列中只选择了一个。” 我已经有了0的矩阵。 我试图弄明白这一点,唯一对我有效的方法是暴力方法 我还考虑选择遇到的第一个0,删除该列&行并重复;但这种方法不起作用 有什么诀窍或方法吗?不太复杂的东西?如有任何建议,将不胜感激Java 匈牙利算法-从中选择0的最后一步,以便每行和每列只选择一个0,java,algorithm,hungarian-algorithm,Java,Algorithm,Hungarian Algorithm,我试图用Java实现匈牙利算法。我有一个NxN成本矩阵。我正在一步一步地遵循指南,并已达到步骤9- “通过选择一组零来选择匹配项,以便每一行或 列中只选择了一个。” 我已经有了0的矩阵。 我试图弄明白这一点,唯一对我有效的方法是暴力方法 我还考虑选择遇到的第一个0,删除该列&行并重复;但这种方法不起作用 有什么诀窍或方法吗?不太复杂的东西?如有任何建议,将不胜感激 谢谢匈牙利人的回答:) 计算每行和每列的0元素数。(称之为行[]和列[]) 选择行和列的最小正值。例如,将其设为列[3](如果在行
谢谢匈牙利人的回答:)
- 计算每行和每列的
元素数。(称之为0
和行[]
)列[]
- 选择行和列的最小正值。例如,将其设为
(如果在列[3]
中找到最小值,则同样适用,仅交换行和列)。如果有多个具有相同值的行,请选择任意行
- 在该列中选择
元素,并对其进行标记。如果有多个,请选择任意一个值为正值的0
行。(假设它是
)行[1]
- 将
设置为0(下次不应选择)。同时将列[3]
设置为0行[1]
- 迭代
中的所有元素,如果找到列[3]
元素,则将相应的0
值减少1行[i]
- 如果在行或列中都找不到正值,则结束
[[0,1,0],[0,1,1],[1,0,0]]
。它给出了以下赋值:(0;0)、(1;0)、(2;1)
,其中应该是(0;2)、(1;0)、(2;1)
。但是我仍然觉得这个方法不是最优的。我看过一些示例实现,但没有一个是这样做的(或者维基百科的方式)。我认为这可能会导致一个比维基百科建议的更干净的实现。该作业直接作为算法的结果给出,而您的方法需要70多行代码。关于复杂性:匈牙利算法不是我的专长,我不需要自己实现。虽然这项任务并不琐碎,否则就不会在这里被问到,因为这是一个有趣的话题,所以我深入探讨了这个话题。有两种选择:你可以用回溯法解决它(比如“8皇后问题”),或者实现一个特定的算法(因为它可以在一次过程中排序)。该算法背后的逻辑是,那些拥有大量0
s的行/列应该最后保留,而那些只有少量的行/列应该首先选择,这是通过rows/cols数组来衡量的(实际上,它可以由一个大小为2N的数组来表示,其中的索引可以表示一行或一列)。这种索引技巧可能会为您节省大量if语句。