寻找最佳得分组合的算法

标签 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

有了这 2 场比赛和每种可能结果的分值,这里是我希望看到的有序组合列表。请注意,组合 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 << 组合总数 (3^N)。

我花了很多时间试图想出一种算法来选择这些组合,但我做空了。如果能给我指明正确方向的任何建议,我将不胜感激。

谢谢

最佳答案

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

您还需要一种方法来快速识别您看到的特定组合。为此,您的组合表示需要具有哈希函数。为您探索过的组合创建一个哈希集。

计算最佳组合很简单:您可以通过获取 N 游戏中每一个游戏的最高值(value)结果来实现。将此组合添加到优先级队列中,然后运行以下循环:

  • 将下一个最佳组合出列,并将其添加到结果列表中。
  • 如果结果列表的长度是M,你就完成了
  • 否则,遍历当前组合,并从中产生最多 2N 个“派生”组合
  • 在单个游戏结果中,每个派生组合都不同于当前组合
  • 将每场比赛的结果从最好到第二好,再到最差。
  • 根据您探索过的组合的哈希集检查具有“翻转”结果的组合
  • 如果这是一个新的组合,将其添加到哈希集和优先级队列中
  • 完成派生组合后,将队列缩减为 M-res 个项目,其中 res 是结果列表中的项目数
  • 继续下一次迭代。

关于寻找最佳得分组合的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24877659/

相关文章:

algorithm - 选择具有元素权重的随机排列

java - 在二叉搜索树中计算 "sticks"(有一个 child 的节点)?

java - 使用某些操作找到相应的电线起点和终点所需的行程数

c++ - 用数字对 std::strings 进行排序?

javascript - 通过自定义字母表javascript对字符串函数进行排序

c++ - 如何优化解析数据流算法?

algorithm - 算法在最坏情况下的运行时间

git - 如何对 git 分支输出进行版本排序(与通常的字母/字典排序相比)

c - 带有字母数字文件名的 qsort 动态二维字符数组 - C 程序

php - 数组按第一个值排序