【问题标题】:NP-Hard? Algorithmic complexity of online poker collusion detection?NP难?在线扑克合谋检测的算法复杂度?
【发布时间】:2010-10-21 21:33:35
【问题描述】:

对于一个拥有 1000 万玩家的在线扑克网站,描述合谋检测算法复杂性的最佳方式是什么?

假设(我认为这些假设没有太大区别,因此请随意忽略它们,但只是澄清一下):

  • 该网站有 10,000,000 名注册用户。
  • 这些玩家总共玩了 50 亿手牌。
  • 您获得的唯一信息是该网站的“主手牌历史数据库”,其中包含所有玩家底牌和每手牌的下注动作。
  • 换句话说,您不能走捷径,例如检查 IP 地址、寻找不寻常的抽成/利润模式等等。
  • 假设您有一个函数,当传递一组正好有 N 个(其中 N 介于 2 到 10 个)玩家时,如果该组中的所有玩家都串通在一起,则返回 TRUE。如果部分但不是所有玩家是共谋者,则该函数返回 FALSE。 TRUE 的返回值是(例如)75% 的置信度。

您的工作是列出所有勾结的玩家的详尽列表,以及与他勾结的玩家的完整列表。我最近听说这个问题被描述为 NP 难,但这准确吗?有时我们称仅是“难”的事物为“NP”或“NP-hard”。

谢谢!

【问题讨论】:

  • 我没有答案(还没有?),但还有另一个问题。 :) 如果我调用 haveColluded("Bob", "Jane", "Mary"),并且: 1. Bob 与手上的 Jane 勾结 1. 2. Bob 与手上的 Mary 勾结 2. 3. Jane 与手上的 Mary 勾结3.(假设这些是唯一玩过的游戏)它会返回什么?
  • 在这种情况下,假设 Bob、Jane 和 Mary 坐在同一张桌子旁,该函数返回 TRUE。您已经确定了一个 3 人共谋组,并且该组中的每个玩家都不需要在您正在查看的手牌子集期间处于活跃状态。当然,HaveColluded 有点“神奇”,但我觉得有必要限制这个问题。如果可以简化事情,请随意在此处提出您自己对 HaveColluded 的定义! :-)
  • @Coding the Wheel:如果有人问过这个问题,我会告诉他们问你。 :)
  • 自从您的帖子以来,我一直在阅读该主题,因为我从未在赌场玩过在线扑克甚至真正的扑克,我不知道从下面的 haveColluded 方法从哪里开始,但我会说研究 David Sklansky 和 ​​Mason Malmuth 的作品,因为他们在我研究这个话题时不断出现。
  • 你应该清理数据集并将其发布到某个地方,然后将其转变为 stackoverflow 编码挑战。 ;)

标签: algorithm complexity-theory poker np-hard


【解决方案1】:

我会将其分为两个步骤:

  1. 迭代超过 50 亿手牌,检查每手牌的打法。在每只手上使用一些算法,我们称之为算法A。随着您的进行,您将构建一个共谋图,其中顶点代表玩家,无向加权边代表两个玩家之间共谋的一些置信度。当算法 A 因怀疑玩家 X 与玩家 Y 勾结而触发时,会在勾结图中的加权边 XY 上添加一些值。随着您在已经玩过的手牌中前进,边缘权重会随着时间的推移而累积。当达到某个阈值时,边缘表示 X 和 Y 之间的勾结。

  2. 那么判断N个玩家顶点列表是否所有串通在一起的函数就是验证包含N个顶点的子图是全连接的(意味着每个节点都有一条边权重大于子图中每个其他节点的合谋阈值)。 IIRC,确定这是 O(n*lg(n) )。

【讨论】:

    【解决方案2】:

    在您的模型下,您描述的内容应该相当简单。给你一个隐式图(顶点是玩家,边对应于一起玩过游戏)。您想要该图的子图。

    如果合谋函数完全可靠,您只需在图中的每一对顶点上调用它,即可得到子图。

    那个子图可能是相当不连贯的。我希望结果图是断开的或连接非常弱的;通过做一些最小切割,大型连接良好的子图会很快脱落。

    请注意,我们可以限制自己只查看对,因为合谋函数应该遵守(就置信水平而言)Colude(A,B,C)

    构建这个全局合谋函数似乎很难。

    【讨论】:

      【解决方案3】:

      看起来像clique detection,这是 NP 难的。另一方面,这里的集团规模是有限的(10),所以最坏的情况是蛮力是 n^10。

      编辑:这里的关键问题是合谋函数的属性是什么。是否可以通过在两个较小的集合(比如 5 个)玩家上调用该函数来始终检测到 10 个玩家串通在一起?

      【讨论】:

      • 我不相信这是“集团检测问题”。他甚至没有被要求检测给定规模的集团。他被问到是否有多达 10 个节点的图是完全连接的。这是一个相当琐碎的问题。
      • 在我看来,这绝对是集团的问题,而不是“知道 x”,他的决定是“与 x 勾结”。
      • @ceretullis:不。他被要求提供完整的节点列表(在一个巨大的图中),这些节点是具有由haveColluded() 函数确定的属性的子图的成员。这与检查单个大小为 10 的图表的派系完全不同,而且要困难得多。
      • @silky & rafal。如果您能够预先计算勾结在一起的玩家图,让顶点代表玩家,边代表玩家之间的勾结(边权重代表勾结置信度),则该函数确定 N 玩家列表是否具有 所有 串通在一起的问题是确定列表中的顶点是否形成全连接图。
      • @silky & rafal。我正在想象一次迭代 50 亿手牌,检查每场比赛。如果在手牌期间,玩家 X 做了一些统计上不太可能有利于玩家 Y 的事情,则将一个小值添加到边 XY(无向边)的权重中。您只需要查看单个游戏,让权重随着时间的推移而累积。如果超出某个“可能”阈值,则 X 和 Y 被视为共谋。
      【解决方案4】:

      我立即看到的蛮力方法是:

      Set colluders = new Set();
      for(Player p1 : allPlayers)
      {
        for(Player p2 : allPlayers)
        {
          if(!p1.equals(p2) && haveColluded(p1, p2))
          {
            colluders.add(p1);
            colluders.add(p2);
          }
        }
      }
      

      我认为使用大于 2 的参数计数调用 haveColluded 没有意义,因为这可能会产生误报。我想虽然这取决于该功能的成本。但是上面的结果是 O(n^2) 调用 haveColluded (n 是玩家的数量)。该函数本身似乎是 O(m),其中 m 是他们一起玩的游戏数。因此,该算法在 O(n^3) 下似乎很好。要成为 NP 难题,您必须证明“当且仅当存在一个 NP 完全问题 L 是多项式时间图灵可简化为 H [...] 时,问题 H 是 NP 难题 [...] 换句话说,L 可以由具有 H 的预言机的预言机在多项式时间内求解。” (http://en.wikipedia.org/wiki/NP-hard)。我研究过 NP 完全问题(例如 3-SAT、旅行推销员问题等),但我不知道您将如何证明这一点。但话又说回来,它看起来确实与clique problem 非常相似。

      【讨论】:

      • 感谢您提供的信息丰富的回答。我也看不出你如何“证明”它是 NP 难的,但它与 NP 难的问题有着可疑的相似之处。当然,拥有“haveColluded”功能可以简化事情。 IRL 这个问题(如果你问我的话)很难解决,除非有明显的共谋(即 6 名玩家从同一个 IP 登录或类似的情况)。
      • 这取决于haveColluded() 函数的属性。或许只有在全部 10 个玩家上调用函数才能检测到 10 个玩家串通一气。如果是这样的话,问题就难多了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多