我正在寻找一种算法来识别最大化总分的游戏结果组合。组合的规则 如下:
找出大小为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)。
我花了很多时间试图用一种算法来挑选这些组合,但我还是做得很短。我很感激任何能指出正确方向的建议。
由于
答案 0 :(得分:1)
您可以使用Priority Queue迭代生成M
个组合。首先,您需要创建一个表示单个组合的数据结构,以及计算其得分的函数。例如,您可以使用表示结果数量的N
小整数数组。使用score功能对队列中的组合进行排序。
您还需要一种快速识别您已经看过特定组合的方法。为此,您的组合表示需要具有哈希函数。制作您已探索过的组合的哈希集。
计算顶级组合是微不足道的:你可以通过获取每个N
游戏的最高价值结果来做到这一点。将此组合添加到优先级队列,然后运行以下循环:
M
,则表示您已完成2N
个“派生”组合M-res
个项目,其中res
是结果列表中的项目数