Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匈牙利算法-从中选择0的最后一步,以便每行和每列只选择一个0_Java_Algorithm_Hungarian Algorithm - Fatal编程技术网

Java 匈牙利算法-从中选择0的最后一步,以便每行和每列只选择一个0

Java 匈牙利算法-从中选择0的最后一步,以便每行和每列只选择一个0,java,algorithm,hungarian-algorithm,Java,Algorithm,Hungarian Algorithm,我试图用Java实现匈牙利算法。我有一个NxN成本矩阵。我正在一步一步地遵循指南,并已达到步骤9- “通过选择一组零来选择匹配项,以便每一行或 列中只选择了一个。” 我已经有了0的矩阵。 我试图弄明白这一点,唯一对我有效的方法是暴力方法 我还考虑选择遇到的第一个0,删除该列&行并重复;但这种方法不起作用 有什么诀窍或方法吗?不太复杂的东西?如有任何建议,将不胜感激 谢谢匈牙利人的回答:) 计算每行和每列的0元素数。(称之为行[]和列[]) 选择行和列的最小正值。例如,将其设为列[3](如果在行

我试图用Java实现匈牙利算法。我有一个NxN成本矩阵。我正在一步一步地遵循指南,并已达到步骤9-

“通过选择一组零来选择匹配项,以便每一行或 列中只选择了一个。”

我已经有了0的矩阵。 我试图弄明白这一点,唯一对我有效的方法是暴力方法

我还考虑选择遇到的第一个0,删除该列&行并重复;但这种方法不起作用

有什么诀窍或方法吗?不太复杂的东西?如有任何建议,将不胜感激


谢谢

匈牙利人的回答:)

  • 计算每行和每列的
    0
    元素数。(称之为
    行[]
    列[]
  • 选择行和列的最小正值。例如,将其设为
    列[3]
    (如果在
    中找到最小值,则同样适用,仅交换行和列)。如果有多个具有相同值的行,请选择任意
  • 在该列中选择
    0
    元素,并对其进行标记。如果有多个,请选择任意一个值为正值的
    行。(假设它是
    行[1]
  • 列[3]
    设置为0(下次不应选择)。同时将
    行[1]
    设置为0
  • 迭代
    列[3]
    中的所有元素,如果找到
    0
    元素,则将相应的
    行[i]
    值减少1
  • 如果在行或列中都找不到正值,则结束

您是否成功地实现了下面的算法?有问题吗?非常感谢,这真的很有帮助。我为延迟道歉。它似乎不适用于矩阵
[[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
语句。