用于找到最佳得分组合的算法

时间:2014-07-22 01:48:13

标签: algorithm sorting

我正在寻找一种算法来识别最大化总分的游戏结果组合。组合的规则 如下:

  • 共有N场比赛
  • 每场比赛都有3种可能的结果(胜利,失败或平局)
  • 每个结果都有正面或负面评分

找出大小为N的最高结果组合,以便最大化总分

例如,N = 2:

Game 1, Outcome 1 = +3 points
Game 1, Outcome 2 = -1 points
Game 1, Outcome 3 = -3 points

Game 2, Outcome 1 = -3 points
Game 2, Outcome 2 = +1 points
Game 2, Outcome 3 = +3 points

对于每个可能的结果,这两个游戏和点值,这是我期望看到的有序组合列表。请注意,组合4,5和6是关系,所以它们可以在这里以任何顺序。

Combination 1 = (Game 1, Outcome 1) + (Game 2, Outcome 3) -> Total +6 points
Combination 2 = (Game 1, Outcome 1) + (Game 2, Outcome 2) -> Total +4 points
Combination 3 = (Game 1, Outcome 2) + (Game 2, Outcome 3) -> Total +2 points
Combination 4 = (Game 1, Outcome 1) + (Game 2, Outcome 1) -> Total  0 points
Combination 5 = (Game 1, Outcome 2) + (Game 2, Outcome 2) -> Total  0 points
Combination 6 = (Game 1, Outcome 3) + (Game 2, Outcome 3) -> Total  0 points
Combination 7 = (Game 1, Outcome 3) + (Game 2, Outcome 2) -> Total -2 points
Combination 8 = (Game 1, Outcome 2) + (Game 2, Outcome 1) -> Total -4 points
Combination 9 = (Game 1, Outcome 3) + (Game 2, Outcome 1) -> Total -6 points

我可以通过蛮力为N的小值计算这些有序组合,但是假设总共有3 ^ N个组合并且N可以大到128,我不希望暴力工作很长时间。所以,我正在寻找一种方法来识别前M个组合,其中M <&lt;组合的总数(3 ^ N)。

我花了很多时间试图用一种算法来挑选这些组合,但我还是做得很短。我很感激任何能指出正确方向的建议。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用Priority Queue迭代生成M个组合。首先,您需要创建一个表示单个组合的数据结构,以及计算其得分的函数。例如,您可以使用表示结果数量的N小整数数组。使用score功能对队列中的组合进行排序。

您还需要一种快速识别您已经看过特定组合的方法。为此,您的组合表示需要具有哈希函数。制作您已探索过的组合的哈希集。

计算顶级组合是微不足道的:你可以通过获取每个N游戏的最高价值结果来做到这一点。将此组合添加到优先级队列,然后运行以下循环:

  • 将下一个最佳组合出列,并将其添加到结果列表中。
  • 如果结果列表的长度为M,则表示您已完成
  • 否则,请浏览当前组合,并从中生成最多2N个“派生”组合
  • 每个衍生组合与单个游戏结果中的当前组合不同
  • 将每场比赛的结果从最好的翻到最好的,然后翻到最差的。
  • 根据您探索过的组合的哈希集检查组合的“翻转”结果
  • 如果这是一个新组合,请将其添加到哈希集以及优先级队列
  • 完成派生组合后,将队列缩小到M-res个项目,其中res是结果列表中的项目数
  • 继续下一次迭代。