这项任务的最快算法是什么?

时间:2014-03-19 22:08:50

标签: algorithm dynamic-programming

我有一个2x2网格,我有5个令牌。我想把5个令牌中的4个放在网格上。

每个标记具有不同的值,具体取决于它们放置在网格上的位置。基本上如果他们不应该被安置在某个位置,他们被授予20的价值,否则他们的得分低于20。

我正在编写一个程序,需要确定应该放置哪4个令牌,以便使用具有最低值的那些令牌。

我需要程序的这一部分尽可能快。我想知道是否有一个我应该使用的最佳算法。在我的研究中,我遇到了匈牙利算法,但我想知道是否还有其他选择我应该考虑。

以下是问题的一个示例:

我的网格的'位置标记为a,b,c,d ......

+--------+--------+ | c | d | | | | +--------+--------+ | a | b | | | | +--------+--------+

我有以下标记,网格上的每个位置都有相应的值...

a b c d token_p = [20, 20, 15, 20] token_r = [ 1, 1, 20, 20] token_s = [15, 20, 20, 20] token_t = [20, 10, 20, 10] token_u = [20, 20, 5, 20]

答案应该是:

令牌_在位置a(值15)
位置b处的token_r(值1)
位置c处的token_u(值5)
在位置d(值10)的token_t

更新
这是问题的最简单方案。我没想到很简单,不需要算法。 “最难”的情况是拥有一个5x5网格,30个令牌可供选择。

1 个答案:

答案 0 :(得分:1)

基本上,您将五个不同的对象(标记)放入五个不同的位置(四个网格位置,一个遗漏)。每个5! = 120个排列可以是最佳答案。因此,一种解决方案是检查所有排列:120不是那么多。如下所示的一些直接实现将是一个开始:

sum = 0
for p0 in 0..4:
    sum += a[0][p0]
    for p1 in 0..4 if p1!=p0:
        sum += a[1][p1]
        ... and three more nested loops
            best = min (best, sum)
        sum -= a[1][p1]
    sum -= a[0][p0]

这里,a是一个包含成本的5x5数组,就像你的五个令牌数组一样(删除每个令牌的成本为零)。

如果你找到理论上更快的解决方案,我建议对上面的基线解决方案进行基准测试。例如,Hungarian algorithm是O(n ^ 3),而n = 5,不清楚它是否会加速。