我设计的应用程序可以帮助用户通过组建最好的团队来创建游戏。
例如,假设有30人在投票中等待打篮球。一场篮球比赛由10名球员(5对5)进行。 在等待挑选的30个人中,算法选择5对5的最佳组合来互相对抗。
(为此,该算法会寻找最大抽签概率的玩家组合。这是通过使用表征每个玩家的两个量词来计算的:玩家的平均技能,以及猜测的置信因子评级。)
我想看看这个算法的速度有多快。
需要经历所有可能的球员组合。那么在这种情况下,组合的总数是C(30,10)对吧?
我们可以说算法是O(n!),n是等待玩的玩家总数吗?
这个问题NP完全吗?如果是这样,任何人都可以给我一个简短的方法来解释为什么它是NP完全的(不是完整的证据,只需一个有效的推理即可。)
非常感谢! :)
答案 0 :(得分:2)
不清楚平均技能和置信因子应该如何组合,但最有可能的是,在n
和k
中找到多项式解决方案(玩家数量和数量)每队的球员数量与证明P = NP一样难。
我的直觉是基于Subset Sum Problem是NP-Hard的事实,而且当前的问题似乎比它更难。
在我们的情况下,即使是一个忽略置信因子的简单方法,并且只是总结玩家技能以获得团队力量(1),它似乎是NP-Complete。
这是因为即使我们修复一个团队,即知道目标总和,它的NP很难确定是否有另一个团队具有相同的分数(2)。此外,回答问题"是否有一个平等的团队?"比回答"这个团队的最佳匹配更容易?"。
此外,在所有团队中找到最佳匹配可能比找到一个团队固定的最佳匹配更难,因此这将直观地证明给定问题比子集和问题更难。
说明:
(1)以任何方式考虑置信因素都不太可能简化问题(因为在特殊情况下,当它们完全相同时,我们仍会遇到无关紧要因素的情况)。 / p>
(2)在子集和问题中,没有假设子集大小。但是,如果有一个已知的多项式时间算法可以找到任何给定大小的多项式时间和0的子集,我们可以将它应用于每个可能的大小,这将导致任意大小的多项式算法(这将证明P = NP)。
(3)sum = 0约束中的值0不是必需的。它可以是任意值。 例如因为我们修正了大小,我们可以简单地从所有元素中减去一个等于targetSum / size的值,现在我们将搜索一个和0的子集。
关于其他问题:
所以在这种情况下,组合的总数是C(30,10)对吗?
不,它实际上是C(30,5)* C(25,5)/ 2,因为我们首先需要为第一支球队挑选5名球员,然后从剩下的球员中挑选5名球员第二队。执行除法是因为否则每对将被计算两次,我们可能不希望区分各队。
我们可以说算法是O(n!),其中n是总数 等待比赛的球员?
强力枚举的复杂性为O(n ^ 2k /(k!* k!)),其中n是玩家总数,k是团队规模。因此,对于小k
,它是可以的。如果我们将n
和k
都视为变量,则该方法是NP完整的。
复杂性就是这样,因为组合的公式如下:
C(n,k)= n *(n - 1)* .. *(n - k + 1)/(1 * 2 * .. * k),
根据前一点,有C(n,k)* C(n - k,k)/ 2种可能性。