搜索算法以生成按首选项排序的组合

蒂姆·迪恩

我正在尝试寻找一种算法来识别结果的有序组合,如下所示:

  • N个比赛,每个比赛有3个互斥结果(胜利,失败或平局),总共3N个结果和3 ^ N个组合
  • 已为3N个可能结果中的每个结果分配了唯一的排名,最可取的结果为1N,最不优选的结果为3N
  • 从包含最优选排名结果的组合开始,查找每个竞赛的前M个结果组合。

例如,假设N = 3,并且结果排名如下:

Contest 1 Win = 1
Contest 1 Tie = 4
Contest 1 Loss = 7
Contest 2 Win = 2
Contest 2 Tie = 5
Contest 2 Loss = 8
Contest 3 Win = 3
Contest 3 Tie = 6
Contest 3 Loss = 9

根据这些排名,组合的排序应如下:

Contest 1 Win  (1), Contest 2 Win  (2), Contest 3 Win  (3)
Contest 1 Win  (1), Contest 2 Win  (2), Contest 3 Tie  (6)
Contest 1 Win  (1), Contest 2 Win  (2), Contest 3 Loss (9)
Contest 1 Win  (1), Contest 2 Tie  (5), Contest 3 Win  (3)
Contest 1 Win  (1), Contest 2 Loss (8), Contest 3 Win  (3)
Contest 1 Win  (1), Contest 2 Tie  (5), Contest 3 Tie  (6)
Contest 1 Win  (1), Contest 2 Tie  (5), Contest 3 Loss (9)
Contest 1 Win  (1), Contest 2 Loss (8), Contest 3 Win  (6)
Contest 1 Win  (1), Contest 2 Loss (8), Contest 3 Loss (9)
Contest 1 Tie  (4), Contest 2 Win  (2), Contest 3 Win  (3)
Contest 1 Loss (7), Contest 2 Win  (2), Contest 3 Win  (3)
Contest 1 Tie  (4), Contest 2 Win  (2), Contest 3 Tie  (6)
Contest 1 Tie  (4), Contest 2 Win  (2), Contest 3 Loss (9)
Contest 1 Loss (7), Contest 2 Win  (2), Contest 3 Tie  (6)
Contest 1 Loss (7), Contest 2 Win  (2), Contest 3 Loss (9)
Contest 1 Tie  (4), Contest 2 Tie  (5), Contest 3 Win  (3)
Contest 1 Tie  (4), Contest 2 Loss (8), Contest 3 Win  (3)
Contest 1 Loss (7), Contest 2 Tie  (5), Contest 3 Win  (3)
Contest 1 Loss (7), Contest 2 Loss (8), Contest 3 Win  (3)
Contest 1 Tie  (4), Contest 2 Tie  (5), Contest 3 Tie  (6)
Contest 1 Tie  (4), Contest 2 Tie  (5), Contest 3 Loss (9)
Contest 1 Tie  (4), Contest 2 Loss (8), Contest 3 Tie  (6)
Contest 1 Tie  (4), Contest 2 Loss (8), Contest 3 Loss (9)
Contest 1 Loss (7), Contest 2 Tie  (5), Contest 3 Tie  (6)
Contest 1 Loss (7), Contest 2 Tie  (5), Contest 3 Loss (9)
Contest 1 Loss (7), Contest 2 Loss (8), Contest 3 Tie  (6)
Contest 1 Loss (7), Contest 2 Loss (8), Contest 3 Loss (9)

我正在寻找一种生成这些组合的方法,以获取任意大的N值,尽管我并不希望获得所有组合。例如,对于N = 256和总共3 ^ 256个组合,我希望找到前500个组合。

奈通

首先,让我们重新描述问题,以便抽象出细节并确保我们正在谈论同一问题。

存在3 ^ N个长度为N的元组。每个元组的分量a_i(a_1,a_2,...,a_N)是介于1到3N(含1和3N)之间的不同整数,并且对于固定i,a_i只能采用子集中的值S_i,具有基数3。对于[1,3N]中的每个值,元组中只有一个位置可以假定该值。

现在,通过sorted(S)表示以整数的自然顺序对元组S的组成部分进行排序而得出的元组。我们说一个元组S小于一个元组T,如果按字典顺序,sorted(S)小于sorted(T)。

问题在于在3 ^ N个现有元组中找到给定顺序的前M个元组,其中M << 3 ^ N。

我看到的解决方案原理实质上是通过修剪回溯。

要以临界方式修剪搜索空间,请计算不大于M的3的最高幂。假设此幂为H。我们有3 ^(H + 1)> M> = 3 ^ H。到那时,您知道您的M个元组位于一个集合中,其中(NH-1)个元组组件取其最小可能值。可以按以下步骤找到并固定这些组件:首先,取可以取值为1的组件i,并将其固定为1。然后,在组件i不取的[1,3N]的值中,选择最小的,然后将唯一能够采用该值的组件j固定为相同的值。以相同的方式继续进行,固定(NH-1)组件。之后,您确定了一组最多3M个元组。您可以生成完整的元组集(通过对剩余的H + 1组件进行详尽搜索),然后对该集进行排序,以获得前M个元组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章