我有一个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个令牌可供选择。
答案 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,不清楚它是否会加速。