我正在寻找一种有效的算法来解决在1-12之间安排一组循环数字以获得最高分数的问题。
排列的得分由其所有相邻对的得分总和给出
要获得相邻对(a,b)的分数,请计算以下步骤:
1. Find x such that (a+x) mod 12 = b
2. Look up x in a score table
3. The value in the score table at index 'x' is the score of the pair (a,b).
对于每个相邻的对重复这个,并且总和是该安排的分数。
Here is an example:
Suppose the score table is [5,4,6,7,2,7,-2,-6,-8,-2,6,12,13]
Consider these numbers: 5, 12, 8, 9
For each adjacent pairs,
the values for x are: 5 -> 12: 7
12 -> 8: 8
8 -> 9: 1
9 -> 5: 8
The values for score[x] are:
score[7] = -6
score[8] = -8
score[1] = 4
score[8] = -6
The sum of the score[x] values is: (-6) + (-8) + (4) + (-6)
= -18
目标是提出一种算法,有效地安排数字以最大化分数,给定数字本身 - 最多20个在1到12之间 - 和分数表。
非常感谢,
答案 0 :(得分:0)
您可以使用精确的TSP求解器解决此问题。
想象一下,有一组城市,每个都有一个"值"。我们会说城市x
的价值是V(x)
。现在想象一下,从城市x
到y
的旅行费用为S(V(y) - v(X) (mod 12))
。请注意,S
是您的分数表,V(y) - V(x) (mod 12)
是要在分数表中查找的值。
TSP的目标是找到您应该访问所有城市的订单,以优化您的成本 - 在这种情况下,您希望最大化您的成本。 (或者,您可以将评分功能设为负值并最大限度地降低成本。)
也就是说,TSP会为您提供优化分数的城市集合的排列。由于您的城市实际上是您在置换时感兴趣的值,因此它会为您提供值,从而产生最佳分数。
所以..查找一个程序或库,可以指定从城市x
飞到城市y
的费用,然后让它运行,它会给你城市的最佳排列 - 然后您可以使用值(V(id)
)替换城市ID,以获得您正在寻找的最佳解决方案。
您也可以编写自己的TSP求解器 - 分支&绑定技术看起来很受欢迎。