【问题标题】:probability maximize expectation概率最大化期望
【发布时间】:2020-08-17 19:33:11
【问题描述】:

给定 3n 个人,第 i 个人可以通过概率 p_i 的测试,现在你需要将他们分成 n 组,每组有 3 个人。如果至少有两个人通过测试,则一组得分为 1,否则为 0。为了使总分期望值最大化,如何分组?

我已经考虑过这个问题了,直觉上我认为将两个大的 p_i 和一个小的 p_i 组合在一起是有意义的。另外,我考虑过在最佳安排中,交换来自不同组的任何两个 p_i 应该会降低期望。当交换两个学生时,我可以在数学上写出期望的差异,但似乎没有给出任何明显的结果。我碰壁了。

【问题讨论】:

  • m人可以通过测试,那么最高分是floor(m/2)对吗?只需从这组中取出一对人,然后从另一组中添加一个。一旦集合用完,就可以任意创建三元组。
  • 你是什么意思?
  • 有趣的问题,但我认为它更适合 math.stackexchange.com 或 cs.stackexchange.com。
  • @kireetpanuganti 第一组包括那些可以通过测试的人,另一组是那些不能通过测试的人。

标签: algorithm probability


【解决方案1】:

有趣的问题。我觉得很难,因为 3 往往是 NP 硬度的魔数,而且我看不到任何凸结构。

我可以建议以下大社区本地搜索策略。如果我们只是试图将配对与单打配对以形成三人一组,那么最佳策略是根据他们恰好通过一次的可能性对配对进行排序,根据他们通过的可能性对单打排序,然后匹配他们相应地。要进行局部搜索,首先形成初始组,然后将每个组重复地随机均匀地分成一对和一个,然后如上所述进行最优重新匹配。

一些非常粗糙的 Python:

import random


def quality(groups):
    return sum(a * b + a * c + b * c - 2 * a * b * c for [a, b, c] in groups)


def main():
    n = 10
    groups = [[random.random() for j in range(3)] for i in range(n)]
    print(groups)
    print(quality(groups))
    for k in range(1000):
        choices = [random.randrange(3) for i in range(n)]
        pairs = [[group[j - 1], group[j - 2]] for (group, j) in zip(groups, choices)]
        pairs.sort(key=lambda pair: pair[0] + pair[1] - 2 * pair[0] * pair[1])
        singles = [group[j] for (group, j) in zip(groups, choices)]
        singles.sort()
        groups = [pair + [single] for (pair, single) in zip(pairs, singles)]
        print(quality(groups))
    print(groups)


main()

【讨论】:

  • 非常感谢您的回复!我有点好奇,如果 3 会让它变得太难,那么如果你只是将它们放入 2 对而不是 3 组,而不是至少 2 次通过,那么解决方案是什么?至少 1 次通过。
  • @kireetpanuganti 我不肯定 3 很难,但 2 似乎很容易——这相当于通过两次通过最小化预期组数。我认为这意味着对候选人进行排序,然后将最佳和最差、次佳和次差等配对,但我还没有写下代数来确定。
  • 当然,如果所有其他方法都失败了,我们可以拿出大枪,加权一般匹配,它将处理任何类型的跨对添加的评分函数。
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 2013-05-23
  • 2021-05-03
  • 1970-01-01
  • 2021-05-31
  • 2013-12-09
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多