Algorithm 将玩家分为;优胜者“;及;失败者:如何证明贪婪解给出最优结果?

Algorithm 将玩家分为;优胜者“;及;失败者:如何证明贪婪解给出最优结果?,algorithm,greedy,proof,proof-of-correctness,Algorithm,Greedy,Proof,Proof Of Correctness,我有一个问题,说明如下: n个玩家(其中n为偶数)将进行一场相互对抗的游戏。每个人都不一定玩,但一个玩家只能和其他人玩一次。如果两个人决定互相比赛,我们就有一个输家和一个赢家。然后我希望将我的n个玩家分成两组大小为n/2的玩家:赢家(W)和输家(L)。我希望我的赢家组中的所有球员从未输过我的输家组中的任何人 这是不可能的,例如,对于4名玩家,游戏p1赢了p2,p2赢了p3,p3赢了p4,p4赢了p1,那么没有办法将玩家划分为W和L。我做了下一个最好的事情,我希望最小化我的错误:W中的玩家输给L中

我有一个问题,说明如下:

n个玩家(其中n为偶数)将进行一场相互对抗的游戏。每个人都不一定玩,但一个玩家只能和其他人玩一次。如果两个人决定互相比赛,我们就有一个输家和一个赢家。然后我希望将我的n个玩家分成两组大小为n/2的玩家:赢家(W)和输家(L)。我希望我的赢家组中的所有球员从未输过我的输家组中的任何人

这是不可能的,例如,对于4名玩家,游戏p1赢了p2,p2赢了p3,p3赢了p4,p4赢了p1,那么没有办法将玩家划分为W和L。我做了下一个最好的事情,我希望最小化我的错误:W中的玩家输给L中的玩家的玩家对数(不互相竞争不是一种损失)


我(想)我找到了一个贪婪的方法来解决这个问题。我只需根据玩家的损失数量对他们进行排序,将损失最少的人放在我的W集中,并将剩余的填入L。我如何证明我的贪婪方法实际上是最优的?我已经做了几个随机测试,我可以证明我的方法会给出一个可行的解决方案,但我没有我不知道如何证明这确实可以最大限度地减少我的错误。

您的贪婪算法不是最佳算法。它失败原因如下:

 W      L
===    ===
 A  vs  x
 B  vs  y
 C  vs  z
 B  vs  A
 C  vs  A
 x  vs  y
最优分区是W=(A,B,C),L=(x,y,z),但是你会把
A
放在失败者集中,因为他有两个失败者


你说你做了一些随机测试。你是如何验证贪婪算法为这些测试产生了正确的结果的?

考虑以下结果:

Winner    Loser
Adam      John
Bob       John
John      Charles
John      David
John      Ernest
John      Frank
John      George
我们统计损失并按升序排序:

Player    Losses
Adam      0
Bob       0
Charles   1
David     1
Ernest    1
Frank     1
George    1
John      2
您的算法按如下方式划分玩家:

Winners    Losers
Adam       Ernest
Bob        Frank
Charles    George
David      John
错误是(查尔斯,约翰)和(戴维,约翰);有两个错误。考虑下面的除法:

Winners    Losers
Adam       David
Bob        Ernest
Charles    Frank
John       George
这种划分没有错误:没有赢家输给输家。这是一种更好的划分,错误更少;因此,如上所述,您的算法不是最优的


你的算法的根本问题在于它只考虑了损失的数量;多产玩家在这个算法中可能比实际情况更糟,因为他们的损失比其他人多,尽管他们可能有更多的胜利。

有趣的问题。如果不确定,请选择一个与可处理的n一样大的值(N=12,也许)并彻底搜索反例。如果你发现了反例(我怀疑你可能会),这将为你节省一些时间和麻烦,不是吗?如果你没有发现,这将激励你进一步寻找证据。啊。你能为我指出正确的CPRECT方法方向吗?事实上,以你的例子来说,B&C损失最少,所以他们最多进入W。下一个位置与X、Y和Z并列。如果你选择Y,那么是一方ion W=(B,C,Y)和L=(A,X,Z)同样有效。经过编辑后,您就不能选择
Y
。但这并不是真的必要,因为“幸运时最佳”与“最佳”并不相同。您的编辑仍然适用于我的方法。最少的赢家是W=(B,C,X)或(B,C,Z)。如果您选择(B,C,Z),我们仍然有一个理想的分区。我同意这看起来令人担忧,但我试图说服自己,我可以任意打破平局。你说的是按输排序,而不是按赢排序。是的,我认为你是一厢情愿的受害者。我认为你的问题很难解决,我没有真正好的方法来解决,所以我希望能帮助你理解为什么要进行测试s未能检测到您的算法不起作用。这可能与这种一厢情愿的想法有关。建议对您的算法进行以下修改可能很有趣:首先按损失数升序,调用上半部分赢家和下半部分输家;然后按赢数降序,调用上半部分wiNNER和下半部分失败者。然后,选择这些分区中误差最小的一个。我不知道这是否是最优的,但它很容易消除Matt和我提供的反例。如果这不是最优的,你甚至可以在堆上扔“最佳击球平均值”。不过,这可能是NP难的。