Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
匈牙利算法:I';I’我在尽可能多地分配工作给工人方面遇到了困难 我在C++中创建了匈牙利算法的一个实现。这种实现在许多情况下都非常有效。然而,在某些情况下,我的算法根本不起作用,因为我相信(这是真的),我对算法的一个步骤的实现是错误的_C++_C_Optimization_Hungarian Algorithm - Fatal编程技术网

匈牙利算法:I';I’我在尽可能多地分配工作给工人方面遇到了困难 我在C++中创建了匈牙利算法的一个实现。这种实现在许多情况下都非常有效。然而,在某些情况下,我的算法根本不起作用,因为我相信(这是真的),我对算法的一个步骤的实现是错误的

匈牙利算法:I';I’我在尽可能多地分配工作给工人方面遇到了困难 我在C++中创建了匈牙利算法的一个实现。这种实现在许多情况下都非常有效。然而,在某些情况下,我的算法根本不起作用,因为我相信(这是真的),我对算法的一个步骤的实现是错误的,c++,c,optimization,hungarian-algorithm,C++,C,Optimization,Hungarian Algorithm,我的实现将数组X作为输入,运行算法步骤并生成最终赋值 该算法的步骤可在wiki上找到: 在步骤3中,它具有以下成本数组(工人由行表示,作业由列表示) 然后它说 Initially assign as many tasks as possible then do the following 然而,我不明白这是一个什么样的正确实现。如何分配尽可能多的任务?选择是随机的吗?如果选择是随机的,我可以选择第一个工人做第一份工作,第二个工人做第四份工作,第四个工人做第二份工作。因此,第二个工人被排除在

我的实现将数组
X
作为输入,运行算法步骤并生成最终赋值

该算法的步骤可在wiki上找到:

在步骤3中,它具有以下成本数组(工人由行表示,作业由列表示)

然后它说

Initially assign as many tasks as possible then do the following 
然而,我不明白这是一个什么样的正确实现。如何分配尽可能多的任务?选择是随机的吗?如果选择是随机的,我可以选择第一个工人做第一份工作,第二个工人做第四份工作,第四个工人做第二份工作。因此,第二个工人被排除在外。然而在维基百科中,作者采取了不同的方法。第三名工人必须从事第一份工作,第二名工人必须从事第二份工作,第四名工人必须从事第二份工作。因此,第一个工人被排除在外

执行此类随机操作的问题如下:

0 0 0 0
0 0 0 0
0 0 4 9
0 0 2 3
假设当我们运行算法并对输入进行算术运算时,在将尽可能多的任务分配给工人之前,我们有以下成本矩阵:

2 2 0 3
6 1 6 0
0 0 6 1
0 3 5 3
如果我随机选择将第三份工作分配给第一名工人,将第四份工作分配给第二名工人,然后将第一份工作分配给第三名工人,我将忽略第四名工人。但是为了使算法正确工作,我们需要为工人分配尽可能多的工作。这里是这样吗?不,因为如果不是将第一个作业分配给第三个工人,而是将第一个作业分配给第四个工人,那么我可以将第二个作业分配给第三个工人,因此算法不仅会将尽可能多的作业分配给工人,而且会找到最佳结果

结论:随机分配作业不是一个好方法

我搜索了一下,发现了下面的讲座:

在这堂课中,教授提出了一种不同的方法来解决分配尽可能多的任务的问题。 根据他的说法,如果任何行或列正好有一个零,我们将进行赋值。所以从第一行开始检查第一行 只有一个零,如果是这样,做一个赋值。否则忽略该行并转到第二行,执行相同的操作 通过重新扫描表来重复,直到由于赋值而覆盖了所有的零

通过采用这种方法,可以看出前面的情况已经解决。我们要做的是,我们把第三份工作分配给第一个工人,第四份工作分配给第二个工人,然后我们看到第三个工人可以做两份工作,所以我们暂时忽略他,我们把第一份工作分配给第四个工人,然后回来,以便把第二份工作分配给第三个工人

我的实现遵循这个逻辑,但是,它并不能解决所有的情况

让我们以以下情况为例:

0 0 0 0
0 0 0 0
0 0 4 9
0 0 2 3
第一个工人可以做4份工作,第二个4份,第三个2份和第四个2份。因此,我的实现不执行任何任务,因为我需要至少一个只能执行一项作业的工作人员来执行任务,然后通过重新扫描表来继续。 那么在这种情况下我该怎么办?武断的作业将是一件坏事,不幸的是,在那堂课中没有任何建议。 我只能想到以下几点:

对于每个工作人员,都有一个计数器,其值指示可以分配给他的任务量,那么该行中有多少个零?这就是计数器的值。 然后开始将任意任务分配给计数器最小的工作线程。因此,在这种情况下,每个工人的计数器数组将包括以下值:

4
4
2
2
例如,我会选择第三个工人,并任意分配给他第一份工作。新的计数器将是:

3
3
0
1
2
2
0
0
然后,我会选择第四个工人,完成他唯一的任务(第二份工作)。新的计数器将是:

3
3
0
1
2
2
0
0
然后我可以选择第一个工人或第二个工人。我会为第一个工人做一个任意的任务,然后给他第三份工作。柜台将是

1
0
0
0
最后,我会把第四份作业交给第一份工作

最后的作业是:

0 0 0 *
0 0 * 0
* 0 4 9
0 * 2 3
这似乎是一个很好的方法,但我担心可能有一种特殊情况,这种方法不起作用。我如何验证这种方法是否适用于所有情况,如果不行,什么方法可以完全解决我的问题


提前感谢您

您当前的方法不起作用

您的方法:“然后开始将任意任务分配给具有最小计数器的工作人员。”所有工作人员都有相同的计数器,因此,假设您选择工作人员1并将其分配给任务3,则您只能匹配剩余工作人员中的一个,而使用此矩阵,您显然可以匹配所有三个工作人员


您需要的是这些工作者和任务之间的最大二部匹配,如果相关位置中有0,则一对是可匹配的。这种匹配可以通过手动通过增广路径或使用Hopcroft-Karp算法更快地找到。

匈牙利算法?工人?不可能。。。[/自嘲式讽刺]我喜欢你目前的做法——“我相信(这是真的)”。@H2CO3,我计划发布“你确定这不是希腊算法吗?”但你应该在这里拥有整个房间;)