【发布时间】:2020-12-09 03:27:41
【问题描述】:
我有 N 个实体,我想为这些实体找到大小为 3 的所有组合。组合的数量如此之大,以至于实际上不可能计算出所有的组合。所以我将使用启发式方法:每个实体的分数等于(number of times this entity was used in a combination with the combination score >= threshold) / (number of times this entity was used in a combination),我想找到一个具有combination score >= threshold 概率很高的组合。 (如果您能找到得分最高的组合或可以证明得分处于某个最高百分位,则可获得奖励积分。)
请注意,如果不提供该问题背后的大量背景信息,很难描述如何计算组合得分,但可以说它难以预测且计算速度不快。
由于这是一个持续的过程,我想要一个数据结构,我可以在其中存储我尝试的每个组合,以便下次我可以跳过它们。这种数据结构还应该有助于找到我尚未尝试过的潜在高分组合。
这样做的直接方法是:
sorted_entities = sorted(entities, key=lambda entity: entity.score, reverse=True)
for e1 in sorted_entities:
for e2 in sorted_entities:
for e3 in sorted_entities:
if not data_structure.already_have(e1, e2, e3):
data_structure.add(e1, e2, e3)
return (e1, e2, e3)
几个明显的问题:
- 在寻找新的组合之前,我们正在查看我们已经查看过的所有高分组合。
- 根据我们的评分函数,不能保证得分最高的实体会产生最高得分的组合。
我能想到的另一种方法是概率法:选择一个随机实体,有更多机会选择得分更高的实体。然后根据这两个实体的得分比例选择下一个实体。然后可以在 O(N) 中强制执行最优的第三选择。 (我认为这听起来很像贝叶斯优化,所以这可能是这种方法的最佳版本。)
【问题讨论】:
-
什么是“组合分数”,它是如何计算的?
-
@btilly 这就是这部分要解决的问题:“如果不给出这个问题背后的大量背景,就很难描述评分函数,但可以说它很难预测,而且计算速度也不快。”我将对其进行编辑,以使其更清楚地表明它是在谈论计算组合得分。
-
正确的算法将完全取决于评分函数。我个人会根据元素似乎有助于得分超过一系列阈值来建议某种“评级功能”。然后运行一堆实验,找出什么效果好。